GazeboとSimulinkでロボトレーサをシミュレートする
この記事はMicro Mouse Advent Calendar 2021の22日目の記事です.前日はhmsn_stsさんのKKpmoからギヤが届くまで時間がかかったお話(情報共有) でした.kkpmoでギアを買うときは住所をしっかりと書きたいと思います.
この記事は物理シミュレータGazeboの中にロボトレーサを召喚して,Simulinkをつかって動かすという内容です.シミュレータ内でライントレースをするところまで書きます.
まずはできたもの
以下の動画のように,Gazebo空間上にロボトレーサとコースを出現させ,ライントレースを行う事ができます.動画には映っていませんが,ライントレースの制御はSimulinkで行っています.
なぜ作ろうと思ったか
コースショートカットやその他の賢い制御方法を試したいと思ったとき,実機じゃデバッグがきついと感じました. なぜかというと,ロボトレース競技はコースが床においてあることが大半なので,意外と屈伸運動が多いです.肉体的に結構辛いです. また,ログ保存用ににSDカードを搭載していますが,ロボットから抜いてPCに挿すという簡単な作業も何百回とやるとめんどくさくなってきます.
そこで,実環境と似た環境で動作するロボトレーサがシミュレーションできれば,PCの前から動かずに楽に開発ができます.さらにセンサの値やロボットの真の位置や姿勢など, 現実では目に見えなかったり観測が難しい情報のすべてが簡単に可視化できます.
Gazeboとは?? Simulinkとは??
いきなりGazeboとかSimulinkとかいう言葉を出してしましましたが,ここで一度説明をします. Gazeboとはオープンソースの物理シミュレータです.慣性や摩擦が存在し,現実に近い動きをシミュレーションする事ができます.また,カメラやLiderなどのセンサもシミュレーションすることができます. ROS界隈でよく使われていることでも有名だと思います.割と有名なシミュレータなので,ネットを調べるとたくさんの情報を得ることができます. また,よく知らないのですが,そのままではWindowsで動作はしないと思います(違ってたらすみません).今回はGazeboをWindows上の仮想環境のUbuntu 18.04で動作させます.
Simulinkとは,MATLABでおなじみのMathWorks社がリリースしている,ブロック線図ベースで物理的な現象などをシミュレートできるツールです. 下の動画のようにグラフで簡単にセンサ値などの可視化ができたり, ブロック線図やMATLAB言語で記述したアルゴリズムをC/C++に変換してくれたり便利な機能が色々ついています.有料のソフトウェアですが,マイクロマウスやロボトレース競技に参加している場合はライセンスを無料で得ることができます.
構成
構成図は以下のようになっています.大きく分けてGazebo側とSimulink側に分けることができます.
Gazebo側でIMUとラインセンサの情報をシミュレートし,そのセンサ値をSimulink側が受け取って左右のタイヤのトルクを計算します.
計算したトルクをGazebo側に送信し,ロボトレーサのタイヤが動いてライントレースをします.
実際のロボトレーサは赤外線LEDとフォトトランジスタで白線を検知している方が大半だと思いますが,Gazeboにそのようなセンサはないので画素数を荒くしたカメラで代用しています. 実際のセンサを忠実に再現して動作を確認したいといったニーズには答えられない構成となっています.
動かし方
動作環境
動作環境は以下の通りです.
- OS: Windows10, Ubuntu 18.04(VM)
- メモリ: 32Gbyte
- CPU: Intel i7-9750H 2.60GHz
- GPU: NVIDIA Quadro T2000
- MATLAB: 9.8.0.1538580 (R2020a) Update 6
環境構築
まず、Simulink と Gazebo 間のコシミュレーションの実行が一通り動く環境を用意します.これはMathWorksの公式ドキュメントなので,この通りに作業をすれば動くはずです. また,私の環境ではドキュメント通りUbuntuはバーチャルマシンを使用しましたが、PCのスペックが低いと多分きついのでその場合は別PCにUbuntuをデュアルブートなどで入れて使用すると良いと思います.
次に、Gazebo上で動くロボトレーサのモデルをUbuntuにクローンします.Gitを使えるなら以下のコマンドでOKです.
cd ~/.gazebo/models
git clone https://github.com/shimotoriharuki/robotracer_sdf
Gitってなに??って人は,GitHubのページに行って緑色のCodeボタンからZipファイルをダウンロード,
Ubuntuの.gazebo/models
ディレクトリに展開します.展開したディレクトリの名前はrobotracer_sdf
に変更してください.
最後に、次のコマンドで以下の画像のようなものが立ち上がるかを確認します. 初めて起動する場合は起動までに時間がかかると思います.気長に待ってください.
cd ~/.gazebo/models/robotracer_sdf/world/
gazebo robotrace_world1.world

