九州工業大学 CIR-KIT Blog

九工大自律移動ロボット製作プロジェクトCIR-KITの技術系ブログ

No.2-4:ロボットを作ってみよう ! (移動ロボットをつくる 編)

gazebo_logo

検証日時

01/25/2015 (Sun)

概要

Gazeboのチュートリアル第二弾「Build a Robot」。
このチュートリアルではロボットを作ったり、修正したりします。また、センサ、アクチュエータを搭載した車輪型ロボットを作り、モデルを描画するなどの実践例も行います。
今回はその「Make a Mobile Robot」編です。
公式サイトを適当に翻訳しただけですので、あしからず。

レベル

BEGINNER

環境
PC : Lenovo ThinkPad X240
Prosessor : Intel Core i7-4600U (2.10GHz, 4MB, 1600MHz)
RAM : PC3-12800 DDR3L (8GB)
OS : Ubuntu 14.04 LTS 64bit
Kernel : 3.13.0-44-generic
Gazebo : Version 5.0.1
参考

GAZEBO Tutorial-Build a Robot

レベル

BEGINNER

はじめに

このチュートリアルでは、デファレンシャル駆動機構をもつ二輪移動ロボットを作るプロセスを通じて、Gazeboの基本的なモデルマネジメントを学び、モデルデータベースの中でのベーシックモデル描写についても詳しく学びます。

モデルディレクトリのセットアップ

モデルデータベースドキュメントを読んでください。Gazeboモデルデータベースディレクトリ構成のフォーマットルールに従ったモデルを作成します。また、モデルの構成フォーマットについての詳細はSDFリファレンスをご覧ください。
モデルディレクトリを作成します。:

1
  mkdir -p ~/.gazebo/models/my_robot

ファイルmodel.configを作成します。:

1
  gedit ~/.gazebo/models/my_robot/model.config

中身は以下の内容にしてください。:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0"?>
<model>
  <name>My Robot</name>
  <version>1.0</version>
  <sdf version='1.4'>model.sdf</sdf>
  <author>
   <name>My Name</name>
   <email>me@my.email</email>
  </author>
  <description>
    My awesome robot.
  </description>
</model>

ファイル~/.gazebo/models/my_robot/model.sdfを作成してください。

1
  gedit ~/.gazebo/models/my_robot/model.sdf

また、その中身は以下の内容にしてください。

1
2
3
4
5
<?xml version='1.0'?>
<sdf version='1.4'>
  <model name="my_robot">
  </model>
</sdf>

ここまでで、モデルの基本的なコンテンツを作成しました。model.configファイルではいくつかの追加メタデータによりロボットを記述しています。model.sdfファイルにはSDF version 1.4にリンクされたGazeboを使用するmy_robotという名前のモデルを初期化するために必要なタグが記述されています。

モデルの構成を作成する

このステップでは、長方形の本体に2つの車輪も持つモデルを制作してゆきます。 まずは、シンプルなモデルから始め、段階を踏んでモデルを組み立ててゆくことが重要です。最初のステップはモデルの基本的な形状を作成することです。そのために、まずは、静的なモデルを作成します。つまり、物理エンジンについては無視したものから作成するということです。その結果、モデルは一定の場所から移動せず、構成要素を詳細に整理することができるようになります。

  1. モデルを静的にするために、~/.gazebo/models/my_robot/model.sdfファイルに<static>true</static>を追加してください。すると、以下のようなソースコードになるはずです。 コピーはしないでください。手書きで追加していくことが、今回のチュートリアルです。
1
2
3
4
5
6
<?xml version='1.0'?>
<sdf version='1.4'>
  <model name="my_robot">
    <static>true</static>
  </model>
</sdf>
  1. 長方形のロボット本体のモデルを追加するために、~/.gazebo/models/my_robot/model.sdfを以下のように編集してください。すると以下のようなソースコードになるはずです。
    コピーはしないでください。手書きで追加していくことが、今回のチュートリアルです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version='1.0'?>
  <sdf version='1.4'>
    <model name="my_robot">
    <static>true</static>
      <link name='chassis'>
        <pose>0 0 .1 0 0 0</pose>
        <collision name='collision'>
          <geometry>
            <box>
              <size>.4 .2 .1</size>
            </box>
          </geometry>
        </collision>
        <visual name='visual'>
          <geometry>
            <box>
              <size>.4 .2 .1</size>
            </box>
          </geometry>
        </visual>
      </link>
  </model>
</sdf>

