検証日時
02/15/2015 (Sun)
概要
Gazeboのチュートリアル第六弾「Connect to ROS」。 ROSはロボットの制御フレームワークです。このチュートリアルでは、GazeboとROSのインターフェースについて説明します。 今回はその「Using roslaunch」編です。 公式サイトを適当に翻訳しただけですので、あしからず。
レベル
INTERMEDIATE
環境
PC | : | Lenovo ThinkPad X240 |
Prosessor | : | Intel Core i7-4600U (2.10GHz, 4MB, 1600MHz) |
RAM | : | PC3-12800 DDR3L (8GB) |
OS | : | Ubuntu 14.04 LTS 64bit |
Kernel | : | 3.13.0-44-generic |
Gazebo | : | Version 5.0.1 |
参考
GAZEBO Tutorial-Connect to ROS
チュートリアル : Gazebbo、worldファイル、URDFモデルを起動するためのroslaunchを使う
Gazeboを起動したり、worldモデルを開いたり、シミュレーション環境にロボットモデルをスポーンさせる方法はたくさんあります。このチュートリアルでは、rosrun
とroslaunch
を使ったROSを用いてのそれらの方法を説明します。ROSパッケージの中のURDFを保存し、様々なROSワークスペースのリソースパスを保存する方法を含みます。
worldモデルを開くためにroslaunchを使う
roslaunchツールはROSのノードを起動し、ROSの中でロボットを起動する基本的な方法です。Gazeboの空のworlを起動することは、これまでのチュートリアルで行ってきたrosrun
コマンドを使うのと同じです。以下のように、単純に実行してみましょう。
1
|
|
roslaunch引数
Gazeboの挙動を変更するためのlaunchファイルには、以下の引数を追加することができます。:
pused
Gazeboを一時停止した状態で起動する(default false)
usesimtime
ROSの
/clock
トピックを通じて配信される、Gazebo-publishedのシミュレーションタイムを取得するために、ROSノードに時間を問い合わせます。(default true)
gio
Gazeboのユーザーインターフェースウィンドウをlaunchします。(default true)
headless
(Ogre)コンポーネントを記録することで、シミュレータが呼び出しているすべての関数を表示します。
gui:=true
と一緒では起動しません。(default false)
debug
gdbを使用したデバッグモードで
gzserver
(Gazeboのサーバー)を起動します。(default false)
roslaunchコマンドの例
通常、引数のデフォルト値はすべて必要であり、以下のように記述します。:
1
|
|
他のデモworldをlaunchする
gazebo_ros
パッケージには、他のデモworldがすでに含まれています。以下がその内容です。:
1 2 3 4 |
|
mudworld.launch
は、シンプルなジョイントメカニズムをlaunchするものであることを知っておいていください。mudworld.launch
は以下の内容のlaunchファイルです。
1 2 3 4 5 6 7 8 9 10 11 |
|
このlaunchファイルでは、emptyworld.launch
から機能するのに必要不可欠なほとんどすべてを継承しています。mud.World
ファイルとともにemptyworld.launch
ファイルを用いる代わりに、私達が変更しなければならないパラメータはworldname
パラメータだけです。他の引数はデフォルト値を設定しているだけです。
Worldファイル
mud_world.launch
ファイルをよく調べると、mud.world
ファイルの構成に注目するでしょう。mud.world
の最初のいくつかの構成要素は以下のようになっています。:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
あなたのコンピュータ上で、フルバージョンのworldファイルを以下のセクションで確認してください。
このworldファイルでは、3つのモデルが参照されていることをわずかに確認できます。3つのモデルはローカルのGazeboモデルデータベースの中にあります。もし見つからなければ、Gazeboのオンラインデータベースより自動的にダウンロードしてきます。 worldファイルについて詳しく知りたければ、環境をつくろう !のチュートリアルをご覧ください。
worldファイルをコンピュータ上で検索する
worldファイルは、Gazeboのリソースパス上にある、/worlds
ディレクトリの中にあります。このパスはGazeboをどのようにインストールし、どのタイプのシステムを使っているかということに依存します。Gazeboリソースの位置を探すには、以下のコマンドを使用してください。:
1
|
|
典型的なパスだと、/usr/local/share/gazebo-1.9
となるでしょう。/worlds
に検索したパスを追加すると、mud.world
ファイルを含む、Gazeboが使うディレクトリに直接接続できます。
独自のGazebo ROSパッケージを作る
Gazeboにロボットをスポーンさせる方法について続ける前に、最新版を使うために、ROSをGazeboと使う際の基本的なファイル構造(ヒエラルキー)についてまずは学びましょう。
ここまでの段階で、あなたのcatkin
ワークスペースはcatkin_ws
という名前であると仮定します。もちろん、ワークスペースの名前は好きなものをつけてもらって構いません。例えば、あなたのcatkin
ワークスペースが以下のような位置にあるとします。:
1
|
|
/MYROBOT_description
という名前のパッケージの中に、あなたのロボットモデルにつながるすべてのものと、その記述についてがROSの基本的なパラメータとして存在し、Gazeoboとともに使用されるworldファイルとlaunchファイルは/MyROBOT_gazebo
という名前のROSパッケージの中に存在します。ただし、MYROBOT
の部分はあなたのロボット名です。これらの2つのパッケージにより、ファイル構造は以下のようになります。:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
catkin_create_pkg
コマンドは、新しいパッケージを作成する際に使用します。しかし、もし必要なら、rosbuilt
を使っても簡単にそれを行うことができます。ほとんどすべてのフォルダとファイルは自明でなければなりません。
次のセクションでは、カスタムのworldファイルを使うためのセッティングについて説明してゆきます。
カスタムのworldファイルを作る
あなたのパッケージやロボットに特化したあなた独自のROSパッケージの中にカスタムの.world
を作成することができます。この短いチュートリアルでは、ground、sun、gas stationのある空のシミュレーション環境を作成します。以下は推奨規約です。MYROBOT
の部分はあなたのロボットの名前にするか、ロボットがなければ、test
の様な名前に置き換えるということを忘れないでください。尚、以下のチュートリアルでは、catkin
ワークスペースが~/catkin_ws/
(ホームディレクトリ直下にcatkin_ws
という名前である)となっていると仮定します。
MYROBOT_gazebo
という名前のROSパッケージを作る
1 2 3 4 5 6 |
|
- そのパッケージの中で、launchフォルダを作る
1 2 |
|
- そのlaunchフォルダの中に、
MYROBOT.launch
ファイルを作る。(デフォルトの引数はありません)
1
|
|
尚、MYROBOT.launch
は以下の内容のにする。
1 2 3 4 5 6 7 |
|
- 同じパッケージの中に、
worlds
フォルダを作り、その中に、MYROBOT.world
ファイルを作る。:
1 2 3 |
|
尚、MYROBOT.world
は以下の内容にする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
- ここまで完了した後、以下のコマンドを使えば、Gazeboの中にカスタムのworld(ガソリンスタンド付き)をlaunchすることができるはずです。:
1 2 |
|
うまく行けば、以下のようになります。(マウスを使ってズームアウトしてください)
うまく行かない場合
launchファイルまたは、worldファイルに間違いが無いか確認してください。 よくある間違いは、
MYROBOT
の部分の間違いです。ディレクトリ名が正しいか確認してください 私は、
worlds
としなければならないところをworld
にしてしまい、つまづいてましたorzgzserverがきちんと終了していることを確認してください これが最も厄介なものですが、前回のチュートリアルで
roslaunch gazebo_ros gazebo
やrosrun gazebo_ros gazebo
により、Gazeboの起動確認をしていた場合、Cntrl-C
で終了しても、gzserver
のプロセスが終了していないことがあります。 この場合は、システムモニタ
を開き、起動中のプロセス一覧からgzserver
を探し、終了させてください。 ちなみに、gzserver
ってなんぞ?という方は、Gazeboのコンポーネントでその概要を簡単に説明しているので、そちらをご覧ください。gzclientは立ち上がるが、真っ暗なままですorz 今回のチュートリアルでは、Gazeboのオンラインデータベースにある
gass station
モデルを使用しますが、これを一度もgzclientで表示したことがない場合、自動でダウンロードを行うことになります。 ただ、このダウンロードは結構な時間がかかります。結構な時間とは、1分〜3分です。なので、気長に待ってみましょう。 そんなの待ってらんないぜ!という方は、gazeboを普通に立ち上げ、Insertタブの一番下にある、オンラインのモデル一覧からgass station
を選択して、一度良いので使ってみるか、 ここから直接gass station
を探し、~/.gazebo/model/
にダウンロードすると良いです。
Gazeboの中でworldファイルを編集する
あなたのロボットのworldファイルに、モデルを追加することができますし、ウィンドウの左上にあるFile->Save Asをクリックすることで、編集したworldファイルをROSパッケージに出力することができます。
URDFのロボットをスポーンさせるのにroslaunchを使う
roslaunchを使って、URDFベースのロボットをGazeboにスポーンさせる方法は2つあります。
ROS Servise Call Spawn Method
1つ目の方法では、あなたのロボットのROSパッケージをレポジトリのチェックアウトとコンピュータの間でより運用しやすくするようにします。ROSパッケージパスに関連するあなたのロボットの位置を維持することが許されているだけでなく、小規模の(python)スクリプトを使ってROSサービスコールを作ることが必要です。
Model Database Method
2つ目の方法では、あなたのロボットを
.world
ファイルの中にインクルードすることが許されています。これは、単純で便利に見えるかもしれませんが、あなたのロボットを環境変数を設定し、Gazeboのモデルデータベースに追加する必要があります。
これら2つの方法をやってみます。私達が推奨する方法は、ROS Service Call Spawn Methodです。
“ROS Service Call” Robot Spawn Method
この方法では、GazeboにカスタムのURDFを追加するために、gazebo_ros
のROSノード(rostopicの名前空間では単純にgazebo
という名前がついています)にサービスコールリクエストを行うため、spawn_model
と呼ばれる小規模のpythonスクリプトを使います。spawn_model
スクリプトはgazebo_ros
パッケージにあります。以下の方法で、このスクリプトを使用することができます。
1
|
|
名前空間、trimesh
プロパティ、ジョイントポジション、そしてRPY初期値を含む、spawn_model
のすべての発展的な引数を見るためには、以下のコマンドを実行してください。:
1
|
|
Baxterを使ったURDFの例
もし、まだ例などで、URDFモデルをテストしたことがないなら、Rethink Roboticsのbaxter_commonレポジトリからbaxter_description
パッケージをダウンロードできます。以下のようにして、このパッケージをcatkin
ワークスペースに設置してください。尚、これまでと同様、catkin
ワークスペースの配置は~/catkin_ws
となっているとします。
1 2 |
|
上記コマンドを実行すると、baxter.urdf
という名前のURDFファイルがbaxter_description/urdf/
にできるはずです。できたら以下のコマンドが実行できます。
1
|
|
下図のように、ガソリンスタンドにbaxterのURDFモデルを出現させるには、先ほどまでに作成した、MYROBOT.launch
をlaunchし、上記のコマンドを実行する必要があります。
1 2 |
|
ROSのlaunchファイルに直接これを統合するには、MYROBOT_gazebo/launch/MYROBOT.launch
を再び開き、以下のな教を</launch>
タグの前に追加してください。
1 2 |
|
このファイルをlaunchすると、先ほどrosrun
を使って実行したものと同じ結果が得られるはずです。
PR2を使ったXACROの例
もし、あなたのURDFがXMLフォーマットではないが、XACROフォーマットであったとしても、launchファイルを変更することで、同じようなものが作れます。以下のパッケージをインストールすることにより、PR2の例を実行することができます。
ROS Groovy: - Note : このdebianパッケージとして公開されているpullリクエストだけでは、GroovyのPRは壊れています
1
|
|
ROS Hydro:
1
|
|
ROS Indigo:
1
|
|
インストールが終わったら、以下の内容をMYROBOT.launch
に追加しましょう。:
1 2 3 4 |
|
このlaunchファイルをlaunchすると、以下のように、PR2がガソリンスタンドにいるのが確認できると思います。 Note : この記事を書いている時点では、PR2のURDFの挙動をGazeboのAPIに変更する必要があると言ったようなエラーや渓谷がコンソールの出力に大量に出力されます。(公式サイトより)
“Model Database”Robot Spawn Method
Gazeboにロボットをスポーンさせる2つ目の方法は、あなたのロボットを.world
ファイルの中にインクルードすることが許されています。これは、単純で便利に見えるかもしれませんが、あなたのロボットを環境変数を設定し、Gazeboのモデルデータベースに追加する必要があります。この環境変数が必要となるのは、GazeboのROS依存関係による分割が原因です。URDFパッケージパスは直接.world
ファイルの中に記述することはできません。というのもGazeboはROSパッケージの構造理念とは異なるからです。
この方法を実行するには、一つのロボットだけで構成される新しいモデルデータベースを作らなければなりません。これはGazeboにあなたのURDFを読み込ませるためには単純な方法であるとは言えません。しかしこれは、あなたのコンピュータにあなたのURDFロボットのコピーを2つ作り、維持する必要が内容にするための方法なのです。もし、以下の説明が難しく、混乱してしまうようなら、モデルの構成と必要条件のチュートリアルへ戻り、なぜそのようなステップが必要なのかをしっかりと学んでください。
あなたのROSワークスペースのファイル小僧は以下ようになっていると仮定します。唯一違う点は、model.config
ファイルがMYROBOT_description
パッケージに追加されている点です。:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
このファイル構造は、以下のフォルダ/¥とファイルに従った方法で、Gazeboのモデルデータベースを使うために最適化されています。
- /home/USER/catkin_workspace/src : これはGazeboのモデルデータベースのロケーションとして扱われます
- /MYROBOT_description : このディレクトリはGazeboのモデルフォルダと仕手のみ扱われます
- model.config : これは、Gazeboがこのモデルをデータベースで探すために必要とするコンフィギュレーションファイルです
- MYROBOT.urdf : これはあなたのロボットの構成ファイルです。また
Rviz
やMOveIt!
..etcでも使用されます。 - /meshes : worldファイルとともに、レギュラーのURDFとして、
.stl
や.dae
ファイルを個々に置きます。
model.config
すべてのモデルには、モデルについてのメタデータを含む、モデルのルートディレクトリにmodel.config
ファイルがあります。まずは、このmodel.config
ファイルをコピーし、ファイルネームとともにmodel.urdf
と置き換えてください。:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
SDFファイルとは異なり、URDFでこのファイルを利用する際には、バージョンのタグは必要ありません。より詳しい情報は、Gazeboのモデルデータベースドキュメントをご覧ください。
環境変数
最後に、Gazeboにモデルデータベースはどこを探せばよいか知らせる、.bashrc
ファイルに環境変数を追加する必要があります。好きなエディタで~/.bashrc
を編集してください。GAZEBO_MODEL_PATH
が定義されているか確かめてください。もし、すでに定義されていれば、セミコロンを使って新しいexportパスを追加してください。catkin
ワークスペースが~/catkin_ws/
であるとすると、exportするGAZEBO_MODEL_PATH
は以下のようになっているはずです。:
1
|
|
Gazeboで確認する - 手動
もし、Gazeboのモデルデータベースがlaunchする際にすでに適切に定義されているとして、テストしてみましょう。:
1
|
|
起動できたら、画面左にあるInsertタブをクリックしてください。すると、あなたのシステムで利用可能なオンラインデータベースを含む、異なるモデルのデータベースを代表するドロップダウンリストを確認できるでしょう。あなたのロボットと一致するデータベースを探し、ロボットの名前の上で右クリックし、サブメニューを開いたら、ロボットを設置するためにGazeboの中のロケーションを選んでください。
Gazeboで確認する - モデルデータベースとroslaunch
モデルデータベースの発展的なメソッドでは、ROSパッケージパスを使うことなく、ロボットを直接worldファイルに加えることができます。worldファイルをつくるというというセクションで作ったものと同じセットアップを使いまが、以下のようにworldファイルを変更します。
- 以前のように、
MYROBOT_description/launch
フォルダの時とと同じように、MYROBOT.world
ファイルを以下の内容にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
- 以下のコマンドで、カスタムのworldをガソリンスタンドとロボットとともにGazeboでlaunchできるようになっているはずです。:
1
|
|
この方法の欠点は、あなたのMYROBOT_description
パッケージとMYROBOT_gazebo
パッケージが簡単運用できないということです。
- これらのROSパッケージを利用する前に、最初に新規のシステムには、
GAZEBO_MODEL_PATH
を設定しなければならないのです。
次のステップ
ここまでで、Gazeboやworldファイル、そしてURDFモデルを起動するroslaunchの作り方を学びました。チュートリアルを通して、GazeboでURDFを使うことで、あなた独自のGazebo-ready URDFモデルを作成する準備が出来ました。