Simulinkファイルを持ってくる
robotracer_simulation_with_gazeboをMATALBを使う上で都合のいいディレクトリ(Windows側)にクローンします(もしくはダウンロードして展開). これはGazeboとSimulinkで通信してシミュレートする事ができるSimulinkファイルなどが含まれています.
実行
クローンしてきた(もしくはダウンロードした)robotracer_simulation_with_gazebo
の中にあるline_following_demo.slx
を開きます.開くと以下の画像のような画面が現れます.
Gazeboと通信ができるかテストしてみます.UbuntuでGazeboを起動した状態で次の手順を行ってください.
-
以下の画像のように
Gazebo Pacer
ブロックをダブルクリックして、ブロックパラメーター: Gazebo Pacer
画面を開きます -
開いた画面の
Gazeboのネットワークおよびシミュレーション設定の構成
をクリックして、Gazeboシミュレーションの構成
画面を開きます -
開いた画面の
ホスト名/IPアドレス
を設定します.ここの通りのバーチャルマシンでUbuntuを使っているのであれば変更の必要はありませんが、自分で用意したUbuntuを使っている場合はipアドレスを変更する必要があります. -
テスト
ボタンを押して接続が成功すればOKです

もし以下のエラーが出たら、ipアドレスが間違っているかもしれません.ipアドレスがあっているのにエラーが出た場合は、PCを再起動してみてください.
筆者の環境ではよくあったのでそのたびにPCを再起動して対処してました.原因はわかりません.
接続できることを確認したら、クローンしてきた(もしくはダウンロードした)robotracer_simulation_with_gazebo
にあるchange_data_size.mat
をロードします.ダブルクリックしてワークスペースに以下の画像のようなものがあらわれたらOKです.

これはGazebo_SL_Bus_gazebo_msgs_Image
のdata
のDimensions
がデフォルトだと128になっており、
ラインセンサ代わりのカメラのデータサイズと違ってしまっているため、変更した値に書き換えたものをロードしてエラーを回避しています.変更後の値は303で、これは
カメラの横幅×カメラの縦幅×RGBの情報=101×1×3=303
で計算できます.もしGazebo上のカメラの画素数を変更した場合は、これを変更する必要があります.
ここまでできたら,UbuntuでGazeboを起動した状態でSimulinkを実行します.Gazebo上のロボトレーサがゆっくりとライントレースを始めるはずです. Simulinkファイルの詳しい解説は大変なので今はしません(中身を見ればわかると思います).気が向いたら追記するかもしれません.
1つ注意点ですが,シミュレーションの実行は非常に遅いです.これはどうしようもないことらしいです. MATLAB Answerで質問してみましたが,PCのスペックを上げたからといって速くなるわけでもないらしいです.以下のリンクは質問したリンクです.
まとめ
GazeboとSimulinkでロボトレーサのシミュレーションをする例を紹介しました. 実行速度がとても遅いので,コースをガンガン走らせるような使い方は難しいですが,要素要素で使う分には便利だと思います. これを使って賢い動きをさせるアルゴリズムの開発中です.まだまだ時間は掛かりそうですが...
明日はKouhei Itoさんの徒然ネタです.どんなネタなのでしょうか.楽しみです.
thanks
返信削除