これで、大きさが0.4 x 0.2 x 0.1 [m]を作ることが出来ました。衝突要素は衝突判定エンジンに使用されるような形状で定義されています。外観要素はレンダリングエンジンに使用されるような形状で定義されています。ほとんどのケースでは、衝突要素と外観要素は同じです。外観要素と衝突要素が異なる場合というのは、外観要素が複雑なメッシュを使用しており、外観要素より、衝突要素のほうがシンプルになる様な場合です。そのような場合には、パフォーマンスの向上を図るために行います。

  1. Gazeboを起動し、作成したモデルを確認しましょう。GUIに表示されるinsertmodelguiというボタンからInsert Modelというボタンを押して作成したモデルをインポートしましょう。以下のコマンドで、Gazeboを起動します。:
1
gazebo

うまく行けば、写真のように白い箱が見えるでしょう。また、地面から1[m]浮かんでいるはずです。
My_robot_box

  1. 今度は、ロボットにキャスターを追加しましょう。物理エンジンにおいて、ジョイントを用いたタイヤを使ってキャスターにするより、摩擦なしの球を使うほうが、モデルを単純化できるため、キャスターは摩擦なしの球にします。それでは、model.sdfに要素を追加しましょう。最終的には、以下のようになるはずです。:
    コピーはしないでください。手書きで追加していくことが、今回のチュートリアルです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
   <?xml version='1.0'?>
<sdf version='1.4'>
  <model name="my_robot">
    <static>true</static>
    <link name='chassis'>
      <pose>0 0 .1 0 0 0</pose>
      <collision name='collision'>
        <geometry>
          <box>
            <size>.4 .2 .1</size>
          </box>
        </geometry>
      </collision>
      <visual name='visual'>
        <geometry>
          <box>
            <size>.4 .2 .1</size>
          </box>
        </geometry>
      </visual>
      <collision name='caster_collision'>
        <pose>-0.15 0 -0.05 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='caster_visual'>
        <pose>-0.15 0 -0.05 0 0 0</pose>
        <geometry>
          <sphere>
            <radius>.05</radius>
          </sphere>
        </geometry>
      </visual>
    </link>
  </model>
</sdf>

ロボットの後方にキャスターが追加されることを確認してください。先ほどの手順と同じようにしてGazeboにモデルをスポーンさせてください。(Gazeboを再起動する必要はありません。というのも、コードを変更するたびに、Gazeboはモデルをリロードするためです。)
うまく行けば、以下のようになります。 My_robot_caster

  1. 続いて、左タイヤを追加しましょう。model.sdfを以下のように編集しましょう。
    コピーはしないでください。手書きで追加していくことが、今回のチュートリアルです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    <?xml version='1.0'?>
    <sdf version='1.4'>
      <model name="my_robot">
        <static>true</static>
        <link name='chassis'>
          <pose>0 0 .1 0 0 0</pose>
          <collision name='collision'>
            <geometry>
              <box>
                <size>.4 .2 .1</size>
              </box>
            </geometry>
          </collision>
          <visual name='visual'>
            <geometry>
              <box>
                <size>.4 .2 .1</size>
              </box>
            </geometry>
          </visual>
          <collision name='caster_collision'>
            <pose>-0.15 0 -0.05 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='caster_visual'>
          <pose>-0.15 0 -0.05 0 0 0</pose>
          <geometry>
            <sphere>
              <radius>.05</radius>
            </sphere>
          </geometry>
        </visual>
      </link>
      <link name="left_wheel">
        <pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
        <collision name="collision">
          <geometry>
            <cylinder>
              <radius>.1</radius>
              <length>.05</length>
            </cylinder>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <cylinder>
              <radius>.1</radius>
              <length>.05</length>
            </cylinder>
          </geometry>
        </visual>
      </link>
      </model>
    </sdf>

先ほどと同じように、Gazeboで作成したモデルを確認し、追加したタイヤが正しく付いていることを確認しましょう。ちなみに、さっきまでのモデルは削除しました。(モデルを右クリックし、Deleteをクリックすれば、削除できます) My_robot_caster_left_wheel

  1. 左タイヤをコピーして右タイヤを作り、リンクの姿勢にタイヤを合わせましょう。以下のようにmodel.sdfを編集してください。: コピーはしないでください。手書きで追加していくことが、今回のチュートリアルです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    <?xml version='1.0'?>
    <sdf version='1.4'>
      <model name="my_robot">
        <static>true</static>
        <link name='chassis'>
          <pose>0 0 .1 0 0 0</pose>
          <collision name='collision'>
            <geometry>
              <box>
                <size>.4 .2 .1</size>
              </box>
            </geometry>
          </collision>
          <visual name='visual'>
            <geometry>
              <box>
                <size>.4 .2 .1</size>
              </box>
            </geometry>
          </visual>
          <collision name='caster_collision'>
            <pose>-0.15 0 -0.05 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='caster_visual'>
          <pose>-0.15 0 -0.05 0 0 0</pose>
          <geometry>
            <sphere>
              <radius>.05</radius>
            </sphere>
          </geometry>
        </visual>
      </link>
      <link name="left_wheel">
        <pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
        <collision name="collision">
          <geometry>
            <cylinder>
              <radius>.1</radius>
              <length>.05</length>
            </cylinder>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <cylinder>
              <radius>.1</radius>
              <length>.05</length>
            </cylinder>
          </geometry>
        </visual>
      </link>
      <link name="right_wheel">
        <pose>0.1 -0.13 0.1 0 1.5707 1.5707</pose>
        <collision name="collision">
          <geometry>
            <cylinder>
              <radius>.1</radius>
              <length>.05</length>
            </cylinder>
          </geometry>
        </collision>
        <visual name="visual">
          <geometry>
            <cylinder>
              <radius>.1</radius>
              <length>.05</length>
            </cylinder>
          </geometry>
        </visual>
      </link>
      </model>
    </sdf>

