@calm0815
2020/5/1
ROS Japan UG #36 飛び込みLT
作成:@calm0815
リンク機構を有するロボットを
Gazeboで動かす
@calm0815
自己紹介
名前:桑野 僚大(Kuwano Tomohiro)
経歴:
• ~ 2020/03 : 九州工業大学大学院 修士(制御工学)
• 西田研究室:ソフトロボットグリッパの開発
• 学生フォーミュラ:
空力パーツの設計してみたり、シミュレータ(PCゲーム)作ってみたり
• 2020/04 ~ : 自動車メーカ 生産技術開発本部
• 2020/04 ~ : 自宅待機&在宅勤務 Twitter : @calm0815
Github : calm0815
➢ https://github.com/calm0815
「ROS、(文字通り)チョットワカル」位のユーザです。
趣味で回路くんだり、ROS触ったりしてます。
@calm0815
Target:
Gazeboでリンク機構を動かす
Contents:
1. ROSからGazeboを起動するときの処理
2. URDFの欠点と,SDFを用いた対応策
3. 実際にやってみよう!
@calm0815
.urdf
ロボットの情報
• URDF[1]で記述
• 場合によっては
XacroからURDFに変換
• URDFをrosparamに登録
1. ROSからGazeboを起動するときの処理
[1] URDF XML Specifications:http://wiki.ros.org/urdf/XML
.urdf
形式[spawn_urdf]
.sdf
形式
Gazebo’s API : urdf2sdf
Gazebo’s world
convert
指令値など
Joint角など
Plugin:
gazebo_ros_control
@calm0815
1. ROSからGazeboを起動するときの処理
.urdf
形式[spawn_urdf]
.sdf
形式
Gazebo’s API : urdf2sdf
Gazebo’s world
convert
指令値など
Joint角など
Plugin:
gazebo_ros_control
URDFで表現できないロボットは
Gazeboにスポーンさせることはできない
(と,思われている)
.urdf
ロボットの情報
• URDF[1]で記述
• 場合によっては
XacroからURDFに変換
• URDFをrosparamに登録
[1] URDF XML Specifications:http://wiki.ros.org/urdf/XML
@calm0815
2. URDFの欠点と、SDFを用いた対応策
URDFで表現できないロボットって?
➢ よく指摘されるのが「リンク機構」を有するロボット
例)ETH Zurich が開発した「Ascento」[2]
[2] ASCENTO | Indoor Mobility Robot ETHZ, https://www.ascento.ethz.ch/
• 脚部にリンク機構を有している
• “Hip Motor”が回転することで,ロボットは
屈伸動作を行う
@calm0815
2. URDFの欠点と、SDFを用いた対応策
なぜリンク機構を表現できないのか?
• URDFはシリアルチェーン構造(Serial Chains)のみサポートしている
➢ 親が複数の子ノードを持っていても,子は1つの親ノードしか持てない
Link1
×
この制約のおかげで
「Gazeboでリンク機構は動かせない」
なんてことを言われる
joint
親リンク
• world
• Link4 ⇐ 持てへん
@calm0815
2. URDFの欠点と、SDFを用いた対応策
【対策】SDFでロボットを定義しよう!
• SDFは並列ジオメトリをサポートしている
➢ 親も子も複数ノードを持つことができる ⇒ リンク機構が定義可能
Link1
○
Gazeboだってやればできる。
joint
親リンク
• world
• Link4 ⇐ 持てる
@calm0815
3. 実際にやってみよう!
本当にリンク機構を定義できるのか試してみよう!
以下に示すような
リンク機構を有するロボットをGazeboで動かしてみる
ロボット リンク機構を有する脚部
@calm0815
3. 実際にやってみよう!
定義したいリンクの構造
ロボットを側面からみた図
(タイヤ除く)
能動的に動くリンク
受動的に動くリンク
effort_controllers/
JointPositionController
ジョイント
@calm0815
.urdf
ロボットの情報
• URDF[1]で記述
• 場合によっては
XacroからURDFに変換
• URDFをrosparamに登録
.urdf
形式[spawn_urdf]
.sdf
形式
Gazebo’s API : urdf2sdf
Gazebo’s world
convert
指令値など
Joint角など
Plugin:
gazebo_ros_control
×
“URDFのみ”の起動方法 3. 実際にやってみよう!
使わない
[1] URDF XML Specifications:http://wiki.ros.org/urdf/XML
@calm0815[2]SDFormat Specifications:http://sdformat.org/spec?ver=1.7&elem=sdf
3. 実際にやってみよう!
ロボットの情報
• URDFとSDF[2]の両方を用意
➢ URDFはROSが持つ情報
➢ SDFはGazeboが持つ情報
• URDFをrosparamに登録 Gazebo’s world
指令値など
Joint角など
.sdf
[spawn_model]
“URDFとSDFを併用する”起動方法
How to spawn an SDF:
https://www.theconstructsim.com/
gazebo-qa-003-spawn-sdf-custom-
model-gazebo-ros/
Plugin:
gazebo_ros_control
@calm0815
3. 実際にやってみよう!
URDF側の内容(ROSに必要な情報)
<robot name=“hoge”>
<link name=“fuga”>
~~~
</link>
<joint name=“fuga_joint”>
~~~
</joint>
<transmission name=“foo”>
<type>~~~</type>
<joint>~~~</joint>
<actuator>~~~</ actuator >
</transmission>
</robot>
SDF側の内容(Gazeboに必要な情報)
<model name=“hoge”>
<link name=“fuga”>
~~~
</link>
<joint name=“fuga_joint”>
~~~
</joint>
<plugin name=“gazebo_ros_conrol”>
~~~(お決まりのやつ)
</plugin>
<plugin name=“joint_state_publisher”>
~~~
</plugin>
</model>
・・・
・・・
nameはすべて共通にする collisionに
”mu”などが
必要
Using gazebo_ros_control with SDF instead of URDF:
https://answers.ros.org/question/223196/using-gazebo_ros_control-with-sdf-instead-of-urdf/
@calm0815
3. 実際にやってみよう!
Watch this movie on YouTube:https://www.youtube.com/watch?v=UJCQ8EBhfMk
ROS
Jointに指令値
Rvizで可視化
Gazebo
リンクが動作
Joint角をROSへ
フィードバック
@calm0815
3. 実際にやってみよう!
URDF側の内容(ROSに必要な情報)
<robot name=“hoge”>
<link name=“fuga”>
~~~
</link>
<joint name=“fuga_joint”>
~~~
</joint>
<transmission name=“foo”>
<type>~~~</type>
<joint>~~~</joint>
<actuator>~~~</ actuator >
</transmission>
</robot>
Using gazebo_ros_control with SDF instead of URDF:
https://answers.ros.org/question/223196/using-gazebo_ros_control-with-sdf-instead-of-urdf/
~Tips~
リンク機構のコントローラに
“position_controllers::JointPositionController”が
使えなかった
➢ “effort_controllers::JointPositionController”は
使えた
Position_controllersの場合,
jointの応答が速すぎて,リンク機構が動けないのでは?
➢ 明確な理由はよくわかってない
・・・
補足①
@calm0815
3. 実際にやってみよう!補足②
URDFの中身をSDFにそのままコピーできない!
➢ URDFとSDFの間で,<link>と<joint>に含まれる<origin>の役割が異なる
(個人的な)URDFの組み方
• <link>の<origin>はモデル原点に合わせてすべてゼロ
• <joint>の<origin>には親リンクからみた子リンクのモデル原点位置を設定
SDFの組み方
• <static>をtrueにして、ロボットが動かないように設定
• <link>だけでロボットのパーツを配置
• <joint>の<origin>はすべてゼロ
@calm0815
3. 実際にやってみよう!
本日紹介させていただいたロボットは,以下のGitリポジトリで管理しています
• echo_bot_ros_pkg
➢ https://github.com/calm0815/echo_bot_ros_pkgs
✓ 定義したURDF
➢ https://github.com/calm0815/echo_bot_ros_pkgs/blob/master/echo_
bot_common/echo_bot_description/robots/echo_bot.urdf
✓ 定義したSDF
➢ https://github.com/calm0815/echo_bot_ros_pkgs/blob/master/echo_
bot_simulator/echo_bot_gazebo/models/echo_bot/model.sdf
今回の実装に関するご意見やPRなど
色々とご協力くださった方々ありがとうございました!!!
今後ともよろしくです!!
@calm0815
ご清聴ありがとうございました
質問等ありましたらよろしくお願いします

リンク機構を有するロボットをGazeboで動かす