ROSの勉強　第26弾：倉庫シミュレーション

# #プログラミング ROS< 倉庫シミュレーション >

##はじめに
1つの参考書に沿って，ROS(Robot Operating System)を難なく扱えるようになることが目的である．その第26弾として，「倉庫シミュレーション」を扱う．

##環境
#####仮想環境
|||
|:-:|:--|
|ソフト|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|
|プログラミング言語|Python 3.8.5|
|シミュレーション|gazebo|

##倉庫シミュレーション
倉庫内での管理において，移動ロボットが使われることが多くある．その中で，正しくものを把握し，それに対する処理をこなす必要がある．そのシミュレーションを今までに学習してきた内容を踏まえて作り上げていく予定だった．後述するが，それはかなわなかった．よって一部のみを記述し，それ以外はなぜできなかったのかについて記述する．

##倉庫内モデルの準備
まず，環境を整える．
#####ワークスペースの作成
```
mkdir -p ~/ws/src/stockroom_bot
cd ~/ws/src
catkin_init_workspace
catkin_create_pkg stockroom_bot rospy
cd ~/ws/src/stockroom_bot
```

#####エイリアスの設定
```
alias sb = 'source ~/ws/devel/setup.bash; export GAZEBO_MODEL_PATH=${HOME}/ws/src/stockroom_bot/models/'
```
これを，~/.bashに追記すれば，sbというエイリアスが自動で作成される．これにより，'sb'とコマンドラインにタイプするだけで，stockroom_botの開発やテストのためのターミナル設定を読み込める．ここでは，Gazeboがモデルを呼び出す際に，あらかじめsbとコマンドを打っておけば``~/ws/src/stockroom_bot/models/``まで呼び出しに行くことを設定している．

#####モデル作成の準備
```
mkdir -p ~/ws/src/stockroom_bot/models/bin
```
先ほどの設定でPathに指定したフォルダを作成．

容器のモデルパッケージはそのディレクトリに作る．
``/models/binにmodel.config``というファイルを置く．

```xml:model.config
<?xml version = "1.0"?>
<model>
	<name>Bin</name>
	<sdf version = "1.4">model.sdf</sdf>
</model>
```
このファイルでは，単に名前が書かれており，
実際の容器モデルがmodel.sdfというファイルにあることをGazeboに伝えている．いわば**案内状**

#####モデル作成
``model.sdf``も``/models/bin``のフォルダに置く

```xml:model.sdf
<?xml version = '1.0'?>
<sdf version = '1.4'>
	<model name = 'box'> <!--configファイル内の名前と一致させる-->
		<static>true</static> <!--Gazeboが動力学を計算する必要がないことを示す→CPU実行時間を節約-->
		<link name = "bottom"> <!--物理学的な処理およびレンダリングに使用される幾何学的構造を記述できる-->
			<collision name = "collision_bottom">
				<geometry>
					<box>
						<size>0.4 0.4 0.02</size> <!--geometry box sizeを入れ子にすることで，40cm×40cm×2cmの直方体を作成-->
					</box>
				</geometry>
			</collision>
			<collision name = "collision_left">
				<pose>-0.2 0 0.1 0 0 0</pose> <!--x y z ロール ピッチ ヨーの座標変換で動かす-->
				<geometry><box><size>0.02 0.4 0.2</size></box></geometry>
			</collision>
			<collision name = "collision_right">
				<pose>0.2 0 0.1 0 0 0</pose>
				<geometry><box><size>0.02 0.4 0.2</size></box></geometry>
			</collision>
			<collision name = "collision_back">
				<pose>0 0.2 0.1 0 0 0</pose>
				<geometry><box><size>0.4 0.02 0.2</size></box></geometry>
			</collision>
			<collision name = "collision_front">
				<pose>0 -0.2 0.1 0 0 0</pose>
				<geometry><box><size>0.4 0.02 0.05</size></box></geometry>
			</collision>
			<visual name = "visual_bottom">
				<geometry><box><size>0.4 0.4 0.02</size></box></geometry>
				<material><script><name>Gazebo/Blue</name></script></material> <!--materialで，組み込みのGazeboのマテリアルを参照し図形の色を設定する-->
			</visual>
			<visual name = "visual_left">
				<pose>-0.2 0 0.1 0 0 0</pose> <!--x y z ロール ピッチ ヨーの座標変換で動かす-->
				<geometry><box><size>0.02 0.4 0.2</size></box></geometry>
			</visual>
			<visual name = "visual_right">
				<pose>0.2 0 0.1 0 0 0</pose>
				<geometry><box><size>0.02 0.4 0.2</size></box></geometry>
			</visual>
			<visual name = "visual_back">
				<pose>0 0.2 0.1 0 0 0</pose>
				<geometry><box><size>0.4 0.02 0.2</size></box></geometry>
			</visual>
			<visual name = "visual_front">
				<pose>0 -0.2 0.025 0 0 0</pose>
				<geometry><box><size>0.4 0.02 0.05</size></box></geometry>
			</visual>
		</link>
	</model>
</sdf>
```

これで容器のモデル作成が完了した．この時点で，Gazeboでの読み込みが可能となる．以下にその様子を示す．

```
~$gazebo
```
適当にgazeboを起動させると次のような何もない空間が用意される．
![gazebo](https://user-images.githubusercontent.com/61382602/111864650-a40f3000-89a5-11eb-8456-270b02991797.PNG)
下図のパネルには，先ほどまでに用意したフォルダが追加されている．
![gazebo_call_model](https://user-images.githubusercontent.com/61382602/111864653-a4a7c680-89a5-11eb-846d-6adacff8f97e.PNG)
それをクリックすると...
![model](https://user-images.githubusercontent.com/61382602/111864657-a5d8f380-89a5-11eb-8439-af4b047e49c5.PNG)
無事にgazebo上でモデルを出現させることができた．

##失敗
倉庫シミュレーションであるから，本来ならば，ここから容器を識別するためにラベル付けを行う予定であった．実際に学習しようとした内容は以下の通りである．

・容器に貼るラベル
・ALVARマーカーシステムを用いる
・ALVARはROSに組み込まれており，難しい設定をしなくとも，驚くほどうまく機能するから
・ALVARマーカータグは2次元の2値画像

```
sudo apt-get install ros-DISTRIBUTION-ar-track-alvar* imagemagick
```
によりパッケージを取得できるとmelodicあたりまでは，ROS wikiでの記載があった．
このパッケージは，ALVARを読み取るだけでなく，マーカータグを作成するプログラムも提供している．
複数個のラベルが必要になる時には，自動生成するスクリプトを用意すると便利(ALVARマーカータグの画像と各容器にラベルを付けるマテリアルスクリプトの用意)

どうやらnoeticではリリースされておらず，うまくインストールできなかった．
(2021/03/19)

今回はこのような理由により，これ以上に倉庫シミュレーションを進めることができなかった．また，リリースされたときには，ぜひやってみたい．ほかの方法もあるようだが，ROSの学習を一通り済ませてから試してみることにする．

##感想
今回は，不完全燃焼という感じではあったが，とりあえずモデル作成の基礎としてconfigファイルとsdfファイルの中身およびファイルの配置関係を学び，さらにGazeboに対してのPathの通し方と，環境設定などを簡単なコマンドにより再現できるエイリアスということについても知ることができた．倉庫シミュレーションそのものはできなかったが，多くのことを学ぶことができたと思う．

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