目次
初めに
本記事では、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を用いた各手法を詳述しました。
この記事が皆様の開発の一助となれば幸いです。