く /material> く /visual> く /link> く link name="HAIR BACK"> く visual> く geometry> く mesh filename="package://yobicon description/meshes/HairBack. stl" 0 . 001 ソ > く /geometry> く material name="hair ( 010r ” / > く /visual> く /link> く link name="KEMOMIMI R"> く visual> く geometry> scale = ” 0 .001 0.001 く mesh filename="package ://yobicon description/meshes/KemonomimiRight. stl" scale = ” 0.001 0.001 0.001 ソ > く /geometry> く material name="mimi ( 010r ” > く C010r rgba = " 0.9845 0.8588 0.5845 1 " / > く /material> く /visual> く /link> く link name="KEMOMIMI L"> く visual> く geometry> ←一応、狐耳の設定なので黄色系、色再現度は ( 略 く mesh filename="package ://yobicon_description/meshes/KemonomimiLeft. stl" scale = ” 0.001 0.001 0 . 001 ” / > く /geometry> く material name=nmimi C010r " / > く /visual> く /link> く j0int name="Joint Serv01" type="revolute"> く parent link="SERV0_HORN_X_1" / > く child link="SERV0 1 " / > く origin xyz="0.0 0.0 0.0 " rpy="0 0 0 " / > く limit lowe 「 = ” - 1 . 5708 “ upper = " 1 . 5708 " effort = " 0.24516625 ” velo ( ity ゞ 10.4719755114 " / > く axis xyz="0 0 1 ソ > く /joint> く j0int name="SERVO_1_T0_FACE" type="fixed"> く parent link="SERV0_I " / > く child link="FACE" / > く origin xyz="0.0 0.0 0.0 " rpy="0 0 0 " / > く /joint> く j0int name="FACE_T0_HAIR_F" type="fixed"> く parent link="FACE" / > く child link="HAIR FRONT" / > く origin xyz="O. 0 0.0 0.0 " rpy="0 0 0 " / > く /joint> く joint name="FACE TO-HAIR-B" type="fixed"> く parent link="FACE" / > く child link="HAIR BACK" / > 35
く /link> く link name="LEG L"> く visual> く geometry> く mesh filename="package://yobicon-description/meshes/LegLeft. stl" く /geometry> く material name="skin ( 010r ” / > く /visual> く /link> く link name="B00TS R"> く visual> く geometry> scale く mesh filename="package://yobicon-description/meshes/B00tsRight. stl" 0 . 001 ” / > く /geometry> く material name="boots ( 010r ” > く ( 010r rgba="0.2 0.1 0.1 1 ” / > く /material> く /visual> く /link> く link name="B00TS L"> く visual> く geometry> く mesh filename="package://yobicon description/meshes/B00tsLeft. stl" く material name="boots C010r ” / > く /geometry> 0 . 001 ” / > く origin xyz="0.0 0.0 0.0 " rpy="0 0 0 " / > く child link="SERV0 HORN_4" / > く parent link="SERV0_4" / > く jOint name="J0int_Serv04" type= く /link> く /visual> revolute"> scale scale = " 0.001 0.001 0 . 001 ” / > = ” 0.001 0. 囲 1 ニ " 0.001 0 . 001 く limit lower = " - 引 1415926 " upper = " 5.1415926 れ effort = " 0.24516625 " velo ( ity = " 10.4719755114 " / > く parent link="SERV0_HORN 4 " / > く j0int name="HORN TO-LEG-R" type="fixed"> く /joint> く axis xyz="0 1 0 " / > く origin xyz="0.0 0.0 0.0 " rpy="0 0 0 " / > く child link="SERV0_HORN_5" / > く parent link="SERV0_5" / > く j0int name="J0int_Serv05" type= く /joint> く origin xyz="0.0 0.0 0.0 " rpy="0 0 0 " / > く child Iink="LEG_R" / > revolute"> く limit lower = " - 引 1415926 " upper = " 引 1415926 " effort = " 0.24516625 " velo ( ity = " 10.4719755114 " / > 38 く ori in x z ニ " 0.0 0.0 0. 們「 y = ” 0 0 0 " / > く child link="LEG L" / > く parent link="SERV0_HORN_5" / > く jOint name="HORN_T0 LEG-L" type="fixed"> く /joint> く axis xyz="0 1 0 " / >
く child link="SERV0_HORN_X_1 ” / > ” -0.00545 0.0 0.08185 " rpy="0 0 0 " / > く orlgln XYZ= く joint name="BODY_R_to SERV0-2" type="fixed"> く j0int name="BODY ユ -t0 SERVO-3" type="fixed"> く曲 ild link="SERV0_3" / > く parent link="BODY_L" / > く /joint> く orlgln XYZ2 く child link="SERV0_2" / > く parent link="BODY_R" / > く /joint> ”ー 0.005 - 0.0296 0.0619 ” rpy="0 0 0 ” / > く 0 「 lgln XYZ= " ー 0.005 0.0296 0.0619 " rpy="0 0 0 " / > く child link="SERV0_5" / > く parent link="BODY_L" / > く jOint name="BODY_L_to_SERV0_5" type="fixed"> く /joint> く origin xyz="0.0 - 0.0296 0.0 " rpy="0 0 0 " / > く child link="SERV0_4" / > く parent link="BODY_R" / > く j0int name="BODY_R_to SERV0-4" type="fixed"> く /joint> く visual> く link name="SERV0 1 ” > - Head parts - く /joint> く origin xyz="O. 0 0.0296 0.0 " rpy="0 0 0 " / > く mesh filename="package://yobicon-description/meshes/face. stl" scale = " 0.001 0.001 0.001 " / > く geometry> く visual> く link name="FACE"> く /link> く /visual> く material name="sg92r_color"/> く /geometry> 0 . 001 ” / > く mesh fiIename="package://yobicon-description/meshes/SG92R_servo. stl" s ( ale = " 0.001 0.001 く geometry> く origin xyz="0.0 0.0 0.0 " rpy = " 引 1415926 0.0 0.0 " / > ← X 軸でぐるっと逆さまに回転 く /geometry> く material name="skin ( 010 「” > く ( 010r rgba = " 0.9960 0.9450 0.8784 1 " / > く /material> く /visual> く /link> く link name="HAIR FRONT"> く visual> く geometry> ←イラストの肌色から入力してみたが色が違う・・・ ? く mesh filename= package://yobicon description/meshes/HairFront. stl" 0.001 ” / > く /geometry> く material name="hair ( 010r " > く ( 010r r ba 0 . 引 25 0.5255 0. 1 " / > 34 scale ニ齟 . 001 0 . 001
く /visual> く /link> く link name="SERV0 引 > く visual> く origin xyz="0.0 0.0 0.0 " rpy = " ー 1 . 5708 1 . 5708 0 " / > く geometry> く mesh filename="package://yobicon description/meshes/SG92R_servo. stl" 0 . 001 ソ > く /geometry> く material name="sg92r_coIor"/> く /visual> く /link> く link name="SERV0 4 ” > く visual> く origin xyz="0.0 0.0 0.0 " rpy = " 1 . 5708 -1 . 5708 0 " / > く geometry> く mesh fiIename="package://yobicon-description/meshes/SG92R_servo. stl" 0.001 ソ > く /geometry> く material name="sg92r_coIor"/> く /visual> く /link> く link name="SERV0 5 " > く visual> く origin xyz="0.0 0.0 0.0 " rpy = " -1 . 5708 - 1 . 5708 0 " / > く geometry> く mesh fiIename="package://yobicon-description/meshes/SG92R_servo. stl" 0 . 001 " / > く /geometry> く material name="sg92r_coIor"/> く /visual> く /link> scale scale scale ゞ 0.001 0.001 = . 001 0 . 001 0 . 001 0 . 001 く joint name="BODY(DEBUG)" type = " revolute " > ←全体を傾けて遊びたかったので DEBUG 用のリンクを作成 く parent link="base link" / > く child link="BODY BASE" / > く origin xyz="0.0 0.0 0.0 " rpy="0 0 0 " / > く limit lower ゞ - 1 . 5708 ” upper ゞ 1 . 5708 ” effo 「 t = " 0.24516625 ” velocity= " 10.4719755114 ” / > ←角度等制限 く axis xyz="0 1 0 ソ > く /joint> ← Y 軸で回転 く j0int name="base t0 BODY-R" type="fixed"> く parent link="BODY_BASE" / > く child link="BODY R" / > く origin xyz="0 0 0.15985 " rpy="0 0 0 " / > く /joint> く j0int name="base t0 BODY-L" type="fixed"> く parent link="BODY_BASE" / > く child link="BODY_L" / > く origin xyz="0 0 0.15985 " rpy="0 0 0 " / > く /joint> く joint name="BODY_R_to SERVO HORN-X-I " type="fixed"> く parent link="BODY_R" / > 33
5.2.10 display. launch ファイル yobicon—description を RViz に読み込ませて実行するための launch ファイルです。 roslaunch コマ ンドで呼び出すと RViz が立ち上がり、関節角度を変更する UI (joint-state-publisher) も起動しま す。 く launch> く arg name="model" default="$(find Y0bicon description)/urdf/yobicon. urdf"/> く /launch> yobicon description)/launch/config/urdf. rviz"/> く node name="rviz" pkg="rviz" type="rviz" args="-d $(find く node name="robot-state_publisher" pkg="robot state-publisher" type="robot state-publisher"/> く node name="joint-state publisher" pkg="joint state-publisher" type= j0int state-publisher"/> く param name="use-gui" value="$(arg gui)"/> く param name="robot-description" textfile="$(arg model)"/> く arg name= gui" default="True"/> 44 ポート情報として公開する予定です。是非遊んでみて下さい ! yobicon description パッケージは本書発行後に筆者の github (https://github.com/nomumu) でサ $ roslaunch yobicon description display. launch 出来るように作成しました。 yobicon-description はパッケージインストールされている状態で以下のコマンドから実行する事が 5.2.11 yobicon—description パッケージを実行する 保存されます。 する事で設定を保存する事が出来ます。設定は yobicon—descriptionnaunch/config/urdf.rviz に上書き 起動後に表示される情報や UI の構成を変史したい場合は、設定変更後に立ノ - 2 肥 C 五ノを操作
く /joint> く j0int name="LEG_TO_B00TS_R" type="fixed"> く parent Iink="LEG_R" / > く child link="B00TS_R" / > く origin xyz="O. 0 0.0 0.0 ” rpy="0 0 0 " / > く /joint> く j0int name="LEG_TO_B00TS_L" type="fixed"> く parent link="LEG_L" / > く child Iink="B00TS_L" / > く origin xyz ニ " 0.0 0.0 0.0 " rpy="0 0 0 ” / > く /joint> く /robot> かなり長くなってしまいましたが、いかがでしたか ? 同じような定義が何回も出てきて無駄に感じたりした方は、 XACRO ファイルというマクロの記述方 法について調べて頂けると良いと思います。本書ではあえて平文で全ての定義を記述しましたが、通常 はもっとエレガント ( ? ) に書く方法があるので、さらに複雑な関節構造に成長した際には挑戦してみ ようと思います。 39
く parent link="SERV0_2" / > く child link="SERV0 HORN 2 ” / > く origin xyz="0.0 0.0 0.0 " rpy="0 0 0 " / > く axis xyz="0 1 0 ” / > く /joint> く jOint name="HORN TO ARM-R" type="fixed"> く parent link="SERVO_HORN_2" / > く limit lower ゞ - 5.1415926 " upper = " 引 1415926 " effort = " 0.24516625 " velo ( ity = ” 10.4719755114 " / > く origin xyz="0.0 0.0 0.0 " rpy="0 0 0 " / > く child link="SERV0_HORN_3" / > く parent link="SERVO_3" / > く jOint name="J0int Serv03" type= く /joint> く origin xyz="0.0 0.0 0.0 " rpy="0 0 0 " / > く曲 ild link="ARM_R" / > revolute"> く limit lower = " - 引 1415926 " upper = " 引 1415926 " effort = " 0.24516625 " velocity = " 10.4719755114 " / > く visual> く link name="SERV0 HORN 4 " > - Leg parts ー く /joint> く origin xyz="0.0 0.0 0.0 ” rpy="0 0 0 " / > く child link="ARM_L" / > く parent link="SERVO_HORN_3" / > く j0int name="HORN TO ARM-L" type="fixed"> く /joint> く axis xyz="0 1 0 " / > く geometry> く origin xyz="0.0 0.0 0.0 " rpy = " 1 . 5708 1 . 5708 0 " / > く mesh filename="package ://yobicon_description/meshes/SG92R_horn i. stl" scale 0 . 001 0.001 0 .001 " / > く /geometry> く material name="sg92r_horn ( 010r " / > く /visual> く /link> く link name="LEG R"> く visual> く geometry> く mesh filename="package : //yobicon_description/meshes/LegRight. stl" 0 . 001 ” / > く /geometry> く material name="skin ( 010r " / > く /visual> く /link> く link name="SERV0 HORN 引 > く visual> く origin xyz ニ " 0.0 0.0 0.0 ” rpy = ” -1 . 5708 1 . 5708 0 ” / > く geometry> scale = ” 0 . 001 0 . 001 く mesh filename="package ://yobicon_description/meshes/SG92R_horn i. stl" 0 . 001 ” / > く /geometry> く material name="sg92r horn ( 010r " / > く /visual> scale ゞ 0 . 001 0 . 001 37
く origin xyz="O. 0 0.0 0.0 " rpy="0 0 0 " / > く /joint> く j0int name="HAIR_TO_KEMOMIMI R" type="fixed"> く parent link="HAIR_BACK" / > く child link="KEMOMIMI_R" / > く origin xyz="0.0 0.0 0.0 " rpy="0 0 0 " / > く /joint> く j0int name="HAIR_TO_KEMOMIMI_L" type="fixed"> く parent link="HAIR_BACK" / > く child link="KEMOMIMI_L" / > く origin xyz="O. 0 0.0 0.0 " rpy="0 0 0 " / > く /joint> Arm parts く link name="SERV0 HORN 2 " > く visual> く mesh filename="package://yobicon-description/meshes/SG92R_horn i. stl" く geometry> く origin xyz="0.0 0.0 0.0 " rpy = " 1 . 5708 1 . 5708 0 " / > scale = " 0 . 001 0 . 001 0.001 ” / > く /geometry> く material name="sg92r-horn_color"/> く /visual> く /link> く link name="ARM R"> く visual> く geometry> く mesh filename="package://yobicon description/meshes/ArmRight. stl" scale ゞ 0 . 001 0 . 001 0 . 001 ” / > く /geometry> く material name= く /visual> く /link> "skin ( 010r " / > く link name="SERV0 HORN 引 > く visual> く geometry> く origin xyz="0.0 0.0 0.0 " rpy = " -1 . 5708 1 . 5708 0 " / > く mesh filename="package://yobicon description/meshes/S692R horn i. stl" scale 0 . 001 0 . 001 0 . 001 ” / > く /geometry> く material name="sg92r_horn 〔 010r ” / > く /visual> く /link> く link name="ARM L"> く ViSUaI> く geometry> く mesh filename="package://yobicon description/meshes/ArmLeft. stl" く /geometry> く material name="skin ( 010r " / > scale ゞ 0 . 001 0.001 0 . 001 ” / > く /visual> く /link> く・ Oint name= 36 "Joint Serv02" t pe=' revolute">
5 3D モデルを ROS で動かそう ROS を利用して製作されるロポットの多くは移動する事が目的の一部に含まれており、そのために 多くの空間把握用パッケージが開発されています。特に様々な環境情報から自己位置推定とマッピング を行う SLAM (Simultaneous Localization And Mapping) という技術が、自動運転車などへの期待か ら目覚ましい進歩を遂げています。 USB カメラだけで動作するような SLAM パッケージなど、簡単に 触れてみる事が可能なものもあるので、興味が沸いた方は是非調べてみて下さい。 SLAM などで得られた空間認識結果を人間にもわかりやすく 3D 表示するためにも使われる、 ROS 環境が提供する強力な開発支援ツールの一つが RViz (ROS 3D Robot V1sualizer1) です。 RViz はセン サー値、カメラ画像、ロボットの関節軌道など、様々な情報を統合して表示する事に秀でたツールで す。本書で制作するロボットも「 ROS で動く口ボット」を主張するからには、この優れたツールを活 というわけで、前章までに説明したモデルデータを RViz に取り込んだ状態が下図になります。 用しない手はありませんね ! File panels Help 、@> FOCUS Came 「 a Measu 「 e 」 oint ー 5 こ e publishe 「晉を。 2D Pose Estimate 0 Displays マ 0 Global Op に ions Fixed F 「 ame Backg 「 ound COIO 「 F 「 ame Rate / Global status: Ok ◇ Grid RobotModel Add - Views Duplicate Type: 0 「 bi に ( 「 viz) マー第 v 朝 FO ( shape Fixed 5 FO ( 飜 shape Size Distance Target F 「 ame Nea 「 Clip Distance Jolnt Servof BODY(DEBUG) Jolnt Serv04 Jolnt Serv05 Jolnt Serv03 Jolnt Serv02 ー 0 Cente 「 Randomize 6 9.02 0. ・ 1.24 0.05 9.08 Save ー 0 Time Re ROS Time: 91339368.9 ROS Elapsed: L9973 17 Wall Time: 1491339369.12 2D NavCoal WaII EIapsed: ・ publish point 5973.17 ー Reset, Left-Click: RO に e. MiddIe-CIick: Move X/Y. Right-CIick/Mouse Wheel:: Zoom. Shift: More op に ions. 「〕 Expe 「 imental 5 fps 本章では Fusion360 で作成した 3D モデルデータを使用して、 RViz で利用可能な自作ロボットのモ デルバッケージの作り方を説明していきます。パッケージを作るのに呼び名が決まっていないのも不便 なので、以降この機体は yobicon と呼ぶことにします。 1 文献によって R Ⅵ z 、 rviz など、正式名称も表記揺れが多いように思いますが、本書では " R Ⅵ z " と記載します。 26
5.2.3 URDF ファイル 自作ロボットを RViz で表示するためには、ロボットを構成するフレームの長さや関節の定義を記述 した URDF (Unified Robot Description Format) ファイルが必要になります。「ロボットの定義ファ イル」などというと難解な内容を予想するかもしれませんが、必要な機能だけを非常にシンプルに記述 する事が可能な書式になっています。 XML 形式のファイルで決められたタグに設計値を記人していくだ けで本章冒頭のような表示まで行う事が出来ます。 それでは、作例の 3D モデルを表示するために必要な定義を中心に、書式と記述例を見ていきましょ う。簡単な作例になっているので、理解できれば自分のオリジナルなモデルに変更することも出来ると 思います。内容が分かってきた方は公式 Wiki2 の内容も読み進めて頂けると、色々と遊べる定義が見つ けられて楽しいはずです。 5.2.4 URDF の書き方 URDF を構成する定義の基本は < 石れ々 > と勺 o ⅲレの二つです。 link は構造物 ( フレーム、サーボ etc) の定義、 joint は link と link がどのように接続されて動くかの定義です。最初からヒト型にくみ 上げた定義を読むのは大変ですので、まずは最低限の構成例を見てみましよう。 く material name="base C010r " > く origin xyz="O. 0 0.05 0.0 " / > く parent link="base_link"/> く ?xml version="l . 0” ? > く robot name="EasySample"> く link name="base link"> く visual> く geometry> ←おやくそく ←ロポットの名前 ←全体の基準になるべースリンク く cylinder length="0.1" radius="0.01"/> ←円柱 ( 高さ 10 ( 広直径 lcm) を見た目に定義 く /geometry> く /material> く /visual> く /link> く link name="arm"> く visual> く geometry> く bOX size="O. く /geometry> く material name= く /material> く /visual> く /link> く ( 010r rgba="0.8 0.0 0.8 1 . 0 " / > arm ( 010r ” > 01 0.1 0.01 ” / > く〔 010r rgba="l . 0 0.0 0.0 1 . 0 " / > ←赤色、不透明 ←腕リンク ←リンク原点からのオフセット量を定義 ←箱 ( XZ 方向 1 ( 広 Y 方向 10 ( m ) を見た目に定義 ←紫色、不透明 く joint name="revolute_joint" type="revolute"> ←回転ジョイント "revolute_joint" を定義 く child link=" く orlgln XYZ— く axiS XYZ="O く /joint> く /robot> く limit lowe 作 " -1 囲 . 0 " upper="100.0" effort="l . 0" velo ( ity ゞ 10.0 " / > ←ぐるぐる回るぞ ! 0 1 ” / > ←ジョイントの親はべースリンク ←ジョイントの子は腕リンク ←ジョイントの位置はべースの原点から Z 方向に + 5 ( m ← z 軸を中心に回転する 2 カ乙ゆ・・ / う扉 - / ん /. 和、 s. 田 / 2 〃・ツ / : , / ( / - / 〃んとカ乙ゆ・・ / ゾん /. 物 s. 田 / 切ツ广聟 l/l. / ツわ力なを参賤 29