sdfファイルをrviz上のRobotDescriptionで表示する(後半)
実行環境
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" />
次回案
- ROSからGazeboのJointに指示を与えて、それをrvizで表示する
- たまには数学をやる