JetbotをROSで動作させる

#目的
JetbotをROS環境でシミュレーション動作できるようにして、ROSによるシミュレーション環境構築の理解を深める。

#環境
- Jetbot: Waveshare
    - Jetson nano
    - Jetpack 4.4
    - Ubuntu 18.04

#手順
#### インストール作業
モータードライバ（TB6612/PCA9685)と有機LED(SSD1306)のために、Adafruitのライブラリをインストール。

```
sudo apt-get install python-pip

pip install Adafruit-MotorHAT
pip install Adafruit-SSD1306
```

Workspaceを作成。

```
mkdir -p ~/workspace/jetbot_ws/src
cd ~/workspace/jetbot_ws
catkin_make

sudo sh -c 'echo "source ~/workspace/jetbot_ws/devel/setup.bash" >> ~/.bashrc'
```

jetson-inferenceをリポジトリからクローンしてビルド。

```
sudo apt-get install git cmake

cd ~/workspace
git clone https://github.com/dusty-nv/jetson-inference
cd jetson-inference
git submodule update --init

mkdir build
cd build
cmake ../
make

sudo make install
```

ros_deep_learningをリポジトリからクローンしてビルド。rospackの確認でPackage not foundのエラーが出たけど、setup.bashを実行したら解決。

```
sudo apt-get install ros-melodic-vision-msgs ros-melodic-image-transport ros-melodic-image-publisher

cd ~/workspace/jetbot_ws/src
git clone https://github.com/dusty-nv/ros_deep_learning

cd ../ 
catkin_make

# confirm that the package can be found
$ rospack find ros_deep_learning
/home/nvidia/workspace/jetbot_ws/src/ros_deep_learning
```
次にjetbot_rosをリポジトリからクローンしてビルド。同じくrospackで確認。

```
# clone the repo
$ cd ~/workspace/jetbot_ws/src
$ git clone --branch https://github.com/dusty-nv/jetbot_ros

# build the package
$ cd ../    # cd ~/workspace/catkin_ws
$ catkin_make

# confirm that jetbot_ros package can be found
$ rospack find jetbot_ros
/home/nvidia/workspace/catkin_ws/src/jetbot_ros
```
#### 動作確認
いよいよROSでのJetbotの動作確認。

```
$ roscore
```

別のTerminalを開いて、jetbot_motorsでモーターを動かしてみる。サンプルコードのjetbot_motors.pyが入っているので、下記コマンドで実行。

```
$ rosrun jetbot_ros jetbot_motors.py
```

新しいTerminalを開いて、下記のコマンドをテストで実行すると、勢いよくモーターが動き出した！　結構早く走り出すので慌ててjetbotを持ち上げて、stopコマンドで止める。。。

```
$ rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "forward"
$ rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "backward"
$ rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "left"
$ rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "right"
$ rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "stop"
```
ROSはノード間の通信をトピックで非同期でやり取りする。

- rostopic pubはトピック送信する際のコマンド
- jetbot_motorsは以下の3つのトピックを受信できるが、今のところ実装されているのはcmd_strのみ。
    - /jetbot_motors/cmd_dir：相対方位 (角度[-180.0, 180.0], スピード[-1.0, 1.0])
    - /jetbot_motors/cmd_raw：生の左右のモーターへのコマンド(スピード[-1.0, 1.0], スピード[-1.0, 1.0])
    - /jetbot_motors/cmd_str：シンプルなコマンド(left/right/forward/backward/stop)



#### OLEDの確認
JetbotにOLEDが付いているので表示させてみる。Jetbot_oledノードを実行。そして、以下のコマンドで"My Jetbot!"と表示。問題なく表示できた。

```
$ rosrun jetbot_ros jetbot_oled.py

$ rostopic pub /jetbot_oled/user_text std_msgs/String --once "My Jetbot!"
```

#### カメラ動作
Jetbotについているカメラで表示させてみる。まず、jetbot_cameraノードを起動。

```
$ rosrun jetbot_ros jetbot_camera
```

カメラ表示にはros-melodic-image-viewをインストールしておく必要があるらしい。以下のコマンドを新しいTerminalで実行。カメラ用の新しいWindowが立ち上がって、カメラも表示。 VNC接続からか、かなり遅い。

```
$ sudo apt-get install ros-melodic-image-view
$ rosrun image_view image_view image:=/jetbot_camera/raw
```
![screenshot_471.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1503757/142c297b-4f42-7480-779e-b65e810fe5ab.jpeg)


#参考
以下のgithubを参考に構築。
https://github.com/dusty-nv/jetbot_ros/tree/melodic