LoginSignup
1
2

More than 3 years have passed since last update.

ROSの勉強 第29弾:移動ロボットの作成(2)

Last updated at Posted at 2021-03-25

#プログラミング ROS< 移動ロボットの作成(2) >

はじめに

1つの参考書に沿って,ROS(Robot Operating System)を難なく扱えるようになることが目的である.その第29弾として,「移動ロボットの作成(2)」を扱う.

環境

仮想環境
ソフト VMware Workstation 15
実装RAM 2 GB
OS Ubuntu 64 ビット
isoファイル ubuntu-mate-20.04.1-desktop-amd64.iso
コンピュータ
デバイス MSI
プロセッサ Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz
実装RAM 8.00 GB (7.89 GB 使用可能)
OS Windows (Windows 10 Home, バージョン:20H2)
ROS
Distribution noetic
シミュレーション gazebo

移動ロボットの作成

ROSを使って,ほとんどの新しいロボットを制御する手順は次のようである.

1. ROSのメッセージインタフェースを決める.
2. ロボットのモータ用ドライバを書く.
3. ロボットの物理構造を書く.
4. Gazeboのシミュレーションで使用できるようにモデルに物理的特性を追加する.
5. tfを介して座標変換データを配信し,rvizでそれを可視化する.
6. センサを追加する.ドライバとシミュレーションのサポートも必要.
7. ナビゲーション等の標準的なアルゴリズムを適用する.

移動ロボットを例にその流れを確認していく.
今回は,3についてまとめて移動ロボットの作成(2)として扱うこととする.

手順3:ロボットのモデリング: URDF

例:TortoiseBot

  • ロボットをたくさんの標準的なROSツールで使用するには,そのロボットの運動学上のモデルを書き下ろす必要がある.⇒ロボットの物理的な構成を記述する必要がある.

いくつ車輪を持っているか?
それらがどこに置かれているか?
どの方向に向いているか?    など

この情報は,rvizでロボットの状態を可視化したり,gazeboでロボットをシミュレート
したり,ナビゲーションスタックのようなシステムで何らかの目的を持って実世界を
移動させたりするのに使われる.

  • ROSでは,URDF(Unified Robot Description Format)と呼ばれるXMLによる記述形式でロボットモデルを表現する.

この形式は,2輪の玩具から歩行型ロボットまで多種多様なロボットを表現できる.これは,Gazebo環境の構築のために用いるSDFに似ている.GazeboはURDFも解釈することができ,ほとんどのROSツールはURDFを必要としている.したがって,新しいロボットをモデル化するのはURDFを用いるのが最も良い

  • リンクは剛体で,台座や車輪など
  • 関節は2つのリンクを接続し,それらが互いに対してどのように動くことができるかを示している.
関節タイプ 説明
continuous 1つの軸の周りに無限に回転できる関節
revolute 無限回転機構を持つ関節に似ているが,角度の上限下限の制限付きの関節
prismatic 位置の上限下限の制限付きの単一軸に沿って直線的にスライドする関節
planar 平面上の並進とその平面に対して垂直な軸で回転することができる関節
floating 完全な6次元の並進と回転ができる関節
fixed 固定された関節.どんな動作もしない特殊な関節タイプ

実装

以下では,少しずつロボットを構築する様子をコードと共に示す.また,urdf_to_graphizを使って,パーツの関係性を示す.

ステップ1:台座のモデリング

ソースコード
base_model.urdf
<?xml version="1.0"?>
<robot name="tortoisebot">

    <!--台座のモデル-->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.6 0.3 0.3"/>
            </geometry>
            <material name="silver">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>
</robot>
rvizでの様子

Base_model

パーツの関係図

connection1

ステップ2:キャスターのモデリング

ソースコード
add_caster.urdf
<?xml version="1.0"?>
<robot name="tortoisebot">

    <!--台座のモデル-->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.6 0.3 0.3"/>
            </geometry>
            <material name="silver">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>

    <!--キャスターのモデル-->
    <link name="front_caster">
        <visual>
            <geometry>
                <box size="0.1 0.1 0.3"/>
            </geometry>
            <material name="silver"/>
        </visual>
    </link>
    <!--台座とキャスターをつなぐジョイント-->
    <joint name="front_caster_joint" type="continuous">
        <axis xyz="0 0 1"/>
        <parent link="base_link"/>
        <child link="front_caster"/>
        <origin rpy="0 0 0" xyz="0.3 0 0"/>
    </joint>
