苦行記録

マイクロマウス関連の不定期な日記みたいなものです

Webotsでマイクロマウスをシミュレーションする

この記事はMicro Mouse Advent Calendar 2021の7日目の記事です。

昨日の記事は、PIDreamさんの「真上から迷路を撮影しよう」でした。

真上から撮影するととても見やすくていいですね。

デバッグ用途にも大活躍しそうです。

 

はじめに

さて、日々のマウス開発で次のようなことを考えたことはないでしょうか。

・実機を動かす環境がない(まさか迷路を持ち運ぶ人はいませんよね?)

・補正やアルゴリズムを検証したいが実機を動かす気力がない

・色々な迷路を走らせてタイムや動きを知りたい/モチベーションを上げたい

半導体不足の影響で部品が手に入らず実機が作れなくて暇

Webotsでは3Dモデルや実機のセンサデータ等をもとにロボットをシミュレーションすることが可能です。そこで、本記事ではWebotsを用いたマイクロマウスシミュレータの大まかな作成手順を(細かく書くととんでもない文章量になるため大きく省略して)説明したいと思います。ただ、それだけだとふーんで終わりそうなので、作成したシミュレーションモデルを配布します。適当に動かしたりモデルを置き換えて遊ぼう。

 

Webotsの紹介

f:id:nout:20211206085442p:plain

Webots User Guideより

 WebotsはCyberbotics社が公開しているオープンソースのロボットシミュレータです。物理演算にはODE(Open Dynamics Engine)を用いたもので、Gazeboに似たようなソフトです。特徴としては、

C/C++/Java/Python/MATLABでコントローラを書くことが可能

・OSはWindows/macOS/Linuxに対応

・ROS連携あり

・ネット上に情報があまりない

ゲーム機Windowsで簡単に動かせるのは嬉しいですね。

ネット上に情報があまりないことについては、HPにドキュメント(英語)がまとまっているのでそれを読めば苦労することは特にはないと思います。

 

シミュレーションモデルの作成

<CADでの操作>

(Webotsの仕様ではY軸が高さ方向、モデル単位はm)

①ホイールやタイヤがない機体のモデル(ボディ)を作成して.stlか.objで出力

②ホイールとタイヤのモデルをそれぞれ.stlか.objで出力

③以下をCAD上で確認

・ホイールとタイヤを付けたモデルの質量, 重心, 慣性モーメント

・ホイールとタイヤがないモデルの質量

・ホイールとタイヤのモデルのそれぞれの質量

 

<Webotsでの操作>

①Robotノードを追加し、モデルを読み込んでいい感じに追加する

②ホイールやタイヤはHingeJointノードを追加してそこに追加する

③physicsを設定する(質量, 重心, 慣性モーメント等)

④boundingObjectをMeshノードやShapeノードを使って設定する

⑤WorldInfoノードのcontactPropertiesを設定する(摩擦等)

⑥各種センサを追加する

⑦適当な迷路を追加する

※URDFやPROTOを用いてモデル作成する方法もありますが今回はGUI上で手動で作成しました。

f:id:nout:20211206172737p:plain

―完―
テスクチャを作成すれば線が引かれた床も簡単に表示できる(右図)

 

実装済み機能

・速度制御

 別でPythonでログ表示をするスクリプトを用意し、Webotsのコントローラからファイル経由で渡すことで下図のような表示も即座にできます。

f:id:nout:20211206175622p:plain

 

・センサシミュレーション

 下図のように、壁からの距離とセンサ値を実機で測定し、DistanceSensorノードのルックアップテーブルに入力することで、センサをシミュレーションすることができます。

f:id:nout:20220101094659j:plain

 

・迷路探索

 自宅ではできないフルサイズ迷路の探索もシミュレータなら可能です。

 

 

実装予定機能

・最短走行

・吸引力シミュレーション

 Propellerノードを用いるとファンの回転の角速度から推力を算出できるらしいので、吸引ファンの羽形状の検討が捗りそうです。

 

配布用シミュレーションモデル

・配布先

 (新)v1.1.0

  モデルが床にめり込みにくく、弾け飛びにくくなりました。

  ・動作周期を16msから8msに変更(プログラムのTIME_STEPも16から8に変更)

  ・摩擦等変更

  ・センサ追加、質量,重心位置,イナーシャ修正

 (古)V1.0.1

  ・質量修正

boundingObjectなどのMeshノードやテクスチャのurlでエラーが出た場合はフォルダ内のprotoフォルダ内のファイルを参照するように設定しなおしてください。

・内容

 上の図にある2つの迷路&私のハーフマウス(20HF-01)のRobotモデルです。コントローラの言語はC++で、motor_speed関数に左右の車輪の回転速度(rad/s)を渡すと動きます。タイヤ半径やトレッド幅はヘッダファイルに記述してあります。ほかに何か気になったことや分からないことがあれば気軽にご連絡下さい。

 

最後に

 去年の学生大会を最後に1年程度マウス活動を完全に休止していましたが、社会に出てから色々あってちょっとだけやる気が出てきたので再開しました。

ようやくリアルでの大会が開催され始めたこのタイミングでシミュレータかと思われた方もいると思いますが、シミュレータはあっても困らないと思います。

シミュレータでもモデルが動いているところを見ると結構モチベーション上がるので、おすすめです。

明日はg2t_さんの「クレートnannouでお絵描き」です。

こちらもシミュレーションに関係がありそうな記事ですね。お楽しみに!