AI関連の勉強をしたいと思い,前回は卓球動画をOpenPoseで解析する記事を書きました.次は深層強化学習への理解を深めたいと思っていて,オムニホイール型ロボットを深層強化学習で制御したいと思っています.そこで,まずはシミュレーション環境構築をしたいと思い立ち,この記事を書いています.今回はgazeboというソフトウェアをベースにシミュレーション環境を使ってみます.
私の場合以前ROSをインストールしたことがあり,そのときにgazeboも入っていたようなので,gazeboのインストールの部分はすっ飛ばします.
ちなみに私の環境は,以下です.
- Ubuntu 18.04
- ROS Melodic
- Thinkpad intel core i5
まずは,このサイトで公開されているgitのリポジトリをクローンしてきます.このリポジトリを以後,OpenBaseと呼びます.
tutorialのgetting_started.txtの実行
tutorialディレクトリの中にgetting started.txtというファイルがあるのでこれに沿ってセットアップを進めていきます.
詰まった部分や補足が必要だと思った部分のみを取り扱っていきます.全体を見たい場合はここを見てください.
OpenBaseのモデルファイルをgazeboのデフォルトディレクトリにコピー
1. Copy the folders “model/abstract” and “models/omni_wheel” to Gazebo’s default model folder.
OpenBaseのmodel/absractとmodel/omni_wheelを,gazeboのデフォルトディレクトリにコピーしないといないみたいです.
gazeboのデフォルトディレクトリってどこを見ればわかるのでしょうか?私の場合は,gazeboを起動して,insertタブの以下の赤枠の部分を見ると書いてありました.
gazeboはROSをインストールしていれば,ターミナルでgazeboと打てば起動すると思います.
/usr/share/gazebo-9/modelsがデフォルトディレクトリになっていそうです.
以下のようにabstractとomni_wheelコピーしておきました.ground_planeとsunは元々入っていたものです.
$ ls /usr/share/gazebo-9/models abstract ground_plane omni_wheel sun
.sdfファイル内の.stlファイルのパスを正しく設定をする
3. Since the STL files now have a new path, open both folders’ “model.sdf”, search for occurrences of “.stl” and replace the paths for the corresponding path of each STL file.
つぎは,abstract/model.sdf と omni_wheel/model.sdf の中の.stlファイルを適切なパスに設定する必要があるそうです.たとえば以下のような感じです.手順1のgazeboのデフォルトディレクトリに直してください.直すべき箇所がたくさんあるので一括置換した方がいいと思います.
/home/guir/model_editor_models/omni_wheel_model/roller.stl ↓ /usr/share/gazebo-9/models/omni_wheel/roller.stl
この手順を踏まないと,オムニホイールロボットをgazeboで表示できません.
オムニホイールロボットをgazebo上で配置する
4. Create a new world in Gazebo (paused) and insert the model. It should be available in the “Insert” tab since you placed the files in Gazebo’s default model folder.
gazeboを起動して,モデルを挿入しましょう.Insertタブからrobot_mobile_wheel_3_omni_open_baseを選択して座標のどこかをクリックすると,そこにオムニホイールロボットが配置されるはずです.
5. Place the robot at (x, y, z) = (0; 0; 0,01905).
チュートリアルでは(x, y, z) = (0; 0; 0.01905)の位置にオムニホイールロボットを配置してくれと書いてあるので,そのようにします.
poseのx, y, zをそれぞれいじりました.
pluginをコンパイルする
7. Compile the plugin, following either Gazebo’s tutorial or my tutorial using NetBeans.
pluginのコンパイルをしないといけないみたいですね…サラッと書いてありますが何のことやらわかりません.ググってみるとこのサイトが結構わかりやすそうでした.
まずは,OpenBaseのplugin/demoをどこか別の場所にコピーして,そこにbuildディレクトリを作ります.
cp -r OpenBase/plugin/demo/ ~/work cd ~/work/demo mkdir build
つぎに,buildディレクトリに移動し,cmakeとmakeを実行しましょう.
cd build cmake ../ make
こうすることで,~/work/demo/buildディレクトリにlibmain.soができるので,これを次のステップでプラグインパスに設定しましょう.
こうしてできた動的ライブラリによって,オムニホイールロボットを制御することができます.たとえば,デフォルトの設定だと「ランダムにオムニホイールロボットを移動させるための動的ライブラリ」が生成されます.
プラグインパスの設定
8. Open the world file with a text editor. Search for “<plugin name=” and replace the path after “filename=” by the new plugin path.
/usr/share/gazebo-9/models/abstract/model.sdfファイルのプラグインパスを,1つ前の手順で作成したlibmain.soのパスに置き換えます.私の場合は下記のようにしました.
<plugin name='omni_plugin'filename='/home/renma/libmain.so'/>
実際に動かしてみる
Open the world in Gazebo and hit play. The robot should start moving: it will repeatedly decide on a random (x, y, theta) and move to it.
gazeboを起動して,insertタブからオムニホイールロボットを選択してシミュレータ上に配置すると,ロボットがランダムに動くのが確認できるかと思います!
動画ではオムニホイールロボットが見やすいように,Scene -> shadowsをFalseにしています.
オムニホイールに別の運動をさせてみる
今度は,オムニホイールロボットの動きを変えてみようと思います.
さきほどの~/work/demo/main.ccを開き,以下の変更を加えます.
変更前 | 変更後 |
double VxTarget; | double VxTarget = 0.5; |
double VyTarget; | double VyTarget = 0.5; |
Movements movement = MOVEMENT_NONE; | Movements movement = MOVEMENT_DIRECT_W; |
VxTarget, VyTargetの変更は「目標速度を0.5にしますよ」という意味で,movementの変更は「操作モードをMOVEMENT_NONEからMOVEMENT_DIRECT_W(ワールド座標系での速度指定)にしますよ」という意味です.
ちょっとわかりにくいですが,MOVEMENT_NONEのときランダムな動きをするようになっているみたいですね.
上記修正を行った後に先ほどと同様以下を実行すると,確かに動きが変わります.
cd build cmake ../ make
(x, y) = (1,1)ベクトルの方向に等速直線運動するようになりました.
まとめ
今回は,gazeboでオムニホイールロボットのシミュレーション環境構築を行ってみました.
私自身gazeboを扱ったのがはじめてだったので,わかりにくい部分もあるかもしれません.質問や補足は遠慮なくお願いします.
ただ,gazebo自体が結構重いのでこれと深層強化学習を走らせたらたぶんパソコンが過負荷でパンクしてしまいそうだなと思いました…
次はこのOpenBaseをROS上で動かせたらいいなと思っています.
コメント