「プログラミングROS」を買ったので真似して動かしてみた


※注意！
Dockerでいろいろやろうと思ったのですが、諸事情によりWSL2でやる方針に切り替えています。

#やること
プログラミングROSを買ったら、サンプルがいっぱい載ってる本だったので、アレンジしながら自分でもやってみることにしました。
写経するだけとはいえ、多少古い本なので自分の環境に合わせてアレンジし、記録を取りながら実行しました。
WindowsでDockerを使ってと思いましたが、最終的にWSL2で行っています。

#Windows10ProのDockerで動かす
ちょっと前のエントリーでWindows環境を作ったので、Windowsで動かしてみます。
[Docker＋ROSの環境をWindows10PROで整える](https://qiita.com/t_kumazawa/items/aa541758be558673e76b)

#ROS Dockerの説明を見ながら環境のテスト

[ROS docker hub](https://hub.docker.com/_/ros)

ROSのdockerイメージは展開済みなので、動かし方などをこちらを参考にしながら動かします。
docker desktopから動かすと、タブキーで候補の表示ではなくタブが入ってしまうので、commandを使います。

```bash:コンテナのライフサイクルを超えてもファイルを保存。ネットワークを作る
$ docker run -v "/home/ubuntu/.ros/:/root/.ros/" ros
$ docker network create foo
```

コンテナを1つ立ち上げて、roscoreを動かします。

```bash:roscore実行
docker run -it --rm --net foo --name master tkumazawa/ros:build roscore
```

ROSのコンテナの名前やタグの名前は適宜変更で。

```bash:talkerという名前で立ち上げ
$ docker run -it --rm --net foo --name talker --env ROS_HOSTNAME=talker --env ROS_MASTER_URI=http://master:11311 tkumazawa/ros:build
```

roscoreに接続できるように設定して起動しました。

```bash:listenerという名前で立ち上げ
$ docker run -it --rm --net foo --name listener --env ROS_HOSTNAME=listener --env ROS_MASTER_URI=http://master:11311 tkumazawa/ros:build
```
listenerも立ち上げ。
dockerコマンドの最後に、コマンド`rosrun rosパッケージ ノード`を記述して実行してもOK

##This node is not a swarm manager
サービスのリストを表示するコマンドを実行すると何故かエラーが発生します。

```bash:エラー発生
$ docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
```

よくわからないので後で調べます。

##パッケージの登録ができない（ポカ）
自分のgithubのアカウントからソースをcloneして、`catkin build`します。
`source /opt/ros/melodic/setup.bash`も忘れずに実行しないと登録されません。
**setup.bash** だから!`.sh`だと動かないから!

些細な間違えで1時間ほど無駄にした。

##改めて動作確認
dockerでfooネットワーク上に、３つのコンテナを立ち上げました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/afe23898-59ea-ba83-1d1c-84420826a380.png)

talkerで適当なスクリプトを起動して実行します。

```bash:なにかtalkerのサンプルっぽいものを動かす
$ rosrun ros_rc_package python_talker.py
[INFO] [1581736634.135121]: send: default
[INFO] [1581736635.135659]: send: default
[INFO] [1581736636.136453]: send: default
[INFO] [1581736637.136407]: send: default
[INFO] [1581736638.136382]: send: default
[INFO] [1581736639.136593]: send: default
[INFO] [1581736640.136457]: send: default
[INFO] [1581736641.136314]: send: default
[INFO] [1581736642.136411]: send: default
```

listenerでrosコマンドを使ってトピックを確認します。

```bash:トピックを確認してみる
$ rosnode list
/rosout
/talker

$ rostopic list
/chatter
/rosout
/rosout_agg

$ rostopic echo /chatter
data: "send: default"
---
data: "send: default"
---
data: "send: default"
---
data: "send: default"
---
data: "send: default"
---
data: "send: default"
---
```

いろいろ出てきました。
これで、教科書の内容を実行できる程度の環境が出来上がったかと思います。

##いきなり７章のWander-bot(ワンダーボット)をやってみる
「プログラミングROS」の序盤を飛ばして７章をやってみようと思います。
パッケージを作成するところから。

```bash:ワークスペースに移動してワンダーボットパッケージを作る
$ cd ~/catkin_ws/src
$ catkin_create_pkg wanderbot rospy geometry_msgs sensor_msgs
Created file wanderbot/package.xml
Created file wanderbot/CMakeLists.txt
Created folder wanderbot/src
Successfully created files in /root/catkin_ws/src/wanderbot. Please adjust the values in package.xml.
```

教科書のソースコードがここにあるので使わせていただく。
[rosbook](https://github.com/osrf/rosbook/blob/master/wanderbot/red_light_green_light.py)
教科書に書いてある通り、先頭の`# BEGIN ALL`を取り除いて使います。
`wonderbot\scripts\red_light_green_light.py`を置いて、`chmod +x red_light_green_light.py`で実行可能状態にする。

Turtlebot用のシミュレーションソフトをインストールする。
・・・と思ったら、教科書はindigoでやっていて、うちはmelodicなのだが、どうもmelodicではインストールできないらしい。

やり方を調べてみるとこんな感じ。

[ROS MelodicでTurtlebot3をGazeboで動かしてついでにSLAMする](https://qiita.com/protocol1964/items/1e63aebddd7d5bfd0d1b)

gazeboもインストールしていないので、インストールする。
`apt search ros-melodic`で必要そうなパッケージを探す。

sudo apt-get install ros-melodic-gazebo-ros-control
実行すると、結構時間がかかります。

エラーが出ますが、とりあえず実行はできるようです。

```
$ gazebo
ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM default
AL lib: (EE) ALCplaybackAlsa_open: Could not open playback device 'default': No such file or directory
```

しかし、gazeboのdockerイメージもあるんじゃないのかな？と思ったら、gazeboのdockerイメージもありました。
ちょっと使ってみたい気がします。

ROSデスクトップのイメージを落とす
>docker pull osrf/ros:melodic-desktop-full
>docker run -it --rm $DOCKER_DISP osrf/ros:melodic-desktop-full rqt

dockerのGUIをWidowsで表示する方法
https://kamino.hatenablog.com/entry/docker_gui
Dockerにインストールしたものを動かすことを調べていたら、WSL2でも動かせるという情報をキャッチ。

##Windows WSL2でgazeboを動かす

[WSL2を試す：Gazeboも動くぞ！](https://demura.net/misc/16305.html)

おお！これをやってみよう。
WindowsInsiderProgramに参加する必要があります。



```bash:WindowsPowerShell
> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachineplatform


Path          :
Online        : True
RestartNeeded : False


> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux


Path          :
Online        : True
RestartNeeded : False

> wsl --set-version Ubuntu-18.04 2
Conversion in progress, this may take a few minutes...
For information on key differences with WSL 2 please visit https://aka.ms/wsl2
Conversion complete.
```

2.3分どころか、`Conversion complete.`が出るまで結構時間がかかったので、珈琲でも入れながら待ちましょう。

```
> wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         2
```
これでWSL2にコンバートされたはずです。


ディスプレイの設定を「高パフォーマンスNVIDIAプロセッサ」に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/4dad528d-fcc7-ba35-de24-4a39e2c9a773.png)

そのほか、ツールを入れたり設定したりは、これらのサイトを参考にさせてもらいました。
Xサーバーをインストールします。
https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html

ROSもInstallしてしまいます。
https://demura.net/misc/16518.html

私のように古い教科書をもとにROSを入れようとして問題を解決している方がいらっしゃいました。
ここを参考に、実行するときにrospkgが問題になる場合、無理やりaptやpipでpython2にインストールして回避しました。
https://yondakana.blogspot.com/2018/03/ros.html


##GUIが表示されない
Xサーバーの設定をしたのに、GUIが表示できず、大変苦労しました。
表示ができなかった原因はFireWallの設定でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/847b6372-782e-8cba-9121-2c875999ba30.png)

FireWallの設定→プロパティ→パブリックプロファイル→保護されているネットワーク接続、で、WSLを除外したらOK。

##gazeboインストール
こちらを参考に、順番にインストールを実行します。
「2.  Turtlebot3 リモートPC用のパッケージインストール」から順番に処理をしていくと、簡単に動きます。
https://demura.net/education/16279.html

rvizもgazeboも起動しますね。

からっぽのワールドではちょっと味気ないので、なにかおいてある空間にします。
`roslaunch turtlebot3_gazebo turtlebot3_world.launch`


この映像は、教科書とかでよく見るやつですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/cbb6e245-5bcd-1afd-e6e4-200ace79f0a9.png)

拡大するとこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/16382efa-1336-50eb-9d5b-f49094051e21.png)

