2016年10月17日月曜日

ROSで始めるロボティクス(3) ー 差動二輪ロボットを準備する


実際のロボットを動かす前に、シミュレータで動かしてみましょう。
まずは、ロボットのモデリングです。

次のような2つのモーターと2つの車輪で動作する移動ロボットを定義しましょう。






では、「パッケージ」を作成しましょう。
パッケージは、「catkin_create_pkg」コマンドで作成します。
今回はmy_robo_descriptionという名前のパッケージにしましょう。my_robo_descriptionにはロボットの定義ファイルを配置することにします。

$ cs
$ mkdir my_robo
$ cd my_robo
$ catkin_create_pkg my_robo_description


このコマンドで必要なフォルダやファイルが作成されます。

ROSではURDFファイルでロボットを定義していきます。URDFファイルはXMLで記述します。

$ cd my_robo_description
$ gedit my_robo.urdf

まずは車体を作成しましょう。エディタが開いたら、次のように入力してください。

<?xml version="1.0"?>
<robot name="my_robo">
  <link name="base_link">

    <visual>
      <geometry>
        <box size="0.400 0.200 0.100"/>
      </geometry>
    </visual>

    <collision>
      <geometry>
        <box size="0.400 0.200 0.100"/>
      </geometry>
    </collision>


  </link>
</robot>

各タグの説明をしましょう。
URDFではまず<robot>タグを一番外側に置きます。name属性でロボットの名前を指定しています。
<link>タグはロボットの部品です。<link>を組み合わせてロボットの構成を定義していきます。
<link>タグの中には<visual>と<collision>タグがあります。前者が見た目の設定、後者が実際のサイズ設定になります。ここでは<box>タグで20cm×40cm×10cmの四角い車体を定義しました。

では、このファイルを確認してみましょう。
確認のため、ROSの起動ファイル(ランチファイル)を作成します。ランチファイルはROSのコマンドをまとめて起動するためのスクリプトになります。

$ mkdir launch
$ cd launch
$ gedit display.launch
<launch>

  <arg name="model" default="$(find my_robo_description)/my_robo.urdf"/>
  <arg name="gui" default="True"/>
  <arg name="rvizconfig" default="$(find my_robo_description)/urdf.rviz"/>

  <param name="robot_description" command="$(find xacro)/xacro.py $(arg model)"/>
  <param name="use_gui" value="$(arg gui)"/>


  <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" args="-d $(arg rvizconfig)" required="true"/>

</launch>

rvizというツールを起動してURDFを表示するスクリプトです。RVizはロボットの各種情報を視覚化する重要なツールです。この先も何度も登場します。

ではロボットのモデルを表示してみましょう。作成したランチファイルは「roslaunch」コマンドを使い次のように起動します。

$ roslaunch my_robo_description display.launch

rvizが起動します。
左ペインのDisplays->Global Options->Fixed Frameにbase_linkと入力します。

左下の「Add」ボタンをクリックし、rviz->RobotModelを選択しOKを押します。


追加すると、次のように、my_robo.urdfで定義した車体が表示されます。



RVizでCtrl+sキーを押すと、現在の表示状態を保存することが出来ます。またRVizの終了時にも状態を保存するか訊かれます。ではRVizは終了してください。

では、次にタイヤを追加していきます。
エディタでmy_robo.urdfを開き、左のタイヤを表すLinkを追加します。

  <link name="left_wheel_link">
    <visual>
      <geometry>
        <cylinder radius="0.1" length="0.05"/>
      </geometry>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <material name="black"/>
    </visual>
  </link>

今度は<cylinder>タグで半径10cm、厚さが5cmの円柱を定義しました。

また、LinkとLinkは<Joint>タグで接続します。

車体Linkと左のタイヤLinkを<joint>タグで接続してみましょう。

  <joint name="left_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="left_wheel_link"/>
    <origin rpy="-1.5707 0 0" xyz="-0.100 0.130 0"/>
    <axis xyz="0 0 1"/>
  </joint>


<joint>タグではジョイントの性質をtypeで指定します。今回のようにタイヤの軸の場合、連続回転軸であるcontinuousを指定します。
<origin>タグではxyzでparentに対するジョイントの位置を指定し、rpyで軸の向きを決めます。
<axis>では回転する軸を指定します。

ここまでできたら一旦表示してみましょう。

$ roslaunch my_robo_description display.launch


Displaysより、RobotoModel->Links->balse_linkを展開します。Alphaに0.5を指定すると、車体が半透明になります。Show Axesにチェックを入れるとx軸(赤)y軸(緑)z軸(青)が表示されます。
このように、ロボットの座標系は、進行方向がx軸、横がy軸、上方向がz軸になっています。
left_wheel_linkも同じように表示してみましょう。

同じように右タイヤのLinkとJointを追加します。


  <link name="right_wheel_link">
    <visual>
      <geometry>
        <cylinder radius="0.1" length="0.05"/>
      </geometry>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <material name="black"/>
    </visual>
  </link>

  <joint name="right_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="right_wheel_link"/>
    <origin rpy="1.5707 0 0" xyz="-0.100 -0.130 0"/>
    <axis xyz="0 0 1"/>
  </joint>




次にキャスターとそのジョイントを追加します。

  <link name="caster_link">
    <visual>
      <geometry>
        <sphere radius="0.05"/>
      </geometry>
      <material name="green">
        <color rgba="0 1 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="caster_joint" type="fixed">
    <parent link="base_link"/>
    <child link="caster_link"/>
    <origin xyz="0.150 0 -0.050"/>
  </joint>


キャスターは球体で定義しました。球体は<sphere>タグで作成します。<joint>タグで、車体と接続します。



最後に足元を表すbase_footprintを定義しておきましょう。

<link name="base_footprint"/>
  <joint name="base_link_joint" type="fixed">
    <parent link="base_footprint"/>
    <child link="base_link"/>
    <origin xyz="0 0 0.100"/>
  </joint>

これで動輪2つとキャスターをもった移動ロボットの完成です!!

次回はシミュレータ上でロボットを動かせるようにします。






参考文献:
140 180 ROS , URDF

記載されている会社名、および商品名等は、各社の商標または登録商標です。

6 コメント:

  1. [display.launch] is neither a launch file in package [my_robo_description] nor is [my_robo_description] a launch file name
    The traceback for the exception was written to the log file

    このように表示されてしまいRVizが起動しません。

    返信削除
    返信
    1. catkin_ws内で
      $source devel/setup.bash

      削除
    2. 上記の通りやってみましたが同じエラーがでます
      [display.launch] is neither a launch file in package [my_robo_description] nor is [my_robo_description] a launch file name
      The traceback for the exception was written to the log file

      削除
    3. 私も同じ問題が出ていましたが、
      my_roboディレクトリは~/catkin_ws/src以下に置き、
      ~/catkin_ws/src/my_robo/my_robo_description/launch
      で$ roslaunch my_robo_description display.launchを
      実行するとRViZが起動しました

      削除
  2. このコメントは投稿者によって削除されました。

    返信削除
  3. このコメントは投稿者によって削除されました。

    返信削除

Related Posts Plugin for WordPress, Blogger...