く 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
く /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
く /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
く /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
く 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">
く /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 " / >
く 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
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