【ROSではじめるロボットプログラミング：小倉崇氏著】を【docker-ros-desktop-vnc：Tiryoh氏】上で学ぶ

## 1．はじめた理由
・"ROSjp"で初心者には『ROSではじめるロボットプログラミング（小倉崇氏著）』がお勧めとのことだったので、トライしてみました。
・ただ、Kineticを今のUbuntu上に直に入れるのは躊躇があったので、評判の高いTiryoh氏の【docker-ros-desktop-vnc】を使ってみました。
## 2．結果
・『14「ジョイスティック」による操縦プログラム』『19−4「サーボ・モータ」を使う』以外は全て実行できました
　（共に手頃な機材が無かった為です。プログラムの確認自体ができていません）
・進めていく中で、躓いた点を順にリストアップしていきます
## 3．準備
・本自体
　・本を図書館から借りましょう。中古品の入手は金銭的に無謀です
　・本の正誤表をチェックして、修正します。下記のリンク先を参照してください。
　・プログラムの修正も何点かあります。上手く動かなかった時も、下記リンク先を参照ください
［ OTL/ros_book_programs］(https://github.com/OTL/ros_book_programs/tree/master/ros_start)

・Docker
　・Dockerが動く環境を準備してください
　・GPUは使わないので、気にしなくても問題ないです。CPUは第9世代のi5で十分動きます
　・Tiryohさんの【docker-ros-desktop-vnc】から必要なイメージファイルを落としてきます
　[docker-ros-desktop-vnc](https://github.com/Tiryoh/docker-ros-desktop-vnc)
　・この記事は、depricatedになっている【Kinetic】イメージを使用しています。使った理由は以下の通りです
　　・始めた当初は「depricated」では無かった
　　・本のROSバージョンは【Indigo】なので、なるべく近い【Kinetic】を選んだ

　・何故かインストールできないときは、まず以下のコマンドを叩いてから再トライする

```shell-session:
$ sudo apt-get update
```
　・<font color="Crimson">以下、本の中で出てくる【Indigo】は、すべて【Kinetic】に読み替えてください</font>
## 4．Docker Container の作成と注意点
・Tiryoh氏のページにもあるように

```shell-session:
$ docker run -p 6080:80 --shm-size=512m tiryoh/ros-desktop-vnc:kinetic
```
とコマンドを打てばContainerが完成しますが、後半、このContainerが使えなくなります。
・それは、
　【17：「ROS」を使って「分散画像処理」】：USBカメラの接続
　【19−3：「rossserial」でマイコンをつなぐ】；USBSerialとしてのArduinoへの接続
　です
・共にDocker Containerにポートを開ける必要があるので、Containerの再作成が必要です

USBカメラの場合、USBカメラのポート（今回は、【/dev/video0】）を調べて、以下のコマンドで再作成しました

```shell-session:
$ docker run -p 6080:80 --shm-size=512m --device /dev/video0:/dev/video0:mwr tiryoh/ros-desktop-vnc:kinetic
```
但し、このContainerは、USBカメラが繋がった状態でないと起動しません。

Arduino（USBSerial）は、【dev/ttyACM0】と認識され上手くContainerが生成できなかったので、なんでもありの【--privileged】オプションをつけて走らせました

```shell-session:
$ docker run -p 6080:80 --shm-size=512m --privileged tiryoh/ros-desktop-vnc:kinetic
```
・この場合、下図のコマンドでループに入ってしまいましたが、【Ctrl＋C】で無理矢理に抜けるとContainerが生成され、Docker上から【dev/ttyACM0】もアクセスできたので、結果オーライとしています。
![Docker_run_全ポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106178/126a14e4-3416-6da7-746f-0e6ea72a982c.png)
・<font color="Crimson">Containerを再作成すると、本に沿って作ったROS環境を再構築する必要があります。</font>（私は結局、4回作り直しています(笑)）
・どの形のContainerを作るかは最初に決めておいたほうが楽です。ただ、再構築する事自体も勉強になりました。
## 5．第1〜2章／第4〜7章／第9〜12章／第15〜16章／第20章
・書籍に沿って進めてください
## 6．第3章：「ROS」のインストール
・『3.3：「ROS」をインストールする』
　・『ROSをインストールする』箇所は飛ばしてください。既にインストール済みです
　・『rosdep』のインストールからは、書籍に沿って進めてください
## 7．第8章：「シミュレータ」上の「ロボット」を動かす
・『8.1：「シミュレータ」の「インストール」と実行』
　・【Kobuki】のインストールが上手く行きません。以下のページを参考にして【turtleBot】で代用します
　・【turtleBot】自体、13章でインストールするので、無駄にはなりません
[ROS-kineticでturtlebot gazeboを動かす](https://r17u.hatenablog.com/entry/2017/06/11/213942)

```shell-session:
$ sudo apt-get update
$ sudo apt-get install ros-kinetic-turtlebot-gazebo
$ sudo apt-get install ros-kinetic-turtlebot ros-kinetic-turtlebot-apps ros-kinetic-turtlebot-interactions ros-kinetic-turtlebot-simulator ros-kinetic-kobuki-ftdi ros-kinetic-ar-track-alvar-msgs
$ . /opt/ros/kinetic/setup.bash
```
 ・【turtleBot】の実行（初回の起動時は結構な時間がかかります。）

```shell-session:
$ roslaunch turtlebot_gazebo turtlebot_world.launch
```
・それ以降は、『8.6：「PR2」を動かす』まで書籍に沿って進めてください

・『8.6：「PR2」を動かす』
　・『PR2』のインストールは問題ありませんが、最初にインストールされている【gazebo V7.0.0】では正しく動作しません
　・以下のページを参考に【gazebo】のアップデートを行います
[ROS講座67 車輪ロボットを作る7](https://qiita.com/srs/items/7d78f9ad21a0e61f5bff)

```shell-session:
$ sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'
$ cd /tmp/
$ wget http://packages.osrfoundation.org/gazebo.key
$ sudo apt-key add gazebo.key
$ sudo apt-get update
$ sudo apt-get install gazebo7

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo reboot
```
・これで、正しく『PR2』上でも「vel_bumper.py」が動作します

## 8．第13章：「ROS」のGUI
・『13.1：rviz』
　・「Turtlebot」は既にインストール済みですので、再インストールは不要です
　・『P124：／odem』の設定時に画面に色付きの柱が出ている場合は、【Convariance】のチェックを外す
　・それ以外は、書籍に沿って進めてください

## 9．第14章：「ジョイスティック」でロボット操作
・手頃なジョイスティックが無かったので、確認していません

## 10．第17章：「ROS」を使って「分散画像処理」
・Docker Container自体は、『3.準備』を参照ください
・「USBカメラ」の「ROSドライバ」のインストール方法を下記を参考に変更します
[ROS KineticでのUSBカメラ接続とキャリブレーションまで](https://qiita.com/proton_lattice/items/aa805b28700575ba5ed3)

```shell-session:
$ sudo apt-get install ros-kinetic-uvc-camera
```
　・同時にImage関連のパッケージもインストールする

```shell-session:
$ sudo apt-get install ros-kinetic-image-*
$ sudo apt-get install ros-kinetic-image-view
```
　・カメラのパーミッションを変更する（Containerの再起動毎に必要／何故か『777』じゃないと動かない）

```shell-session:
$ sudo chmod 777 /dev/video0
```
　・roscoreを別の端末で立ち上げて、以下のコマンドで確認する

```shell-session:
$ rosrun uvc_camera uvc_camera_node
$ rosrun image_view image_view image:=/image_raw(P154の1行目のコマンドから「/usv-cam」が無い)
```
　・それ以外は、書籍に沿って進めてください

## 11．第18章：「tf」を使って「座標変換」
・「18.4：「tf」を「rviz」で確認する
　・図70で「Robot」が表示されない場合は、【RobotModel】をON、表示自体が無いときは『Add』する
　・図71で「TF」が表示されていない場合は、「TF」を『Add』する

## 12．第19章：自分の「ロボット」を「ROS」で動かす
・19.3.「rosserial」でマイコンとつなぐ
　・Docker Container自体は、『3.準備』を参照ください
　・P184 の以下のコマンドは、最後の【.】まで入力すること

```shell-session:
$ rosrun rosserial_arduino make_libraries.py .
```
　・ライブラリの中に「ros_lib」が無ければ、Addする

　・Arduinoとつなぐためにシリアルポートの書き換えが必要です。以下のコマンドでarduinoからSerialポートが見えるようになります
　　（ポートが【/dev/ttyACM0】の場合）
[【Ubuntu】arduinoに書き込もうとしたら怒られた](https://www.blue-weblog.com/entry/2017/11/23/204902)

```shell-session:
$ sudo usermod -a -G dialout <username>
$ sudo chmod a+rw /dev/ttyACM0
```
　・それ以外は、書籍に沿って進めてください

以上

初版：2021年9月5日