【Unitree Go2】Low Level / High Level制御の切り替えについて

初めに


本記事では、Go2におけるLow Level制御とHigh Level制御の切り替え方法についてご案内します。
最終更新日:25/4/1
(Software Updateにより、本記事の内容が古くなる可能性がございます)


環境


対象機種および環境は以下の通りです。

  • 機種: Go2 R&D(Edu), R&D+(Edu+)(AIR/PROではないもの)
  • Docking Station: ubuntu20 / ROS2 foxy (Orin Nano/NXどちらでも可。外部PCでも可)

1. LOW LEVEL制御とHIGH LEVEL制御の基本概念


1-1. Low Level制御とは
  • 直接的なハードウェア制御
    ロボットの各モーター12個へ直接指令を送り、細かい動作制御を行います。
  • メリット
    高精度な制御が可能で、独自に歩容を作成する際に適しています。
  • 注意点
    一度Low Level制御が開始すると、High Level制御(例:スマホアプリやJoyStickからの指令)は無効化されます。
    なお、公式Docsに記載のあるbasic modeは、Low Level, High Levelどちらのケースでも常に起動しており、sport_modeはLow Level制御時にはOffにする必要があります。
1-2. High Level制御とは
  • 抽象的な制御指令
    速度指令値やユーザーインターフェース(スマホアプリ、JoyStickなど)から、全体の動作を指示します。特にSDKからは、前後方向に ○○ [m/s] , 横方向に ○○ [m/s] 、反時計回りに ○○ [rad/s] と指令を与えることもできます。
  • メリット
    直感的な操作が可能で、Unitreeの高い運動性能を持つ歩容をそのまま使用する際に適しています。
  • 注意点
    High Level制御が有効になるためには、専用のサービス(sport_mode)が正しく起動している必要があります。
    デフォルトでは、Go2起動後に専用サービス(sport_mode)が自動起動し、Go2本体が立ち上がります。

2. 制御切り替え手法

切り替えには、MotionSwitcherClientおよびRobotStateClientの2種類の方法が用意されています。ここでは、各手法について個別に説明します。

2-1. MotionSwitcherClientを用いた切り替え方法
  • 概要
    MotionSwitcherClientのReleaseModeを使用して切り替えを行うことができます。これを用いると、High Level制御を無効にし、Low Level制御への移行の療法を行うことができます。
  • 具体例
    unitree_sdk2 サンプル「go2_stand_example」では、Low Level制御を実行する前にMotionSwitcherClientによるReleaseModeが実施されています。
    以下はサンプルコードの抜粋です。

    std::cout << "Try to deactivate the motion control-related service." << std::endl;
    int32_t ret = msc.ReleaseMode(); 
    if (ret == 0) {
        std::cout << "ReleaseMode succeeded." << std::endl;
    } else {
        std::cout << "ReleaseMode failed. Error code: " << ret << std::endl;
    }

    詳細・ソースコード例:
    unitree_sdk2 サンプル「go2_stand_example」
    Motion Switcherの公式ページ

2-2. RobotStateClientを用いた切り替え方法
  • 概要
    RobotStateClientのServiceSwitchを使用して制御状態の切り替えを行うことができます。これを用いると、High → Low Level制御と、Low → High Level制御への移行することができます。
  • 具体例
    unitree_sdk2 サンプル「go2_robot_state_client」では、まずHigh Level制御を無効にする(=Low Level制御が可能な状態にする)処理が行われ、その後必要に応じてHigh Level制御を再有効化する例が示されています。以下のコード部分が切り替えの役割を担っています。

    ret = rsc.ServiceSwitch(serviceName, 0, status);
    std::cout << "Call ServiceSwitch[" << serviceName << ",0] ret:" << ret 
              << ", cost:" << timer.Stop() << " (us)" << std::endl;
    
    sleep(5);
    timer.Restart();
    
    ret = rsc.ServiceSwitch(serviceName, 1, status);
    std::cout << "Call ServiceSwitch[" << serviceName << ",1] ret:" << ret 
              << ", cost:" << timer.Stop() << " (us)" << std::endl;

    詳細・ソースコード例:
    unitree_sdk2 サンプル「go2_robot_state_client」
    Robot State Clientの公式ページ

2-3. 起動時に Low Level制御にする方法
  • 概要
    MotionSwitcherClientのSetSilentを使用して、Go2起動時に、High Lvel制御の起動をOffにし、すぐにLowLevel制御を行うことができます。
  • ※ この項に対応するサンプルコードがありません。公式Docsをご参照ください。

    詳細・ソースコード例:
    Motion Switcherの公式ページ


3. 両者の相関関係と切り替えの注意点


3-1. basic_serviceとは
  • 共通要件
    Low Level制御、High Level制御どちらにおいても基本サービス(basic_service)の起動が必須です。
3-2. sport_modeとは
  • sport_mode
    High Level制御を有効にするためのサービスです。再利用時は、このモードの起動が不可欠となります。
  • ReleaseMode
    Low Level制御実行前に必ず実施する操作であり、二重指令の発生を防ぎ安全性を確保します。

おわりに

本記事では、Go2におけるLow Level制御とHigh Level制御の切り替え方法について、MotionSwitcherClientおよびRobotStateClientを用いた各手法を詳述しました。
この記事が皆様の開発の一助となれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です