ROSの勉強　第29弾：移動ロボットの作成（2）

# #プログラミング 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：台座のモデリング
#####ソースコード
```xml: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](https://user-images.githubusercontent.com/61382602/112447567-d0a3bd00-8d94-11eb-9c9e-d2acf429f9b3.PNG)
#####パーツの関係図
![connection1](https://user-images.githubusercontent.com/61382602/112447589-d8636180-8d94-11eb-8d5d-32b4f61d4618.PNG)


###ステップ2：キャスターのモデリング
#####ソースコード
```xml: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](https://user-images.githubusercontent.com/61382602/112447768-03e64c00-8d95-11eb-81d8-af9dc4f7613f.PNG)
#####パーツの関係図
![connection2](https://user-images.githubusercontent.com/61382602/112447818-12346800-8d95-11eb-8cf3-03d6f8bd25a4.PNG)

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

```
yuya@ubuntu:~$ roslaunch make_robot1 display.launch gui:=True
```
![add_caster](https://user-images.githubusercontent.com/61382602/112448520-d2ba4b80-8d95-11eb-9522-7b665c9be9ee.gif)
なお，display.launchのソースコードについては，後に示す．

###ステップ3：車輪のモデリング
#####ソースコード
```xml: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](https://user-images.githubusercontent.com/61382602/112448179-7e16d080-8d95-11eb-9357-9831e022c14e.PNG)
#####パーツの関係図
![connection3](https://user-images.githubusercontent.com/61382602/112448192-81aa5780-8d95-11eb-9dbe-19a3c67df0fb.PNG)

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

```xml: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 著
　　　　　　　　　　　　　　　　　　　　　　　河田　卓志　監訳
　　　　　　　　　　  　松田　晃一，福地　正樹，由谷　哲夫　訳
　　　　　　　　　　　　　　　　　　オイラリー・ジャパン　発行