##mappingも試してみよう
WSL2でも普通のUbuntu18.04と同じにgmappingが動くとのちのモチベーションになりそうです。
こちらを参考にやってみます。
[ROS MelodicでTurtlebot3をGazeboで動かしてついでにSLAMする](https://qiita.com/protocol1964/items/1e63aebddd7d5bfd0d1b)

動かすときに、モデルの環境変数を以下のようにして設定を固定しないと動きませんでした。
`export TURTLEBOT3_MODEL=burger`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/b29ee105-3e2e-1cee-1c1b-39d7cf574927.png)

普通のUbuntuPC並みに動くし、以前仮想環境でやってみたときのようにGPUが動いてなくてカクカクすることもなくなったので、普通に快適。

後はSLAMのテストをするなら、この辺りを参考にやってみるとSLAMのデモは動かせるはず。
非常に参考になります。
[ROSのSLAMを使った地図作成とナビゲーション](http://joe.ash.jp/program/ros/tutorial/tutorial_slam.htm)

##いきなり７章のWander-bot(ワンダーボット)をやってみる（２回目）
「いきなり７章のWander-bot(ワンダーボット)をやってみる」ですでに一回やっているので消化試合です。

```bash:ワークスペースに移動してワンダーボットパッケージを作る
$ cd ~/catkin_ws/src
$ catkin_create_pkg wanderbot rospy geometry_msgs sensor_msgs
Created file wanderbot/package.xml
Created file wanderbot/CMakeLists.txt
Created folder wanderbot/src
Successfully created files in /root/catkin_ws/src/wanderbot. Please adjust the values in package.xml.
```

教科書のソースコードがここにあるので使わせていただく。
[rosbook](https://github.com/osrf/rosbook/blob/master/wanderbot/red_light_green_light.py)
教科書に書いてある通り、先頭の`# BEGIN ALL`を取り除いて使います。
`wonderbot\scripts\red_light_green_light.py`を置いて、`chmod +x red_light_green_light.py`で実行可能状態にする。

Ubuntu18.04のWindowを複数開いて、まずはgazeboでロボットと仮想空間を動かします。

```
roslaunch turtlebot3_gazebo turtlebot3_world.launch
```

速度を制御して自立して動かすコマンドを実行します。
教科書では
`./red_light_green_light.py cmd_vel:=cmd_vel_mux/input/teleop`
ですが、現環境ではcmd_velを流すだけでよいので実行するだけでOKです。

```
./red_light_green_light.py
```

あ～、すごい速度で行ってしまいました。
動作しているようです。

こんな感じで、トピックを送ってシミュレーション上のマシンを動かすことができるので、実装と動作確認がもりもり進むはずです。