</robot>
rvizでの様子

Add_caster

パーツの関係図

connection2

また,次のコマンドを実行することで,キャスタの動きをGUIにより手動で確認することができる.

yuya@ubuntu:~$ roslaunch make_robot1 display.launch gui:=True

add_caster
なお,display.launchのソースコードについては,後に示す.

ステップ3:車輪のモデリング

ソースコード
add_wheels.urdf
<?xml version="1.0"?>
<robot name="tortoisebot">

    <!--台座のモデル-->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.6 0.3 0.3"/>
            </geometry>
            <material name="silver">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>

    <!--キャスターのモデル-->
    <link name="front_caster">
        <visual>
            <geometry>
                <box size="0.1 0.1 0.3"/>
            </geometry>
            <material name="silver"/>
        </visual>
    </link>
    <!--台座とキャスターをつなぐ関節-->
    <joint name="front_caster_joint" type="continuous">
        <axis xyz="0 0 1"/>
        <parent link="base_link"/>
        <child link="front_caster"/>
        <origin rpy="0 0 0" xyz="0.3 0 0"/>
    </joint>

    <!--前輪のモデル-->
    <link name="front_wheel">
        <visual>
            <geometry>
                <cylinder length="0.05" radius="0.035"/>
            </geometry>
            <material name="black"/>
        </visual>
    </link>
    <!--前輪とキャスターをつなぐ関節-->
    <joint name="front_wheel_joint" type="continuous">
        <axis xyz="0 0 1"/>
        <parent link="front_caster"/>
        <child link="front_wheel"/>
        <origin rpy="-1.5708 0 0" xyz="0.05 0 -.15"/>
    </joint>

    <!--右後方車輪のモデル-->
    <link name="right_wheel">
        <visual>
            <geometry>
                <cylinder length="0.05" radius="0.035"/>
            </geometry>
            <material name="black">
                <color rgba="0 0 0 1"/>
            </material>
        </visual>
    </link>
    <!--右後方車輪と台車をつなぐ関節-->
    <joint name="right_wheel_joint" type="continuous">
        <axis xyz="0 0 1"/>
        <parent link="base_link"/>
        <child link="right_wheel"/>
        <origin rpy="-1.5708 0 0" xyz="-0.2825 -0.125 -.15"/>
    </joint>

    <!--左後方車輪のモデル-->
    <link name="left_wheel">
        <visual>
            <geometry>
                <cylinder length="0.05" radius="0.035"/>
            </geometry>
            <material name="black"/>
        </visual>
    </link>
    <!--左後方車輪と台車をつなぐ関節-->
    <joint name="left_wheel_joint" type="continuous">
        <axis xyz="0 0 1"/>
        <parent link="base_link"/>
        <child link="left_wheel"/>
        <origin rpy="-1.5708 0 0" xyz="-0.2825 0.125 -.15"/>
    </joint>
</robot>
rvizでの様子

Add_wheels

パーツの関係図

connection3

実行launchファイル

上記の実行時に用いたlaunchファイルを以下に示す.ここで示すlaunchファイルはurdf_tutorialdisplay.launchを一部改編したものである.

display.launch
<launch>

  <arg name="model" default="$(find make_robot1)/urdf/add_wheels.urdf"/>
  <arg name="gui" default="true" />
  <arg name="rvizconfig" default="$(find urdf_tutorial)/rviz/urdf.rviz" />

  <param name="robot_description" command="$(find xacro)/xacro $(arg model)" />

  <node if="$(arg gui)" name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
  <node unless="$(arg gui)" name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />

</launch>

改編部分は,<arg name="model" default="$(find make_robot1)/urdf/add_wheels.urdf"/>である.また,上での実装ではadd_wheels.urdfの部分を変えて実行している.rvizの設定はそのままにしている.

感想

今回はURDFについて学んだ.関節タイプもまとめることができ,実際に少しずつ構築する中で理解も深められたのではないかと思う.なお,URDFのソースコードは参考文献に載っているものから抜粋して少しずつ構築した.そのなかで,material name='black'ではblackが定義されていないという警告が表示された.エラーではないため放っているが,必要であれば変えればよいと思っている.

参考文献

プログラミングROS Pythonによるロボットアプリケーション開発
        Morgan Quigley, Brian Gerkey, William D.Smart 著
                       河田 卓志 監訳
            松田 晃一,福地 正樹,由谷 哲夫 訳
                  オイラリー・ジャパン 発行

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2