これで、2つの車輪を持った台車を作ることが出来ました。先ほどと同じように、Gazeboで確認してみましょう。以下のようになっているはずです。 My_robot_caster_wheels

  1. <static>falseにし、左右のタイヤのヒンジを追加しましょう。以下のようにmodel.sdf を編集してください。 コピーはしないでください。手書きで追加していくことが、今回のチュートリアルです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?xml version='1.0'?>
<sdf version='1.4'>
  <model name="my_robot">
    <static>false</static>
    <link name='chassis'>
      <pose>0 0 .1 0 0 0</pose>
      <collision name='collision'>
        <geometry>
          <box>
            <size>.4 .2 .1</size>
          </box>
        </geometry>
      </collision>
      <visual name='visual'>
        <geometry>
          <box>
            <size>.4 .2 .1</size>
          </box>
        </geometry>
      </visual>
      <collision name='caster_collision'>
        <pose>-0.15 0 -0.05 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='caster_visual'>
      <pose>-0.15 0 -0.05 0 0 0</pose>
      <geometry>
        <sphere>
          <radius>.05</radius>
        </sphere>
      </geometry>
    </visual>
  </link>
  <link name="left_wheel">
    <pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
    <collision name="collision">
      <geometry>
        <cylinder>
          <radius>.1</radius>
          <length>.05</length>
        </cylinder>
      </geometry>
    </collision>
    <visual name="visual">
      <geometry>
        <cylinder>
          <radius>.1</radius>
          <length>.05</length>
        </cylinder>
      </geometry>
    </visual>
  </link>
  <link name="right_wheel">
    <pose>0.1 -0.13 0.1 0 1.5707 1.5707</pose>
    <collision name="collision">
      <geometry>
        <cylinder>
          <radius>.1</radius>
          <length>.05</length>
        </cylinder>
      </geometry>
    </collision>
    <visual name="visual">
      <geometry>
        <cylinder>
          <radius>.1</radius>
          <length>.05</length>
        </cylinder>
      </geometry>
    </visual>
  </link>
  <joint type="revolute" name="left_wheel_hinge">
    <pose>0 0 -0.03 0 0 0</pose>
    <child>left_wheel</child>
    <parent>chassis</parent>
    <axis>
      <xyz>0 1 0</xyz>
    </axis>
  </joint>
  <joint type="revolute" name="right_wheel_hinge">
    <pose>0 0 0.03 0 0 0</pose>
    <child>right_wheel</child>
    <parent>chassis</parent>
    <axis>
      <xyz>0 1 0</xyz>
    </axis>
  </joint>
  </model>
</sdf>

2つのジョイントをy方向<xyz>0 1 0</xyz>に回るようにし、台車に接続します。

  1. Gazeboを起動し、今作成したモデルを挿入してください。画面右側に写っている白い長方形(カラム)をクリックし、左側にドラッグしてください。

  2. すると、それぞれのジョイントの様々なコントロールを含むウィンドウが出現するでしょう。(コントロールしたいモデルが選択されていることを確認してください。)

  3. Forceタブの下にあるコントロールから、それぞれのジョイントの力を約0.1[N・m]に増加させてください。すると、ロボットが動き始めるはずです。(下動画を参考にしてください)

  1. おめでとうございまぁす!これで基本的なロボットモデルが作れました!

自分で試してみましょう

新しいロボットをどんどん作りましょう !

  • アイデア : 円柱形の脚の生えた四足の動物なんかどうでしょう。脚は半時計回りのジョイントで胴体にくっつけるなどすると良いでしょう。

  • アイデア : 前にシャベルがついた6輪の移動体なんかもどうでしょう。

Next >> メッシュを取り付ける