1. プロジェクト紹介
タスクの概要
このプロジェクトでは、catkin_ws/src に drive_bot と ball_chaser という 2 つの ROS パッケージが作成されます。ロボットを設計し、特定の世界に配置し、白球を追いかけるようにプログラムする手順は次のとおりです。
1) ドライブボット:
-ロボット、白球、世界 (My World) を保持するmy_robot ROS パッケージを作成します。
- Unified Robot description Format (URDF) を使用して差動駆動ロボットを設計します。ロボットに LIDAR とカメラの 2 つのセンサーを追加します。ロボットの差動ドライブ、LIDAR、カメラ用の Gazebo プラグインを追加します。
・プロジェクトで構築したワールド(My World)にロボットを配置します。
-Gazebo ワールドに白いボールを追加し、世界の新しいコピーを保存します。
- world.launchファイルは、白球とロボットを含む世界 (My World) を起動するために使用されます。
2)ボールチェイサー:
- C++ ノードを保持するball_chaser ROS パッケージを作成します。
-線形 X 速度と Z 角速度を制御することでロボットを駆動する ball_chaser/command_robot サービスを提供するdrive_bot C++ ノードを作成します。サービスはホイール ジョイントに発行し、要求された速度を返す必要があります。
- process_image C++ ノードを作成して、ロボットのカメラ画像を読み取り、それを分析して白いボールの存在と位置を判断します。画像に白いボールが表示されると、書き込まれたノードはクライアントを介してサービスを要求し、ロボットを駆動してそれを追跡します。
- ball_chaser.launch は、 drive_bot ノードと process_image ノードの両方を実行する必要があります。
プロジェクトフォルダー
プロジェクトのコミットは、リストされているすべてのファイルを含む次のディレクトリ構造を参照します。
Project # Go Chase It Project
├── my_robot # my_robot package
│ ├── launch # launch folder for launch files
│ │ ├── robot_description.launch
│ │ ├── world.launch
│ ├── meshes # meshes folder for sensors
│ │ ├── hokuyo.dae
│ ├── urdf # urdf folder for xarco files
│ │ ├── my_robot.gazebo
│ │ ├── my_robot.xacro
│ ├── world # world folder for world files
│ │ ├── <myworld>.world
│ ├── CMakeLists.txt # compiler instructions
│ ├── package.xml # package info
├── ball_chaser # ball_chaser package
│ ├── launch # launch folder for launch files
│ │ ├── ball_chaser.launch
│ ├── src # source folder for C++ scripts
│ │ ├── drive_bot.cpp
│ │ ├── process_images.cpp
│ ├── srv # service folder for ROS services
│ │ ├── DriveToTarget.srv
│ ├── CMakeLists.txt # compiler instructions
│ ├── package.xml # package info
└──
2. my_robot を設定する
このプロジェクトの最初のタスクは、my_robot ROS パッケージを作成することです。my_robot では、空の Gazebo ワールド ファイルが保存され、起動されます。プロジェクトが進行するにつれて、ロボットがモデル化されて保存され、空のワールド ファイルがプロジェクトで作成されたワールドに置き換えられます。次に、以下の手順に従って my_robot をセットアップします。
my_robot パッケージを作成する
1) catkin_ws を作成して初期化する
$ mkdir -p /home/workspace/catkin_ws/src
$ cd /home/workspace/catkin_ws/src
$ catkin_init_workspace
2) catkin_ws の src ディレクトリに移動し、my_robot パッケージを作成します。
$ cd /home/workspace/catkin_ws/src/
$ catkin_create_pkg my_robot
3) 次に、worlds ディレクトリと launch ディレクトリを作成します。これにより、パッケージの構造がさらに定義されます。
$ cd /home/workspace/catkin_ws/src/my_robot/
$ mkdir launch
$ mkdir worlds
空の Gazebo World ファイルを作成して保存します
worlds ディレクトリに、空の Gazebo ワールド ファイルを作成して保存します。念のために言っておきますが、Gazebo では、ワールドはロボットなどのモデルと特定の環境の集合です。この世界に固有の他の物理プロパティを定義することもできます。
1) 空白の Gazebo ワールドを作成します
Gazebo の空白の世界は、オブジェクトもモデルも存在しない単純な世界です。
$ cd /home/workspace/catkin_ws/src/my_robot/worlds/
$ touch empty.world
2) empty.world に以下を追加します。
<?xml version="1.0" ?>
<sdf version="1.4">
<world name="default">
<include>
<uri>model://ground_plane</uri>
</include>
<!-- Light source -->
<include>
<uri>model://sun</uri>
</include>
<!-- World camera -->
<gui fullscreen='0'>
<camera name='world_camera'>
<pose>4.927360 -4.376610 3.740080 0.000000 0.275643 2.356190</pose>
<view_controller>orbit</view_controller>
</camera>
</gui>
</world>
</sdf>
.worldファイルは、XML ファイル形式を使用して、Gazebo 環境に関連するすべての要素を記述します。ここで作成されるシンプルな世界には次の要素があります。
- <sdf> : ドキュメントの構造全体とコンテンツをカプセル化する基本要素。
- <world> : world 要素は、ワールドの説明とワールドに関連するいくつかの属性を定義します。この例では、グラウンド プレーン、光源、カメラをワールドに追加します。各モデルまたは属性には、詳細を追加するためのさらなる要素を含めることができます。たとえば、カメラには位置と向きを定義するポーズ要素があります。
- <include> : include 要素は、 <uri>要素とともに、特定のモデルへのパスを提供します。Gazebo では、デフォルトでいくつかのモデルが利用可能です。
起動ファイルを作成します ( Launch File )
ROS のスタートアップ ファイルを使用すると、複数のノードを同時に実行できるため、個別のシェルまたはターミナルで複数のノードを定義して起動するという面倒な作業を回避できます。
1) world.launch ファイルを作成します。
$ cd /home/workspace/catkin_ws/src/my_robot/launch/
$ touch world.launch
2) world.launchに以下を追加
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<!-- World File -->
<argname="world_file"default="$(find my_robot)/worlds/empty.world"/>
<!-- Launch Gazebo World -->
<includefile="$(find gazebo_ros)/launch/empty_world.launch">
<argname="use_sim_time"value="true"/>
<argname="debug"value="false"/>
<argname="gui"value="true" />
<argname="world_name"value="$(arg world_file)"/>
</include>
</launch
.worldファイルと同様、.launchファイルは XML ベースです。スタートアップ ファイルの構造は 2 つの部分で構成されます。
- まず、<arg>要素を使用してパラメータを定義します。このような各要素には、name属性とデフォルト値があります。
- 次に、gazebo_rosパッケージから、world.launchファイルをインクルードします。empty_world ( https://github.com/ros-simulation/gazebo_ros_pkgs/blob/kinetic-devel/gazebo_ros/launch/empty_world.launch )ファイルには、私たちが作成するワールドに継承される重要な定義セットが含まれています。world_nameパラメーターとパラメーター値 ( value ) として渡された.worldファイルへのパスを使用すると、Gazebo でワールドを起動できます。
empty.world を開始する
$ cd /home/workspace/catkin_ws/
$ catkin_make
$ source devel/setup.bash
$ roslaunch my_robot world.launch
3. 統一ロボット記述形式 (URDF) を理解する
ROS を使用するため、ロボットは、 XML ( https://www.w3schools.com/xml/xml_whatis.asp )マークアップ言語を使用して、統一ロボット記述形式 (URDF) を使用してモデル化する必要があります。URDF ファイルを使用して、ロボット モデル、その運動学的プロパティ、視覚要素、さらにはロボットのモデル センサーを定義できます。URDF は、チェーンまたはツリー構造のジョイントによって接続された、剛にリンクされたロボットのみを記述できます。柔軟なリンクや平行リンクを備えたロボットを記述することはできません。
2 つのリンクと 1 つのジョイントを持つ単純なロボットは、URDF によって次のように記述できます。
<?xml version="1.0"?>
<robot name="two_link_robot">
<!--Links-->
<linkname="link_1">
<visual>
<geometry>
<cylinderlength="0.5"radius="0.2"/>
</geometry>
</visual>
</link>
<linkname="link_2">
<visual>
<geometry>
<boxsize="0.6 0.1 0.2"/>
</geometry>
</visual>
</link>
<!--Joints-->
<jointname="joint_1"type="continuous">
<parentlink="link_1"/>
<childlink="link_2"/>
</joint>
</robot>
URDF ファイルを使用していくつかのロボットと環境のプロパティを記述するため、これらのファイルは長くて退屈になる傾向があります。そのため、Xacro (XML マクロ) を使用して 1 つの URDF ファイルを複数の Xacro ファイルに分割します。構文は同じままですが、ロボットの記述をより小さなサブシステムに分割できるようになりました。
URDF (および Xacro) ファイルは基本的に XML であるため、マークアップを使用してロボットのジオメトリとプロパティを定義します。最も重要で一般的に使用されるタグとその要素は次のとおりです。
<ロボット> </ロボット>
これは、特定のボットに関連する他のすべてのタグを含むトップレベル (最上位) タグです。
<リンク> </リンク>
ロボット内のすべての剛体リンク (リンク) をこのタグに関連付ける必要があります。
属性
名前: 一意のリンク名属性が必要です。
エレメント
<ビジュアル> </ビジュアル>
この要素は、視覚化を目的としてオブジェクトの外観を指定します。
名前 |
説明 |
<原点> |
リンクの参照フレームに対するビジュアル要素の参照フレーム。 |
<形状> |
ビジュアルの形。 |
<素材> |
視覚要素のマテリアル。 |
<衝突> </衝突>
リンクの衝突プロパティ。これはリンクの視覚的なプロパティとは異なる場合があることに注意してください。たとえば、計算時間を短縮するために、より単純な衝突モデルがよく使用されます。
名前 |
説明 |
<原点> |
リンクの参照フレームを基準とした、衝突する要素の参照フレーム。 |
<形状> |
上記の「ビジュアル要素」のジオメトリの説明を参照してください。 |
<慣性> </慣性>
このラベルは、コンロッドの慣性特性を説明します。
名前 |
説明 |
<原点> |
これは、リンク基準系に対する慣性基準系の姿勢です。慣性座標系の原点は重心にある必要があります。 |
<質量> |
リンクの質量は、この要素の value 属性によって表されます。 |
<慣性> |
慣性座標系で表される 3x3 慣性モーメント マトリックス。慣性モーメント行列は対称であるため、ここでは属性 ixx、ixy、ixz、iyy、iyz、izz を使用して、この行列の 6 つの対角線より上の要素のみが指定されます。 |
重要な要素を含む <link> タグのスニペットの例:
<linkname="link_1">
<inertial>
<origin xyz="0 0 0.4" rpy="0 0 0"/>
<massvalue="${mass1}"/>
<inertia ixx="30" ixy="0" ixz="0" iyy="50" iyz="0" izz="50"/>
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="package://kuka_arm/meshes/kr210l150/visual/link_1.dae"/>
</geometry>
<material name="">
<color rgba="0.75294 0.75294 0.75294 1"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="package://kuka_arm/meshes/kr210l150/collision/link_1.stl"/>
</geometry>
</collision>
</link>
<link>标签有更多可选元素,可用于定义其他属性,如颜色、材质、纹理等。有关这些标签的详细信息,请参阅此链接(urdf/XML/link - ROS Wiki)。
<joint> </joint>
该标签通常定义机器人中两个连杆之间的单个关节。可以使用此标签定义的关节类型包括:
Name |
Description |
Fixed |
没有自由度的刚性接头。用于焊接连接。 |
Revolute |
绕轴旋转的有一定范围的关节。 |
Prismatic |
滑动关节:沿轴滑动的范围有限的关节 |
Continuous |
类似于转动关节,但没有限制。它可以围绕一个轴连续旋转。 |
Planar |
二维移动关节,允许在垂直于轴的平面上运动 |
Floating |
具有6个自由度的关节,一般用于四旋翼飞行器和无人机 |
属性
名称 唯一的关节名
类型 关节类型
元素
为了定义关节,我们需要声明旋转/平移轴以及组成关节的两个连杆之间的关系。
名称 |
描述 |
<origin> |
这是从父连杆到子连杆的转换。关节位于子连杆的原始点。 |
<parent> |
各自连接的父连杆的名称。 |
<child> |
各自连接的子连杆的名称。 |
<axis> |
为转动关节定义旋转轴,为移动关节定义平移轴,为平面关节定义曲面法线。固定和浮动关节不使用轴场。 |
包含重要元素的<joint>标签示例片段:
<joint name="joint_2"type="revolute">
<origin xyz="0.35 0 0.42" rpy="0 0 0"/>
<parent link="link_1"/>
<childlink="link_2"/>
<axisxyz="0 1 0"/>
</joint>
<joint>标签下的其他可选元素可以在这里找到(urdf/XML/joint - ROS Wiki)。
还有更多可选的标签和属性,有助于定义机器人的各种动态和运动学属性,以及传感器和执行器。要获得完整的列表,请参阅URDF上的ROS文档(urdf - ROS Wiki)。