読者です 読者をやめる 読者になる 読者になる

理科系の備忘録

Linux/Ubuntu/Mac/Emacs/Computer vision/Robotics

sdfファイルをrviz上のRobotDescriptionで表示する(後半)

プログラミング Ubuntu ROS Gazebo


実行環境

Ubuntu14.04
Gazebo 2.2.3
sdf 1.4
ROS indigo
(そろそろGazebo7に戻りたい…)

背景

前半編でsdfからurdfを生成してrobot_descriptionに登録する方法を学んだ。
今回は、collada(daeファイル)をrvizで見られるか確認ついでに、sdfからurdfを変換する部分も一発で行うlaunchファイルを作る。

手順

  • sdfファイルの作成
  • package.xmlの変更
  • launchファイルの作成
  • 実行

sdfファイルの作成

前半でつくった箱をconstruction_barrelに置き換えて配置を横にしただけのsdfファイルを用意した。

<?xml version='1.0'?>
<sdf version="1.4">

  <model name="my_model">
    <pose>0 0 0 0 0 0</pose>
    <link name="base_link">
      <inertial>
        <mass>1.0</mass>
        <inertia> <!-- interias are tricky to compute -->
          <ixx>0.083</ixx>       <!-- for a box: ixx = 0.083 * mass * (y*y + z*z) -->
          <ixy>0.0</ixy>         <!-- for a box: ixy = 0 -->
          <ixz>0.0</ixz>         <!-- for a box: ixz = 0 -->
          <iyy>0.083</iyy>       <!-- for a box: iyy = 0.083 * mass * (x*x + z*z) -->
          <iyz>0.0</iyz>         <!-- for a box: iyz = 0 -->
          <izz>0.083</izz>       <!-- for a box: izz = 0.083 * mass * (x*x + y*y) -->
        </inertia>
      </inertial>
      <collision name="collision">
        <geometry>
          <mesh>
            <uri>model://construction_barrel/meshes/construction_barrel.dae</uri>
          </mesh>
        </geometry>
      </collision>
      <visual name="visual">
        <geometry>
          <mesh>
            <uri>model://construction_barrel/meshes/construction_barrel.dae</uri>
          </mesh>
        </geometry>
      </visual>
    </link>

    <link name="child_link">
      <pose>2 0 0 0 0 0</pose>
      <inertial>
        <mass>1.0</mass>
        <inertia> <!-- interias are tricky to compute -->
          <ixx>0.083</ixx>       <!-- for a box: ixx = 0.083 * mass * (y*y + z*z) -->
          <ixy>0.0</ixy>         <!-- for a box: ixy = 0 -->
          <ixz>0.0</ixz>         <!-- for a box: ixz = 0 -->
          <iyy>0.083</iyy>       <!-- for a box: iyy = 0.083 * mass * (x*x + z*z) -->
          <iyz>0.0</iyz>         <!-- for a box: iyz = 0 -->
          <izz>0.083</izz>       <!-- for a box: izz = 0.083 * mass * (x*x + y*y) -->
        </inertia>
      </inertial>
      <collision name="collision">
        <geometry>
          <mesh>
            <uri>model://construction_barrel/meshes/construction_barrel.dae</uri>
          </mesh>
        </geometry>
      </collision>
      <visual name="visual">
        <geometry>
          <mesh>
            <uri>model://construction_barrel/meshes/construction_barrel.dae</uri>
          </mesh>
        </geometry>
      </visual>
    </link>
    <joint name="joint" type="revolute">
      <parent>base_link</parent>
      <child>child_link</child>
      <axis>
        <xyz>0 0 0</xyz>
        <limit>
          <upper>0</upper>
          <lower>0</lower>
        </limit>
      </axis>
    </joint>
  </model>
</sdf>

package.xmlの変更(すいません、まだうまく行ってないです)

もし

~/.gazebo/models/construction_barrel

が存在するなら、daeファイルの在処を以下のように書けば良い。

<uri>model://construction_barrel/meshes/construction_barrel.dae</uri>     

これは上記ディレクトリがgazeboのモデル置き場として事前に登録されているからである。

もし自分のパッケージ内にモデルの置き場を作りたければ、自分のpackage.xmlのexportタグ内に以下を追加すればよい。

<export>
    <gazebo_ros                                                                 
        gazebo_plugin_path="${prefix}/lib"
        gazebo_model_path="${prefix}/models"/> 
  </export>

するとパッケージ直下に作ったmodels以下をモデル置き場として使うことができる(はず。自分の環境ではうまくいてない。。。)

とりあえず、GAZEBO_MODEL_PATHを事前に設定しておくことで、自前のディレクトリを参照してくれるようになった。package.xmlで設定できないのはなぜ?

$ export GAZEBO_MODEL_PATH=/home/user/catkin_ws/src/gazebo_sdf_to_urdf/models

launchファイルの作成

前回はsdfファイルを作るコマンドを別に実行していたが、どうせなら1つのlaunchファイル内で完結させたい。
そのために以下のようにlaunchファイルを作成した。

<launch>
  <include file="$(find gazebo_ros)/launch/empty_world.launch"></include>
  
  <param name="pysdf"
	 command="$(find pysdf)/scripts/sdf2urdf.py $(find gazebo_sdf_to_urdf)/sdf2/model.sdf $(find gazebo_sdf_to_urdf)/sdf2/model.urdf" />

  <param name="robot_description"
  	 textfile="$(find gazebo_sdf_to_urdf)/sdf/model.urdf" />
      
  <node pkg="gazebo_ros"
  	type="spawn_model"
  	name="spawn_model"
  	respawn="false"
  	args="-file $(find gazebo_sdf_to_urdf)/sdf/model.sdf -sdf -model object1 -z 1" />

  <param name="use_gui" 
	 value="true"/>
  
  <!-- <node name="joint_state_publisher" -->
  <!-- 	pkg="joint_state_publisher"  -->
  <!-- 	type="joint_state_publisher" /> -->

  <node name="robot_state_publisher" 
	pkg="robot_state_publisher" 
	type="state_publisher" />  

  <node name="rviz" 
	pkg="rviz" 
	type="rviz"/>  

</launch>

robot_descriptionにパラメータを登録する前、spawnする前に以下の部分でpysdfを実行してmodel.urdfを作成している。

<param name="pysdf"
	 command="$(find pysdf)/scripts/sdf2urdf.py $(find gazebo_sdf_to_urdf)/sdf/model.sdf $(find gazebo_sdf_to_urdf)/sdf/model.urdf" />

実行

roslaunchコマンド一発でgazebo上にspawnされ、rviz上でbarrelが表示されることを確認した。

次回案

  • ROSからGazeboのJointに指示を与えて、それをrvizで表示する
  • たまには数学をやる