この記事はM5Stack Advent Calendar 2022の16日目の記事であり、ROS Advent Calendar 2022の16日目の記事でもあります。記事1本で2つのアドベントカレンダーに参加しますので、2本分の濃さにしました。
champ
champは、4脚ロボットを制御できるROSのパッケージ(群)です。このGIFアニメのように、市販されているロボットや研究で有名なロボットを制御できるよう、汎用的に作られています。また、ホビー用ロボットとして販売されているmini pupperもchampで動いています。1
この優れたchampパッケージを自分のロボット上で動かしたく、レゴでロボットを自作しました。2
システム構成
PC
PCでは、Ubuntu20.04上でROS Noeticを動かしています。
M5Stack
M5Stack Grayに、レゴ穴があるM5GO/FIRE バッテリーボトムを取り付けています。Grayはたまたま手元にあったので使っただけで、M5Stackなら何でも良いです。
Servo Driver
サーボドライバはM5Stack用Servo2モジュール - 16チャンネル サーボドライバを使用しています。
#m5stack のサーボモジュールで12個のサーボが動いた。こんなにコンパクトにまとまるなんて。
— nisshan_ にっしゃん (@nisshan_) May 4, 2021
Module SERVO literally drives 12 servo motors. Powerful but compact. pic.twitter.com/gNv6pOmBrh
M5Stack周りの配線
電源
ロボットの電源は、2セルのLiPoバッテリーをサーボモジュールに挿して供給しています。サーボモジュールに外部から電源供給すると、5vに降圧してM5Stack本体に供給してくれます。ドライバのコネクタはXT60、このバッテリーはXT30なので、コネクタの大きさを変換して繋いでいます。
サーボ
Geekservoのサーボを12個使っています。これを使っている理由は、小さく安価でありレゴ互換であることです。反面、2kgf.cmしかトルクが出ません。ギアも金属ではなく樹脂製なので、強度や耐久性を求めず「趣味の範囲」と割り切ってで利用しています(壊れたら買い替えれば良い)。
なお余談ですが、Geekservo製品は型番がなく識別する方法がないので「グレーの、直方体のやつ」で覚えてます。
M5Stack上のrosコード
ros_serialのサンプルをベースに、サーボの制御指示値を受信する部分を書いています。M5Stackでsubscribeするトピック名は/joint_group_position_controller/command
です。champ_controllerノードから制御指示値としてpublishされます。
サーボドライバに角度を指示するコードも、M5Stackのサンプルをそのまま使っています。
工夫した点、苦労した点
champのパッケージを起動すればサーボをよしなに動かしてれますので、システムを構築することは簡単なのです。しかし、やっぱり4脚ロボットならではの苦労が沢山ありましたので、書いて供養したい共有したいと思います。
① メカデザイン
初期のデザインは、Spot Microを真似て足にサーボを埋め込んだものでした。
At long last LEGO quadruped robot walked. It’s just toddling, but moving forward.
— nisshan_ にっしゃん (@nisshan_) August 2, 2021
よちよち歩きだけど、やっと歩いた。 pic.twitter.com/goe5he8EbZ
このメカデザインのようにそれぞれの足に重いサーボが2個もあると、ブンブンと足を振るたびに大きな慣性モーメントが発生して、胴体が揺れてしまいます。これを解決するためには足を軽くするしかありません。具体的にはmini pupperのメカ構造を真似て、胴体に全てのサーボを格納しました。
よーし、いい子だ。 pic.twitter.com/RCor5UhWgG
— nisshan_ にっしゃん (@nisshan_) October 30, 2022
動画:テストの様子3
なお、レゴの挿し込みが抜けると困る部分には、ボルトとナットで固定しています。この固定方法が取れない部分は諦めて、「抜けたら挿す」という運用でカバーしています。
レゴの3Dモデルを使ったROS URDFの作成
ROS2で表示できるレゴ3Dモデルを作る方法に書きました。レゴでROS対応ロボットを作る際には参考になると思います。
② champ_setup_assistant
作った4脚ロボットに合うようchampをコンフィギュレーションする必要がありますが、そのツールがchamp_setup_assistantとして用意されています。
使い方はリポジトリに書かれていますが、簡単に解説すると以下のようになります。
- ROSで表示できるURDF用の3Dモデルを用意します。具体的には↑の記事を参照。
- ROSで表示できるURDFを作ります。ゼロから書くのは大変ですので、champ/champ_description/urdf/champ.urdf.xacroを改変するのが早いです。
- xacroを書きます
- ターミナルで
./gen_urdf
を実行し、xacroをurdfに変換します
- champ_setup_assistantを
roslaunch champ_setup_assistant setup_assistant.launch
で起動します。- urdfを読み込みます
- Gait Configurationタブで数値を調整します。関節の向き (>>型や><型)、最高速度、足を上げる高さ、重心の調整など設定します。ここの数値は後で直接書き換えもできます。
- Generate Config Packageで出力します。
出来上がったConfig Packageの中のlaunchファイルを起動すれば、ロボットを制御できます。
③ サーボ角度のキャリブレーション
サーボの出力角度が正確であることが、ロボット制御には必須です。指示した角度とサーボの出力角度が一致している必要があります。このGeekservoはPWM制御であり、12個のばらつきがかなり大きいです。そのため、以下の手順でキャリブレーションしました。
- 関節角度が目的の角度(0度、45度、90度のように使いたい範囲)になるまでサーボを動かし、指示値を記録します。
- 単回帰分析により、各サーボごとに補正用の一次関数を得ます。
単回帰分析はグーグルスプレッドシートの「トレンドライン」表示すれば簡単に出ます。決定係数R2の値をチェックし、低い場合はデータを取り直すようにしました。
やっとツール作りが終わった。
— nisshan_ にっしゃん (@nisshan_) May 3, 2022
(サーボ角度のキャリブレーションツールアプリ) pic.twitter.com/TNLPrWJCg2
④ サーボの改造
Geekservoのギアには、過大な力がかかることによるギア破損を防止するためにクラッチ機構が入っています。
保護のためには良い仕組みなのですが、ぐっと力を入れて踏ん張ってほしいときにクラッチが働いてしまい、関節の角度を保持できないことがありました。なので、このクラッチをボンドで固めてしまって、固定しました。
また、もう1つ固定したい理由があります。それは、↑でせっかく角度のキャリブレーションしてもクラッチが効くとずれてしまう、ということです。
接着剤で固めてしまいました。これを12個分やりました。
⑤ 重心の調整
champのconfig/gait/gait.yaml
内のcom_x_translation
の値によって、X方向(前後方向)の重心を調整できます。サーボやフレームはシンメトリーに配置できても、搭載したセンサーやバッテリーをすべて中心には置けませんので、この変数で調整できるのはありがたいです。
なお、この自作ロボットは何も搭載していない状態なので、無調整で大丈夫でした。
完成
動画
4本足で歩くロボットを作りました。
— nisshan_ にっしゃん (@nisshan_) October 31, 2022
Lego Compatible Quadruped Robot https://t.co/o9JNLtx91l#レゴ互換 #lego #M5Stack #ROS #champ #minipupper
M5Stackの画面には全知全能のコンピュータが考えているような幾何学模様が表示されていますが、これはただランダムに正方形を表示しているだけですw
今後
- 安価なPWMサーボの次は、シリアルサーボを使ったロボットを作りたい。
- 歩行の制御の実現を既成のパッケージに頼らず、自作したい。
参考
- ROSのrosserialを使って、M5stackとwifi通信でLチカする by nnn112358さん