gazebo、ros_controlについて

オリジナルロボットを作ってgazeboでシミュレートする方法は下記のページがわかりやすい。

ROSで始めるロボティクス(3) ー 差動二輪ロボットを準備する ~ BRILLIANTSERVICE TECHNICAL BLOG

ROSで始めるロボティクス(3) ー 差動二輪ロボットを準備する ~ BRILLIANTSERVICE TECHNICAL BLOG

 

gazeboとROSの連携について

Gazebo + ROS で自分だけのロボットをつくる 5. GazeboとROSの連携 - Qiita

Controller と HardwareInterface との間の処理の仕組み(1. ロボットモデルの定義と登録) - Qiita

No.6-5:GazeboをROSに繋ぐ (GazeboにおけるURDF 編) - 九州工業大学 CIR-KIT Blog

ros_controls/ros_controllers の制御の仕組み (position/effort/velocity_controllers の基礎) - Qiita

このあたりの記事が詳しいが、詳しすぎてよくわからない。

ros_controlのコンセプトは↓ここに書いてあるぽい

http://roscon.ros.org/2014/wp-content/uploads/2014/07/ros_control_an_overview.pdf

 

オリジナルロボットのためのurdfファイルやyamlファイルやlaunchファイルを見て、その書式を見て、意味を解読することをやると理解できるかもしれない

 

「ROSで始めるロボティクス(3)」の例についてみていく

 

launchファイルについて

gazebo.launchとcontrol.launchがある

gazebo.launchでは

/opt/ros/kinetic/share/gazebo_ros/launch/empty_world.launchを読み込み、gazebo_rosパッケージのspawn_modelというtypeの、urdf_spawnerという名前のノードを立ち上げている。urdf_spawnerのargsで、-param robot_descriptionとしているが、これは、my_robo.urdfを読んでいることになっていそう。

control.launchでは

まず、controller_managerパッケージのspawnerでjoint_state_controllerとdiff_drive_controllerを起動している。joint_state_controllerが常に必要なのかは不明。ROSの、joint_state_controllerのページはほとんど中身がない。

次にrobot_state_publisherを起動している。robot_state_publisherの説明によれば、robot_descriptionパラメタで指定されたロボットのURDFファイルを読んでjoint_statesというトピックを読んで、フォワードキネマティクスを解いてtfを発行しているとある。control.launchではrobot_descriptionパラメタは設定されていないが、(gazebo.launchでは設定されている)どのようにしてURDFファイルを特定しているのか不明。発行するトピックの名前はおそらく/tfと/tf_static。(名前空間の指定は出力されるトピックには影響しないのかな・・)

 

config/controller.yamlファイルについて

diff_drive_controllerの解説↓で、yamlファイルをどのように書くかの例が示されている

diff_drive_controller - ROS Wiki

 

hardware_interface::RobotHWSim、Joint State Interface/Joint Control Interfacesとは何なのか・・?

たぶん、ROSのノードから指令を受け取った後、HWまたはシミュレータに指令を出すまでの間で処理している部分のパーツ。

 

よく見たら、「ROSで始めるロボティクス(3)」の例がうまく動いてない。/my_robo/diff_drive_controller/*のトピックがrostopic listで見えない

rosrun controller_manager spawner diff_drive_controller

とやって、単体でやってもだめ。(正常な時に単体でも動くのかは不明)

apt-get install ros-kinetic-gazebo-ros-controlをしていなかったせいだと判明。

How to run controller_manager - ROS Answers: Open Source Q&A Forum

このロボットについてはdiff_drive_controllerがいてそれが/my_robo/diff_drive_controller/*のトピックを受け付けているっぽいが、

roslaunch kobuki_gazebo kobuki_playground.launchとしたときはどういったコントローラが/mobile_base/commancs/velocity等を受け付けているのか?

「ROSで始めるロボティクス(3)」とは違って、controllerというような名前の付くものをlaunchファイルで起動したりしていないように見える。。empty_world.launchが唯一怪しいか。それともなんとかcontrollerというのは起動しなくてもいいケースがあるのか?

kobuki_playground.launchの場合は、kobuki_gazebo.urdf.xacroの中で<gazebo><plugin name="kobuki_controller" filename="libgazebo_ros_kobuki.so"としている一方で、my_robo_description gazebo.launchの場合はmy_robo.urdfの中で<gazebo><plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"となっているので、kobuki_playground.launchのほうはros_controlを使っていない。

 

kobuki_playground.launchもgazebo.launchもどちらも、/gazeboと/*/robot_state_publisherの両方から/tfが発行されている。robot_state_publisherは必要なのかな・・?

 

ros_controlでノード間通信に依らずロボット間のハードウェアの違いを吸収する - ゼロから始めるロボットプログラミング入門講座

この記事によると独自のコントローラを作るにはこちらが参考になるそう

controller_interface · ros-controls/ros_control Wiki · GitHub

hardware_interfaceについてはこちら

hardware_interface · ros-controls/ros_control Wiki · GitHub