2010年2月6日土曜日

シミュレータの中のオリジナルロボットを動かすための準備その2

前回振り子(名前だけで実際は□が回転するだけ)のシミュレーションをして、
test_controllerという実機互換?のコントローラーで動かしました。

しかし肝心のロボットモデルとコントローラーをつなぐgazebo_pluginが出てきませんでした。
今回その中身を見ていきます。

$ roscd pr2_examples_gazebo/single_link_defs
$ ls
しましょう。

single_link.transmission.xacro  single_link.urdf.xacro  single_link_position_controller.yaml

と3つのファイルがあります。
前回出てきたのはこのうち2つで、
single_link.urdf.xacro ・・・・モデルファイル
single_link_position_controller.yaml・・・・なんらかのパラメータ

ということろまでやりました。

ではモデルファイルから見ていきます。

全部張るのはちょっと冗長なので省略しますので、lessなので見ながら読んでください。
最初は<robot>ですが、xmlns:xiなど、xmlnsで始まる記述がつづきます。
これはXMLの名前空間で、gazeboのジョイントなどの定義のために必要です。
すべてが必要という訳ではありませんが、いくつかは必須のはずです。

<joint>, <link>, <gazebo>などは以前見たものと完全に同じですね。
最後の<gazebo>の中の、
      <controller:gazebo_ros_time name="gazebo_ros_time" plugin="libgazebo_ros_time.so">
        <alwaysOn>true</alwaysOn>
        <updateRate>100.0</updateRate>
        <interface:audio name="dummy_gazebo_ros_time_iface_should_not_be_here"/>
      </controller:gazebo_ros_time>

からはあたらいいですね。

この部分がシミュレータの中のロボットを直接動かす部分、gazebo_pluginの設定をしているところです。

これで、libgazebo_ros_time.soというバイナリで定義されるgazebo_ros_timeというgazebo_pluginをこのモデルに結びつけています。
この中の<alwaysOn>などはオプション指定のようなものだと思います。
<interface:audio>の部分はまったく分かりませんが、これを指定しないと動きません。
このgazebo_ros_timeというプラグインは/clockというトピックに、シミュレータ時間をpublishします。

↓参照

次が一番重要なところです。

      <!-- PR2_ACTARRAY -->
      <controller:gazebo_ros_controller_manager name="gazebo_ros_controller_manager" plugin="libgazebo_ros_controller_manager.so">
        <alwaysOn>true</alwaysOn>
        <updateRate>100.0</updateRate>
        <interface:audio name="gazebo_ros_controller_manager_dummy_iface" />
      </controller:gazebo_ros_controller_manager>
もう分かると思いますがlibgazebo_ros_controller_manager.soというバイナリからgazebo_ros_controller_managerというプラグインを呼び出し、シミュレータに結びつけています。

このプラグインは
pr2_gazebo_pluginパッケージの中にあります。

中を見るとこれが、PR2実機におけるpr2_controller_managerの代わりをシミュレータ上でやるプログラムであることが分かります。

なので、
gazebo_ros_controller_managerhはpr2_controller_managerの代わりに
test_controllerなどの実機互換のコントローラーを回しつつ、その出力をシミュレータに反映するという構成であったことが分かります。

なので、前回書いた
gazebo <-> gazebo_plugin <-> controller
という図はある意味正しいですが、
そのcontrollerを駆動しているのがgazebo_plugin(gazebo_ros_controller_manager)という複雑な構成でした。

図で書くと以下のようになっていると思います。



そしてよく見るとsingle_link.urdf.xacroの最後に

  <include filename="./single_link.transmission.xacro" />
があります。
これはpr2_controller_managerが使う設定ファイルのようです。


ということで、pr2_controller_managerを使う実機プログラムは今回のように、
gazebo_ros_controller_managerを使えばいいことが分かりました。

ROSではpr2_controller_managerを使ってロボットを動かすことが前提となっているようです。
たしかに実時間制御をするにはそれが一番楽なのでしょう。
なので、そのうちpr2_controller_managerまわりの勉強をするべきです。
このブログでは不幸にもそこは飛ばしてしまいました。
手元の環境では実時間制御どうせできないので不要と考えたから意図的に飛ばしました。

まともなロボットは実時間制御を使うので、PR2に限らずこのようなやり方(pr2_controller_manager(実機)とgazebo_ros_controller_managerプラグイン(シミュレータを切り分けるやり方)をするのがいいでしょう。


しかし、私は目標として、改造i-SOBOTをシミュレータに入れることを想定していたので、
実時間制御は使いません。
そのため、このやり方ではなく自分でプラグインを書く方法を試しました。

まあ、仕組みがここまで分かれば簡単です。
.soを作成して、urdfファイルでそれを指定すればいいだけですので。

そのうち紹介します。

0 件のコメント:

コメントを投稿