PhysicalAIへの第一歩。Unitree GO2 Proでの開発方法を探る!~その2~
最近注目を集める「Physical AI」。
リアルなロボットとAIを組み合わせて、動き・知能・環境応答を統合的に扱うこの領域は、まさに次世代のものづくりのフロンティアです。
このシリーズでは、開発が不可能なAirやProといった低価格モデルで、開発や制御をできる方法がないかを調べていきます。
前回は、Unitree GO2 アプリケーション内のビジュアルプログラミングをご紹介しましたが、今回はハード的に制御するSBUSをご紹介します。
注意事項
SBUSの制御は、正規の方法ではないためGO2が予期せぬ動作をする可能性が高いです。
非常停止ボタンなど物理的に止める手段もないため、検証される場合は、広い場所で実験を行うなど安全には気を付けてください。

SBUS
SBUSとは
ラジコンのサーボやセンサーを制御するためのシリアル通信規格です。
複数のサーボを一本の信号線で制御できるため、配線が簡略化できるのが特徴です。
Unitree GO2利用時の注意
SBUSを利用する場合、制御情報は送信できますが、GO2から各種情報を受け取ることはできません。
また、スマホ用アプリのコントローラーから利用可能なアクションをすべて実行することはできません。実行可能なアクションに制限があります。
SBUS端子の場所は?
SBUS端子は、GO2の背中部分の取っ手のネジを外した下に設置されています。

中を開けると写真のようになります。
SBUS端子は、左からNC/ GND / SBUSとなっており、GNDとSBUSの2本あれば制御可能です。

SBUS制御のサンプルを動かしてみる
すでに簡単なサンプルが作られている方がおり、これを利用すると外部のコントローラーから制御することが可能です。
Unitree_GO2_SBUSで指定されている情報を利用すると以下のような配線図となります。
注意事項
github上でSBUSとの接続は「3P 1.25mm Picoblade」と記載されていますが、実際には「GH 1.25 3P」ですのでご注意ください。

GO2に繋ぐとこの写真のような感じです。
電源もGO2からとるとスッキリします。

こちらはXBOXのコントローラーで動かしたデモ動画です。
危険なので恐る恐るの実行。。
安全策なのか、立つ、座る等の動作を行うとGO2がロック状態になります。
動かす場合は、ロック解除の操作(XBOXコントローラーではスタートボタン)が必要となります。
プログラムの説明
SBUS用のライブラリを活用すること簡単に制御ができるようになります。
#include "sbus.h"
bfs::SbusData data;
bfs::SbusTx sbus_tx(&Serial0, D7, D6, true);
sbus_tx.Begin(); //UARTの初期化
//SBUS経由で送信するデータの作成
data.ch[0] = my_data.Rx;
data.ch[1] = my_data.Ry;
data.ch[2] = my_data.Ly;
data.ch[3] = my_data.Lx;
data.ch[4] = my_data.CH5; // CH5 default
data.ch[5] = my_data.CH6; // CH6
data.ch[6] = my_data.CH7; // CH7
data.ch[7] = my_data.CH8; // CH8
data.ch[8] = 1690;
data.ch[9] = 154;
sbus_tx.data(data); //データの登録
sbus_tx.Write(); //データの送信SbusDataにGO2で決められたパラメータを設定し、Sbus_txを利用してパラメータを送信するだけ。
ch0~4には、移動や動作に関するパラメータ
ch4~7には、アクションに関するパラメータが設定されます。
各種パラメータの詳細は、theroboversをご覧ください。
以下は、ロック解除のアクションを行うコードの例です。
初期状態のパラメータを送信
実行したい動作のパラメータを送信
初期状態のパラメータを送信
これらのパラメータを順番に送ることで、指定のアクションを実行することができます。
移動に関しては、ch0~4に移動に関するデータを設定して、GO2に送信すれば動作します。
CH5_STATE = MODE1;
CH7_STATE = _LOW;
tx_data.CH5 = CH5_STATE;
tx_data.CH7 = CH7_STATE;
writeSBUS(tx_data);
delayMicroseconds(600);
CH5_STATE = MODE1;
CH7_STATE = _HIGH;
tx_data.CH5 = CH5_STATE;
tx_data.CH7 = CH7_STATE;
writeSBUS(tx_data);
delayMicroseconds(600);
CH5_STATE = MODE1;
CH7_STATE = _LOW;
tx_data.CH5 = CH5_STATE;
tx_data.CH7 = CH7_STATE;
writeSBUS(tx_data);
delayMicroseconds(600);おまけ
ローカルでLLMが動作するM5StackのLLM Moduleが手元にあったので、連携させてみました。

仕組みは、ほぼLLM Moduleのサンプルのまま利用しています。
ウェイクワードで、音声入力を行い、Wispperでテキスト化、LLMで犬の動作に変換させて制御を行っていました。

実際の動作
言葉を認識して伏せます。
LLMの性能面などで、できることはかなり限られていますが、単独で動作するので夢は広がります。
まとめ
SBUSを利用した制御方法をご紹介しました。
Go2からの情報を受け取ることができないため、単独での自立制御は難しいと思いますが、LoRAを経由した長距離での制御など使い方を特定すれば面白いことはできそうです。
そもそもハードを触れるのは浪漫があって良いですね。
著者 : 田中 雅也 (痛快株式会社)
痛快師として日夜よくわからない活動をしています。
痛快技術株式会社について
痛快技術株式会社 : https://www.tsu-x.com/
当社は、技術の力で社会の問題を解決することを目的として設立されました。私たちは、技術の楽しさを広め、社会のニーズに合わせた製品を開発し、幸せな未来を実現することを使命としています。
