LoginSignup
15
2

More than 1 year has passed since last update.

M5Stack+ROSで4脚ロボットを作る

Last updated at Posted at 2022-12-15

この記事はM5Stack Advent Calendar 2022の16日目の記事であり、ROS Advent Calendar 2022の16日目の記事でもあります。記事1本で2つのアドベントカレンダーに参加しますので、2本分の濃さにしました。

champ

champは、4脚ロボットを制御できるROSのパッケージ(群)です。このGIFアニメのように、市販されているロボットや研究で有名なロボットを制御できるよう、汎用的に作られています。また、ホビー用ロボットとして販売されているmini pupperもchampで動いています。1

robots.gif

この優れたchampパッケージを自分のロボット上で動かしたく、レゴでロボットを自作しました。2

システム構成

スクリーンショット 2022-12-04 14.52.44.png

PC

PCでは、Ubuntu20.04上でROS Noeticを動かしています。

M5Stack

M5Stack Grayに、レゴ穴があるM5GO/FIRE バッテリーボトムを取り付けています。Grayはたまたま手元にあったので使っただけで、M5Stackなら何でも良いです。

Servo Driver

サーボドライバはM5Stack用Servo2モジュール - 16チャンネル サーボドライバを使用しています。

M5Stack周りの配線

IMG_3719.jpg

電源

ロボットの電源は、2セルのLiPoバッテリーをサーボモジュールに挿して供給しています。サーボモジュールに外部から電源供給すると、5vに降圧してM5Stack本体に供給してくれます。ドライバのコネクタはXT60、このバッテリーはXT30なので、コネクタの大きさを変換して繋いでいます。

サーボ

Geekservoのサーボを12個使っています。これを使っている理由は、小さく安価でありレゴ互換であることです。反面、2kgf.cmしかトルクが出ません。ギアも金属ではなく樹脂製なので、強度や耐久性を求めず「趣味の範囲」と割り切ってで利用しています(壊れたら買い替えれば良い)。

なお余談ですが、Geekservo製品は型番がなく識別する方法がないので「グレーの、直方体のやつ」で覚えてます。

FgZ1JRGagAAP1PG.jpg

M5Stack上のrosコード

ros_serialのサンプルをベースに、サーボの制御指示値を受信する部分を書いています。M5Stackでsubscribeするトピック名は/joint_group_position_controller/commandです。champ_controllerノードから制御指示値としてpublishされます。

サーボドライバに角度を指示するコードも、M5Stackのサンプルをそのまま使っています。

工夫した点、苦労した点

champのパッケージを起動すればサーボをよしなに動かしてれますので、システムを構築することは簡単なのです。しかし、やっぱり4脚ロボットならではの苦労が沢山ありましたので、書いて供養したい共有したいと思います。

① メカデザイン

初期のデザインは、Spot Microを真似て足にサーボを埋め込んだものでした。

このメカデザインのようにそれぞれの足に重いサーボが2個もあると、ブンブンと足を振るたびに大きな慣性モーメントが発生して、胴体が揺れてしまいます。これを解決するためには足を軽くするしかありません。具体的にはmini pupperのメカ構造を真似て、胴体に全てのサーボを格納しました。

動画:テストの様子3

なお、レゴの挿し込みが抜けると困る部分には、ボルトとナットで固定しています。この固定方法が取れない部分は諦めて、「抜けたら挿す」という運用でカバーしています。

レゴの3Dモデルを使ったROS URDFの作成

ROS2で表示できるレゴ3Dモデルを作る方法に書きました。レゴでROS対応ロボットを作る際には参考になると思います。

② champ_setup_assistant

作った4脚ロボットに合うようchampをコンフィギュレーションする必要がありますが、そのツールがchamp_setup_assistantとして用意されています。

setup.png

使い方はリポジトリに書かれていますが、簡単に解説すると以下のようになります。

  1. ROSで表示できるURDF用の3Dモデルを用意します。具体的には↑の記事を参照。
  2. ROSで表示できるURDFを作ります。ゼロから書くのは大変ですので、champ/champ_description/urdf/champ.urdf.xacroを改変するのが早いです。
    1. xacroを書きます
    2. ターミナルで ./gen_urdf を実行し、xacroをurdfに変換します
  3. champ_setup_assistantを roslaunch champ_setup_assistant setup_assistant.launch で起動します。
    1. urdfを読み込みます
    2. Gait Configurationタブで数値を調整します。関節の向き (>>型や><型)、最高速度、足を上げる高さ、重心の調整など設定します。ここの数値は後で直接書き換えもできます。
    3. Generate Config Packageで出力します。

出来上がったConfig Packageの中のlaunchファイルを起動すれば、ロボットを制御できます。

③ サーボ角度のキャリブレーション

サーボの出力角度が正確であることが、ロボット制御には必須です。指示した角度とサーボの出力角度が一致している必要があります。このGeekservoはPWM制御であり、12個のばらつきがかなり大きいです。そのため、以下の手順でキャリブレーションしました。

IMG_3551.jpg

  1. 関節角度が目的の角度(0度、45度、90度のように使いたい範囲)になるまでサーボを動かし、指示値を記録します。
  2. 単回帰分析により、各サーボごとに補正用の一次関数を得ます。

単回帰分析はグーグルスプレッドシートの「トレンドライン」表示すれば簡単に出ます。決定係数R2の値をチェックし、低い場合はデータを取り直すようにしました。

④ サーボの改造

Geekservoのギアには、過大な力がかかることによるギア破損を防止するためにクラッチ機構が入っています。
IMG_0175.JPG
保護のためには良い仕組みなのですが、ぐっと力を入れて踏ん張ってほしいときにクラッチが働いてしまい、関節の角度を保持できないことがありました。なので、このクラッチをボンドで固めてしまって、固定しました。

また、もう1つ固定したい理由があります。それは、↑でせっかく角度のキャリブレーションしてもクラッチが効くとずれてしまう、ということです。

IMG_0177.JPG

接着剤で固めてしまいました。これを12個分やりました。

IMG_0181.JPG

⑤ 重心の調整

champのconfig/gait/gait.yaml内のcom_x_translationの値によって、X方向(前後方向)の重心を調整できます。サーボやフレームはシンメトリーに配置できても、搭載したセンサーやバッテリーをすべて中心には置けませんので、この変数で調整できるのはありがたいです。

なお、この自作ロボットは何も搭載していない状態なので、無調整で大丈夫でした。

完成

IMG_7031.JPG
IMG_7032.JPG
IMG_7026.JPG
IMG_7027.JPG

動画

M5Stackの画面には全知全能のコンピュータが考えているような幾何学模様が表示されていますが、これはただランダムに正方形を表示しているだけですw

今後

  • 安価なPWMサーボの次は、シリアルサーボを使ったロボットを作りたい。
  • 歩行の制御の実現を既成のパッケージに頼らず、自作したい。

参考

  1. mini pupperの動作モードは、「Stanford Pupperのコードでラジコンのように動かす」モードと、「champで制御し、ROSのnavigationができるモード」の2つあります。ここでは後者を指しています。

  2. 正確にはレゴ互換品です。「レゴ規格に合ったもの」という広い意味で使っています。

  3. 動画の足の動きは、実は少し変です。角度の計算を間違っていることが原因なのですが、当時、撮った動画を見て気づきました。

15
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
2