Webotsでマイクロマウスをシミュレーションする
この記事はMicro Mouse Advent Calendar 2021の7日目の記事です。
昨日の記事は、PIDreamさんの「真上から迷路を撮影しよう」でした。
真上から撮影するととても見やすくていいですね。
デバッグ用途にも大活躍しそうです。
はじめに
さて、日々のマウス開発で次のようなことを考えたことはないでしょうか。
・実機を動かす環境がない(まさか迷路を持ち運ぶ人はいませんよね?)
・補正やアルゴリズムを検証したいが実機を動かす気力がない
・色々な迷路を走らせてタイムや動きを知りたい/モチベーションを上げたい
・半導体不足の影響で部品が手に入らず実機が作れなくて暇
Webotsでは3Dモデルや実機のセンサデータ等をもとにロボットをシミュレーションすることが可能です。そこで、本記事ではWebotsを用いたマイクロマウスシミュレータの大まかな作成手順を(細かく書くととんでもない文章量になるため大きく省略して)説明したいと思います。ただ、それだけだとふーんで終わりそうなので、作成したシミュレーションモデルを配布します。適当に動かしたりモデルを置き換えて遊ぼう。
Webotsの紹介
WebotsはCyberbotics社が公開しているオープンソースのロボットシミュレータです。物理演算にはODE(Open Dynamics Engine)を用いたもので、Gazeboに似たようなソフトです。特徴としては、
・C/C++/Java/Python/MATLABでコントローラを書くことが可能
・ROS連携あり
・ネット上に情報があまりない
ゲーム機Windowsで簡単に動かせるのは嬉しいですね。
ネット上に情報があまりないことについては、HPにドキュメント(英語)がまとまっているのでそれを読めば苦労することは特にはないと思います。
シミュレーションモデルの作成
<CADでの操作>
(Webotsの仕様ではY軸が高さ方向、モデル単位はm)
①ホイールやタイヤがない機体のモデル(ボディ)を作成して.stlか.objで出力
②ホイールとタイヤのモデルをそれぞれ.stlか.objで出力
③以下をCAD上で確認
・ホイールとタイヤを付けたモデルの質量, 重心, 慣性モーメント
・ホイールとタイヤがないモデルの質量
・ホイールとタイヤのモデルのそれぞれの質量
<Webotsでの操作>
①Robotノードを追加し、モデルを読み込んでいい感じに追加する
②ホイールやタイヤはHingeJointノードを追加してそこに追加する
③physicsを設定する(質量, 重心, 慣性モーメント等)
④boundingObjectをMeshノードやShapeノードを使って設定する
⑤WorldInfoノードのcontactPropertiesを設定する(摩擦等)
⑥各種センサを追加する
⑦適当な迷路を追加する
※URDFやPROTOを用いてモデル作成する方法もありますが今回はGUI上で手動で作成しました。
実装済み機能
・速度制御
別でPythonでログ表示をするスクリプトを用意し、Webotsのコントローラからファイル経由で渡すことで下図のような表示も即座にできます。
・センサシミュレーション
下図のように、壁からの距離とセンサ値を実機で測定し、DistanceSensorノードのルックアップテーブルに入力することで、センサをシミュレーションすることができます。
・迷路探索
自宅ではできないフルサイズ迷路の探索もシミュレータなら可能です。
実装予定機能
・最短走行
・吸引力シミュレーション
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でお絵描き」です。
こちらもシミュレーションに関係がありそうな記事ですね。お楽しみに!
2020年マイクロマウスハーフ機体紹介
機体名 | 20HF-01 |
全長 | 55 mm |
幅 | 38 mm |
重量 | 約16.5 g |
マイコン | RX631 64pin |
モータ |
6×12 mm(不明) コレ BETAFPV 6x17 mm 25000 KV(吸引) |
エンコーダ | MA-700 |
モータドライバ |
DRV8836 |
IMU | MPU-6000 |
センサ | LTR-4206E+OSI5FU3A11C |
バッテリー | 100mAh 20C 1Cell コレ |
ギア |
kkpmo M0.3 9T DMMmake アクリル(Ultra) M0.3 36T |
<最大パラメータ>
直進速度 | 4 m/s |
斜め直進速度 | 3.5 m/s |
加速度 | 15 /m/s/s |
大回り90度 | 1.5 m/s |
その他ターン速度 | 1.2 m/s |
<3DCAD>
<回路図>
<AW>
特徴
◎吸引力UP
前作では最大で30g程度しか吸引できず,また,吸引スカート自体が下りないことが多々あった.
そこで,吸引力を上げるため,モータを4mm径のものから6mm径のものに変更してより高回転型のものに変更した.
その結果,最大で60g程度吸引でき,十分な吸引力を得ることができた.
◎モータの選定
ハーフでよく使われるモータのDidel MK06-4.5は1Sだとトルクがそこまでなく,吸引機体には向いていないと感じたため,中国通販で同サイズのモータを買い漁って選定した.
自宅の環境で回転数やトルクの計測はできないため,実際にマウスに実装してFF&FBゲインを合わせて走行ログから評価した.
手間も時間もかかったが,まあまあ満足するスペックのモータが手に入り,トルク不足は改善された.
◎センサ配置
前作では発光と受光をセットで横に並べて配置していたが,今作では縦に並べてセンサマウントで保持することでセンサ角度を左右で合わせてセンサを使った制御をしやすくすることを狙った.
が,そもそもセンサの半減角が広いためあまり効果はなく,むしろセンサマウント分の重さによってイナーシャが若干増えた.
でもかっこいいのでOKです.
◎ジャイロ変更
クラシック同様,ハーフもジャイロを従来のものから変更した.
問題なく使えているが,ターン時(特に大回り180度)の最大角速度がこのジャイロのレンジの限界である2000deg/sに近いので次に作ることがあるなら最大レンジ4000deg/sのジャイロを使いたいと思う.
もちろん振動対策で実装方法を工夫したいと思う.
◎プログラムの変更(クラシックと同様)
今作はハードもソフトも今まで動けばOKだった箇所を見直した.
・並進方向と旋回方向にFF制御を導入し,モータに余計なトルクがかからないようにした.
FF制御のゲインは運動方程式から理論的に算出したものではなく,加速度項,速度項,摩擦項のそれぞれをログを取りながら自分で設定した.
コツを掴めばそれっぽくFF制御が可能だが,時間と根気のいる作業なのでどうにか精度良く定数を得る方法を考えたいと思う.
・角度の扱いに関して,今まで相対角度でしか扱っていなかった(旋回する度に角度はリセットしていた)が,リセットをせずに絶対角度で扱うことで前の動作による目標角度と機体角度のズレを考慮した旋回が可能になった.
旋回後の機体角度が壁制御がなくてもほぼ合うことで壁制御が困難な櫛区間などで効果的だった.
おそらくDCマウスでは絶対角度で扱うことが普通であり,多くの人がやっていることだと思う.
・センサ値の線形化を自然対数近似にしてセンサテーブルでROMに持つようにした.
それに伴ってコンパイラをCC-RXからGCC for RXに変更.(CC-RXの無償評価版ではプログラムサイズの制限があったため)
今まで割り込み関数内で多項式近似で逐次計算していたが割り込み時間を超えていたが,テーブル参照にすることでかなり処理時間を抑えられた.
総合評価
今までで一番まともだと思う.
2020年マイクロマウスクラシック機体紹介(試作段階)
後述の問題により試作段階であり,探索すらできないが紹介する.
機体名 | 20CL-02 |
全長 | 74.5 mm |
幅 | 50 mm |
重量 | 約35 g |
マイコン | RX631 100pin |
モータ |
CL-0614×4 Hyperion 7x20 mm 11000 KV(吸引) |
エンコーダ | MA-700 |
モータドライバ |
DRV8835×2 |
IMU | MPU-6000 |
センサ | ST-1KL3A+SFH4550 |
バッテリー | JJRC 150mAh 30C 2Cell コレ |
ギア |
kkpmo M0.3 9T ミスミ M0.3 36T |
<最大パラメータ>
Q.本当にこの速度で走る?
A.知らん(個々では出力の限界スレスレで走る)
直進速度 | 4.5 m/s~ |
斜め直進速度 | 4.5 m/s~ |
加速度 | 23 /m/s/s~ |
SS90 | 2.5 m/s |
SS180 | 2.4 m/s |
SD45 | 2.5 m/s |
DS45 | 2.4 m/s |
SD135 | 2.3 m/s |
DS135 | 2.2 m/s |
V90 | 2.3 m/s |
<3DCAD>(ホイールのスポークの表示がバグっている)
<回路図>
<AW>
特徴
◎駆動モータを4個使用
前作はモータのパワーがあるとはいえ,機体自体が重かったため走行性能が低かった.
そこで,今作では小型・軽量化をすることで走行性能の向上を図った.
先駆者と同じものを作ってもその性能を超すことはできず,ただの劣化版になることは目に見えていたので,今作では駆動モータを合計で4個(片輪あたり2個並列)使用していることがポイントである.
不可を分散することでモータが燃えることを防ぎ,3セルでの駆動が可能になることや,期待してはいないが少しでもトルクが改善されればと考えた.
実際は,トルクに関しては2個と4個で比較をしていないため,4個使用したことによる恩恵を受けられているかは不明だが,前作よりはかなり改善されていることが分かった.
3セルでの駆動については問題なく,走行性能も悪くはなかったが,吸引モータの発熱が耐えられなかったため選定をしなおす必要がある.
ここまでは問題なさそうだが,再現性なく暴走するバグが発生した.
暴走時のログを解析すると角速度や速度は正常に記録されていそうであったが,駆動モータへ送るPWM信号が突然0になり,速度が急に上がっているなど,マイコンが正常に動作していない(まさしく暴走している)ことが判明した.
この現象は直進時,旋回時,超信地旋回時など決まってモータが回転しているときに起こり,当初はコンパイラによる最適化のバグかと考えたが,ハーフでも同じコンパイラ・ほぼ同じプログラムで正常に動いていたことから,モータを並列使用したことによる電源のリップルノイズ増大によるマイコンの誤作動であると結論付けた。
まだ定量的な検証ができていないため,言い切ることはできず,今後の課題とする.
◎ジャイロセンサ変更
ジャイロセンサを今まではMPU-6500を使っており,この機体でも最初は同じものを使用していた.
が,直進で速度2.5 m/s付近以上からジャイロの値が発振し,旋回方向の姿勢制御が十分に行えないことが分かった.
ハズレな個体を引いたと思い,同型番のものに張り替え直すが同じ現象に遭遇し,色々試した結果,ジャイロが載っている基板とモータ含む足回り一式を離すとその現象が起こらなかった.
ジャイロがモータが回転することで足回りの小刻みな振動を拾って発振していると考えられたため,MPU-6500からMPU-6000に変更したところ,そのような現象は起こらなくなった.
おそらく,今までも同様の現象が起こっており,そのために高速域の姿勢制御が乱れていたと考えられる.なぜ気づけなかったのか.
◎センサ配置
前作ではセンサを6個使用していたが45度に取り付けたセンサを一度も使うことがなかったので今作では廃止し,4個にした.
機体が小型になったことで半区画先を見る横センサの角度が鋭くなり,見たい壁や柱のエッジと異なるエッジを見てしまい,壁制御が難しくなった.
壁切れはあまり問題なく見れているが,同様の小型の機体を製作する場合はセンサ配置や角度を気を付けると幸せになれる.
◎吸引モータ変更
前作ではブラシレスモータを吸引ファンに埋め込む形で取り付けていたが,それだと吸引ファンの外形が大きくなることや空気の通り道が狭くなることなどでロスが多く感じられた.
そこで,今作ではモータをブラシモータに変更し,ファン径を小型にして羽の形状を変更した.(3DCAD参照)
前作よりもスカート面積が小さくなったが,2セルのフル回転で400g程度吸うことが可能になった.
もちろんそんなに吸ったらシャフトが変形しかねないので,走行時は5割程度に抑えている.
◎七色に光る
3つの1×1 mmの角型フルカラーLEDを実装しており,ピン数の関係からLEDの点灯・消灯は個別で,色の指定は共有である.
点灯タイミングを変更すれば3個のLEDを別々の色で同時に光らせているように見せることが可能である.
これが本当のゲーミングマウス.(これがやりたかっただけかもしれない)
◎プログラムの変更(ハーフも同様)
今作はハードもソフトも今まで動けばOKだった箇所を見直した.
・並進方向と旋回方向にFF制御を導入し,モータに余計なトルクがかからないようにした.
FF制御のゲインは運動方程式から理論的に算出したものではなく,加速度項,速度項,摩擦項のそれぞれをログを取りながら自分で設定した.
コツを掴めばそれっぽくFF制御が可能だが,時間と根気のいる作業なのでどうにか精度良く定数を得る方法を考えたいと思う.
・角度の扱いに関して,今まで相対角度でしか扱っていなかった(旋回する度に角度はリセットしていた)が,リセットをせずに絶対角度で扱うことで前の動作による目標角度と機体角度のズレを考慮した旋回が可能になった.
旋回後の機体角度が壁制御がなくてもほぼ合うことで壁制御が困難な櫛区間などで効果的だった.
おそらくDCマウスでは絶対角度で扱うことが普通であり,多くの人がやっていることだと思う.
・センサ値の線形化を自然対数近似にしてセンサテーブルでROMに持つようにした.
それに伴ってコンパイラをCC-RXからGCC for RXに変更.(CC-RXの無償評価版ではプログラムサイズの制限があったため)
今まで割り込み関数内で多項式近似で逐次計算していたが割り込み時間を超えていたが,テーブル参照にすることでかなり処理時間を抑えられた.
総合評価
見た目と走行性能は悪くないが致命的な問題があるのでNG.回路の見直しが必要.
2019年マイクロマウスクラシック機体紹介
この記事はMicro Mouse Advent Calendar 2019の15日目の記事です。
昨日の記事はそらさんの「2019年の振り返り」でした。
そらさんは全日本で車検終了直前にマシンを置きに行くというやらかしがあったようですが、マシンを置き忘れて車検終了後にアナウンスで呼び出されて慌てて置きに行った人がいたらしいですよ!
一体誰なんだ...
以下、本題。
今年製作した機体について紹介します。
MAXパラメータは公開しま......せん!
今年度機体の「Tyrant」です。
<第一形態>
<第二形態>
<最終形態>
機体名 | Tyrant |
全長 | 100mm |
幅 | 67mm |
重量 | 107g |
マイコン | RX631 100pin |
モータ |
Faulhaber 1717T003SR HK-AP03 4000KV(吸引) |
エンコーダ | IEH2-512 |
モータドライバ |
TB6614FNG CT-7A(吸引) |
IMU | MPU-6500 |
センサ | ST-1KL3A+SFH4550 |
バッテリー | Turnigy nano-tech 200mAh 2Cell |
ギア |
kkpmo M0.3 20T ミスミ M0.3 69T |
<回路図>
<AW>
今年の2月に完成した、3作目のクラシックマウス。
前作は吸引力が足りておらずターン速度に限界が見られたので、今作では吸引モータにブラシレスモータを採用し、吸引力とターン速度の向上を図った。
その結果、安定性はイマイチながら、最短走行時の全てのターン速度を大幅に上げることに成功。
セーフティをリリースすることで全ターン2.0m/s以上での走行が可能となり、部室迷路ではそれなりに走っていたが、全日本では機体が応えてくれず、幻の機能となった。
続きを読む