スキップしてメイン コンテンツに移動

注目

Simscape Multibodyを使ってフライホイール倒立振子のシミュレーション

  この記事は MATLAB/Simulink Advent Calendar 2021 の22日目の記事です.前日は @shinji00q さんによる Simulinkで始める線形システムのモデル規範適応制御(MRAC) の記事でした. 本記事はSimscape Multibodyでフライホイール倒立振子を倒立させるシミュレーションをする話を書きます. どうやって制御したかはもちろんですが,Simscape Multibodyはこんなときに便利なんだなぁとわかった気がするので,そこらへんもまとめていきたいと思います. 筆者は制御初心者ですので間違いや曖昧な点があるかもしれません.ご了承ください. あくまでも制御初心者がSimscape Multibodyという便利なツールを使って,フライホイール倒立振子を倒立させることができたというお話です. なお,今回使うファイルなどはすべてGitHubに公開しています.リンクは↓です. 制御対象   以下のようなモデルを倒立させることを考えます.棒の先端に回転する円盤がついていて,円盤を回転させた際に発生する反トルクで棒を倒立させます.円盤はフライホイールと呼ぶことにします. 正確にはリアクションホイールのような気もしますが,とりあえずフライホイールでいいでしょう(多分).

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側に送信し,ロボトレーサのタイヤが動いてライントレースをします. Image from Gyazo

実際のロボトレーサは赤外線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
                    
Image from Gyazo

Simulinkファイルを持ってくる
 

robotracer_simulation_with_gazeboをMATALBを使う上で都合のいいディレクトリ(Windows側)にクローンします(もしくはダウンロードして展開). これはGazeboとSimulinkで通信してシミュレートする事ができるSimulinkファイルなどが含まれています.

実行
 

クローンしてきた(もしくはダウンロードした)robotracer_simulation_with_gazebo の中にあるline_following_demo.slxを開きます.開くと以下の画像のような画面が現れます. Image from Gyazo

Gazeboと通信ができるかテストしてみます.UbuntuでGazeboを起動した状態で次の手順を行ってください.

  1. 以下の画像のようにGazebo Pacerブロックをダブルクリックして、ブロックパラメーター: Gazebo Pacer画面を開きます
  2. 開いた画面のGazeboのネットワークおよびシミュレーション設定の構成をクリックして、Gazeboシミュレーションの構成画面を開きます
  3. 開いた画面のホスト名/IPアドレスを設定します.ここの通りのバーチャルマシンでUbuntuを使っているのであれば変更の必要はありませんが、自分で用意したUbuntuを使っている場合はipアドレスを変更する必要があります.
  4. テストボタンを押して接続が成功すればOKです
Image from Gyazo

もし以下のエラーが出たら、ipアドレスが間違っているかもしれません.ipアドレスがあっているのにエラーが出た場合は、PCを再起動してみてください. 筆者の環境ではよくあったのでそのたびにPCを再起動して対処してました.原因はわかりません. Image from Gyazo

接続できることを確認したら、クローンしてきた(もしくはダウンロードした)robotracer_simulation_with_gazebo にあるchange_data_size.matをロードします.ダブルクリックしてワークスペースに以下の画像のようなものがあらわれたらOKです.

Image from Gyazo

これはGazebo_SL_Bus_gazebo_msgs_ImagedataDimensionsがデフォルトだと128になっており、 ラインセンサ代わりのカメラのデータサイズと違ってしまっているため、変更した値に書き換えたものをロードしてエラーを回避しています.変更後の値は303で、これは \begin{align} カメラの横幅 × カメラの縦幅 × RGBの情報 = 101 × 1 × 3 = 303 \end{align} で計算できます.もしGazebo上のカメラの画素数を変更した場合は、これを変更する必要があります.

ここまでできたら,UbuntuでGazeboを起動した状態でSimulinkを実行します.Gazebo上のロボトレーサがゆっくりとライントレースを始めるはずです. Simulinkファイルの詳しい解説は大変なので今はしません(中身を見ればわかると思います).気が向いたら追記するかもしれません.

1つ注意点ですが,シミュレーションの実行は非常に遅いです.これはどうしようもないことらしいです. MATLAB Answerで質問してみましたが,PCのスペックを上げたからといって速くなるわけでもないらしいです.以下のリンクは質問したリンクです.

まとめ
 

GazeboとSimulinkでロボトレーサのシミュレーションをする例を紹介しました. 実行速度がとても遅いので,コースをガンガン走らせるような使い方は難しいですが,要素要素で使う分には便利だと思います. これを使って賢い動きをさせるアルゴリズムの開発中です.まだまだ時間は掛かりそうですが...

明日はKouhei Itoさんの徒然ネタです.どんなネタなのでしょうか.楽しみです.

コメント

人気の投稿