この記事は私が担当しているロボットプログラミングⅡの講義用です。
さて、今回は車輪型ロボットのモデルを作りましょう。gazeboのモデルには高次情報を含むモデル設定ファイルmodel.configと詳細情報を含むモデル記述ファイルmodel.sdfの2つのファイルが必要です。
1. モデル用のディレクトリを作る。mkdirの-pオプションはサブディレクトリを含むディレクトリを作成するためです。なお、$はプロンプトを表しているので打ち込まない。
$ mkdir -p ~/.gazebo/models/wheel_robot1
2.モデル設定ファイルを作る。
エディタgeditを以下のコマンドで起動する。
$ cd ~/.gazebo/models/wheel_robot1
$ gedit model.config
以下をエディタにコピペし、保存する。コピペする場合は、ソースコード右上にあるプリンタアイコンの左にあるView Sourceアイコンをクリックし、ソースを表示させ、それをコピーする。そうしないとエラーで悩まされます。
<?xml version="1.0"?>
<model>
<name>Wheel Robot</name>
<version>1.0</version>
<sdf version='1.4'>model.sdf</sdf>
<author>
<name>My Name</name>
<email>My mail address</email>
</author>
<description>
My wheel robot.
</description>
</model>
3.モデル記述ファイルを作る。
2.で作業した同じディレクトリで以下のコマンドを実行しエディタを起動する。以下のコードをエディタにコピペする。コピペする場合の注意事項は2.の作業と同じ。
$ gedit model.sdf
<?xml version='1.0'?>
<sdf version='1.4'>
<!-- 車輪型ロボット1 -->
<model name="wheel_robot1">
<static>false</static> <!-- trueにすると静的モデル -->
<link name='chassis'> <!-- リンク:車体 -->
<pose>0 0 0.2 0 0 0</pose> <!-- 位置(x,y,z)と姿勢(roll,pitch,yaw) -->
<collision name='collision'> <!-- 衝突検出用 -->
<geometry> <!-- 形状情報 -->
<box> <!-- 直方体 -->
<size>0.4 0.4 0.2</size> <!-- サイズx,y,z軸方向 -->
</box>
</geometry>
</collision>
<visual name='visual'> <!-- 表示用 -->
<geometry>
<box>
<size>0.4 0.4 0.2</size>
</box>
</geometry>
</visual>
<collision name='caster1_collision'> <!-- キャスター -->
<pose>0.15 0 -0.1 0 0 0</pose>
<geometry>
<sphere> <!-- 球 -->
<radius>.05</radius> <!-- 半径 -->
</sphere>
</geometry>
<surface> <!-- 表面情報 -->
<friction> <!-- 摩擦 -->
<ode> <!-- ODE用のパラメータ -->
<mu>0</mu> <!-- 摩擦係数 -->
<mu2>0</mu2>
<slip1>1.0</slip1>
<slip2>1.0</slip2>
</ode>
</friction>
</surface>
</collision>
<visual name='caster1_visual'>
<pose>0.15 0 -0.1 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
</visual>
<collision name='caster2_collision'>
<pose>-0.15 0 -0.1 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0</mu>
<mu2>0</mu2>
<slip1>1.0</slip1>
<slip2>1.0</slip2>
</ode>
</friction>
</surface>
</collision>
<visual name='caster2_visual'>
<pose>-0.15 0 -0.10 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
</visual>
</link>
<link name="left_wheel"> <!-- 左車輪 -->
<pose>0.0 0.21 0.175 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>0.125</radius> <!-- 半径 -->
<length>0.02</length> <!-- 長さ -->
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>0.125</radius>
<length>0.02</length>
</cylinder>
</geometry>
</visual>
</link>
<link name="right_wheel"> <!-- 右車輪 -->
<pose>0.0 -0.21 0.175 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>0.125</radius>
<length>0.02</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>0.125</radius>
<length>0.02</length>
</cylinder>
</geometry>
</visual>
</link>
<!-- ジョイント(関節) revoluteは回転式(ヒンジ)-->
<joint type="revolute" name="left_wheel_hinge"> <!--左車軸 -->
<pose>0 0 -0.02 0 0 0</pose>
<child>left_wheel</child> <!-- 子(下位)リンク -->
<parent>chassis</parent> <!-- 親(上位)リンク -->
<axis>
<xyz>0 1 0</xyz> <!-- 回転軸ベクトル(x,y,z) -->
</axis>
</joint>
<joint type="revolute" name="right_wheel_hinge">
<pose>0 0 0.02 0 0 0</pose>
<child>right_wheel</child>
<parent>chassis</parent>
<axis>
<xyz>0 1 0</xyz>
</axis>
</joint>
</model>
</sdf>
4.gazebo起動
端末で以下のコマンドを実行し、gazeboを起動する。
画面左側のinsert(挿入)タブから制作したwheel robot 1を選択して、シミュレーション世界に登場させましょう。今回はこれで終わり。
$ gazebo
○ 演習
ここで制作したロボットの形状は四角なので、家庭で動かすには角が家具や壁に当たり傷つきます。お掃除ロボットのように形状を丸くしましょう。また、サイズも40cm角なので少し大きいです。家庭で動かす家政婦ロボットの台車をつくりましょう!

コメント