[Ubuntu20.04] ROS-noeticインストールからturtlebot3のSLAMシュミレーションまで

##ROS-noeticでSLAMシミュレーション

SLAMを試してみたいと思ったので、入り口としてお試し。

- インストール
- シミュレーション実行
- SLAM、mapping

---
環境
ubuntu 20.04

---

###ROSのインストール
ROS-noeticのインストールは、手っ取り早く行うには、ROBOTISのshellを使うといいと思います。

```sh:
$ git clone https://github.com/ROBOTIS-GIT/robotis_tools.git
$ cd robotis_tools
$ chmod 755 ./install_ros_noetic.sh
$ bash ./install_ros_noetic.sh
```
この方法でインストールすると、~/.bashrcに
alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catkin_ws && catkin_make'
のショートカットが作成され便利です。
cs,cmは結構使います。
即座に反映させたい場合は

```
source ~/.bashrc
```
と打ち込んでください


###ワークスペースの作成
上記のshellでインストールすればcatkin_wsというワークスペースができますので飛ばしてください。
それ以外の方法でインストールした人は、ワークスペースを作成します、名前(ここではcatkin_ws)はなんでもいいです。

```sh:
cd
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ~/catkin_ws && catkin_make
```
---
###turtlebot3のシミュレーション環境の作成

branchをnoetic-devに指定して、パッケージをインストール

```sh:
$ cd
$ cd ~/catkin_ws/src
$ git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
$ git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git
$ cd ~/catkin_ws && catkin_make
```

turtlebot3にはBurger, Waffle, Waffle Piの３種類あるので、指定しなけれなりません。どれでもいいですが、今回はBurgerを選ぶことにします。

毎度 export TURTLEBOT3_MODEL=burger を打ちたくないので、bashrcに書き込みます。
(エディターは使い慣れているもので)

```sh:
$ gedit ~/.bashrc
```
最後の行に


export TURTLEBOT3_MODEL=burger

を書き込んで保存し閉じます。

```sh:
$ source ~/.bashrc
```
で反映させます。(今後TURTLEBOT3_MODELが不明的なエラー出たらまたこれを実行してください)

turtlebot3のシミュレーターのインストール

```sh:
$ cd ~/catkin_ws/src
$ git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
$ cd ~/catkin_ws && catkin_make
```

###シミュレーターの実行[RViz]

```sh:
$ roslaunch turtlebot3_fake turtlebot3_fake.launch
```

これでturtlebot3が立ち上がリます。

![Screenshot from 2020-11-15 02-29-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486822/2117c59f-7ecd-2717-9a0f-e139e06306fd.png)

以下のコマンドでキーボード操作できるようになります、”新しいターミナルで”実行してください。

```sh:
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
```
###シミュレーターの実行[Gazebo]

ターミナルをすべて終了して新規で立ち上げます。

次はGazeboでシミュレーションを実行します。RVizはデバッグツールですが、Gazeboでは任意の環境下でシミュレートできます。

ここでは定番(?)のポールの立った空間でシミュレートします。

```sh:
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch
```
(turtlebot3_simulations/turtlebot3_gazebo/launch/ に様々な環境が用意されています。
何もない空間>>turtlebot3_empty_world.launch
 家の中>>turtlebot3_house.launch)


![Screenshot from 2020-11-15 02-49-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486822/f0f3fe3a-87ee-5de6-8d8a-743937a9e6db.png)
![Screenshot from 2020-11-15 02-49-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486822/0ff57806-7be9-535a-8fb5-044a7b090991.png)


次に障害物を避けて自動制御させます

```sh:
$ roslaunch turtlebot3_gazebo turtlebot3_simulation.launch
```

これでgazeboをみると自立制御していることがわかります。

このとき、RVizを起動すれば、Turtlebot3がレーザーで距離を測っている様子を可視化できます。

```sh:
$ roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch
```

![Screenshot from 2020-11-15 03-02-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486822/7c9681fe-8b7a-cee3-76af-c3a078fe1ac2.png)

---

###最後にSLAMシミュレーション

ターミナルをすべて終了して新規で立ち上げます。
SLAMは自己位置推定とマップ生成を同時実行するものです。

SLAMのモジュールをインストールします。

```sh:
$ sudo apt-get install ros-noetic-slam-gmapping
```

そしてもう一度先程のGazeboを起動させます。

```sh:
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch
```

Gazeboが起動したら、早速SLAMを実行します。

```sh:
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
```

![Screenshot from 2020-11-15 03-11-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486822/fb0bc59e-ef07-1e11-d011-524cace12fc8.png)

これでマップ生成が始まります。

この空間全体のマップを生成するためには、先程の衝突しないプログラムを実行すれば良いです。

```sh:
$ roslaunch turtlebot3_gazebo turtlebot3_simulation.launch
```

これでしばらく放っておけば、全体マップが作成できます。

![Screenshot from 2020-11-15 03-31-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486822/a7c45446-07b1-9542-2d2e-cc00ee6455e2.png)

マップを生成できたら保存したいです。
まずmap serverのインストールをします。

```sh:
$ sudo apt-get install ros-noetic-map-server
```

保存したいフォルダ(ここではmaps)を作成し、そこに保存します。

```sh:
$ mkdir ~/maps
$ cd ~/maps
$ rosrun map_server map_saver
```
エラーが出る場合: rosrun map_server map_server にしているかもしれません、２回目はsaverです。

map.pgmを開くと取得した地図を表示できます。

![Screenshot from 2020-11-15 03-48-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486822/9c743eed-dffb-7600-51b2-f95f0387e6d4.png)

----

参考
[How to Launch the TurtleBot3 Simulation With ROS](
https://automaticaddison.com/how-to-launch-the-turtlebot3-simulation-with-ros/)
[「ROS ロボットプログラミングバイブル」](https://www.amazon.co.jp/ROS%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB-%E8%A1%A8-%E5%85%81%E3%80%93/dp/4274221962/ref=cm_cr_arp_d_pl_foot_top?ie=UTF8)