Jetbot for ROS Rotsonを作ろう! Jetson NanoにROSをセッティングするよ

JetsonNanoにROSをインストールしてみましょう。

以下サイトを参考に製作しました。
・Ubuntu install of ROS Melodic
http://wiki.ros.org/melodic/Installation/Ubuntu
・Jetson NanoにROSをインストールする方法
https://qiita.com/karaage0703/items/aa54e086f0a2f165d3e9
・ROS nodes and Gazebo model for NVIDIA JetBot with Jetson Nano
https://github.com/dusty-nv/jetbot_ros

##・方針
今回作るROSはRos Melodic FULLとし
ワークスペースはnVidiaのリファレンスは
/home/nvidia/workspace/catkin_ws/
ですが、今回は、
/home/user/catkin_ws/
にします。
また、起動時のユーザー名によりhomeが変わります。
以下のプログラムは、nvidiaとしています。

次にターミナルを起動させて以下コマンドを叩きます。
初期のネットワーク設定および、ターミナルの起動は、各自で行ってください。
特に、初期設定で、自動ログインを私はよく忘れてしまうので皆さんは忘れないようにしてください。

##インストールスクリプトの作成

```
vim install-ROS.sh
```

VIMとは、エディタになります。
これでプログラムを書くことになります。
ちょっと難しいのでnanoの方が良いですが入っていないので、vimで行きます。

今回書くプログラム（.sh）は、ROSのインストールプログラム（シェルスクリプト）になります。

このスクリプトを書く理由は、時間が経つとインストールできない、動かないものが発生するためです。
自分でプログラムを見ることで、エラー理由を知り対策を立てられるようになります。
この為、一度自分で作る事をお勧めします。

```
#!/bin/bash
#Install ROS on nVidia Jetson Nano 
#ROS Melodic to Ubuntu

echo "Start Install\n"
if [ ! -e /etc/apt/sources.list.d/ros-latest.list ]; then
    sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
fi
echo "apt key recv-key\n"
sudo apt-get update
sudo apt-get install -y curl
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -

##Not use apt-key
##curl -SsfL git.io/ros-gpg-key-update | sh

##sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

##sudo apt-key del 421C365BD9FF1F717815A3895523BAEEB01FA116
##sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C65

echo "apt update\n"
sudo apt update
apt search ros-melodic

echo "Install Ros Melodic FULL\n"
sudo apt install ros-melodic-desktop-full
##sudo apt-get install -y ros-melodic-desktop
sudo rosdep init
rosdep update
##sudo chmod 777 -R ~/.ros/

echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt install cmake python-rosinstall python-rosinstall-generator python-wstool build-essential python-catkin-tools python-catkin-pkg python-empy python-nose python-setuptools libgtest-dev 

# enable all Ubuntu packages:
sudo apt-add-repository universe
sudo apt-add-repository multiverse
sudo apt-add-repository restricted

# install pip 
sudo apt-get install python-pip

# install jetson-stats
pip install jetson-stats

# install Adafruit libraries
pip install Adafruit-MotorHAT
pip install Adafruit-SSD1306

#Grant your user access to the i2c bus:
sudo usermod -aG i2c $USER

# setting catkin_ws
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin init
catkin build
sudo sh -c 'echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc'

##Reboot
echo "Reboot\n"
sudo reboot
```
以上をコピーして貼り付けます。
書き終わったら、保存しましょう。
保存 :w
終了 :q
削除　x
です。
そして、以下のプログラムを実行します

##プログラム実行
```
sudo bash install-ROS.sh
```

この一文は、先ほど書いたスクリプトを実行するものです。
10分程度経過後に、再起動すると思います。
数分で終わる場合は、ROSのパッケージが読み込めていません。
（キーがうまく読めていない場合、ROSのパッケージの場所がわからないために、ダウンロード、インストールされません）
なお、エラーが出ているとこれから先が動きません。
(sudo chmod 777 -R ~/.ros/
については、権限が無いというエラーが起きたために追加しています。)

それでは、起動してみましょう。
ターミナルを起動させて
##起動確認

```
roscore
```
を実行します。
こんな画面になれば、ROSがインストールし起動できたことになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d4ce51a1-26b4-bc1b-d34f-77911fbb491e.png)

RvizとGazeboを起動させてみます。
新規のターミナルを起動させて

```
Rviz
```
```
Gazebo
```
と入力しましょう。
画像のようになればインストールされたことになります。

![Screenshot from 2019-11-07 17-50-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7bd3eba6-7b85-1fbd-d7d4-0daa21b7cf7e.png)

これが出たらインストール出来ていないことになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a05a9ae8-9d51-c2e4-6f5d-5014933b13e3.png)
以下のキーのアップデートを行い、再度実行しましょう。

##キーのアップデート
これは、うまくいかなかった人向けなので、問題が無ければ無視してください。

```
sudo apt-key del 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C65
```

##JetBot環境構築とビルド
今回、catkin_wsを作りcatkin buildでビルドしています。
私は、どうあがいてもcatin_make出来ないので、すべてcatkin buildにしています。

実行後、別のターミナルを起動させて以下を実行します。

```
echo $ROS_PACKAGE_PATH 
```
すると
/home/nvidia/catkin_ws/src:/opt/ros/melodic/share
と表示されるようです。
私は、以下が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/09f16434-50f3-93eb-c487-34213c168d12.png)

ここからJetbotの環境設定をします。

##jetson-inferenceの設定
```
vim jetson-inference.sh
```

jetson-inference.sh

```
# clone the repo and submodules
cd ~/
git clone https://github.com/dusty-nv/jetson-inference
cd jetson-inference
git submodule update --init

# build from source
mkdir build
cd build
cmake ../
make

# install libraries
sudo make install
```
実行します。

```
sudo bash jetson-inference.sh
```

##ros_deep_learningの設定

```
vim ros_deep_learning.sh
```

ros_deep_learning.sh

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

# clone the repo
cd ~/catkin_ws/src
git clone https://github.com/dusty-nv/ros_deep_learning

# make ros_deep_learning
cd ../    # cd ~/catkin_ws
#catkin init
catkin build

```
実行します。

```
sudo bash ros_deep_learning.sh
```

実行後、別のターミナルを起動させて以下を実行します。

```
$ rospack find ros_deep_learning
```
以下が表示されればros_deep_learningがインストールされていることになります。
/home/nvidia/catkin_ws/src/ros_deep_learning

##jetbot_rosの設定

```
vim jetbot_ros.sh
```

jetbot_ros.sh

```
# clone the repo
cd ~/catkin_ws/src
git clone https://github.com/dusty-nv/jetbot_ros

#build the package
cd ../    # cd ~/catkin_ws
#catkin init
catkin build
```
実行します。

```
sudo bash jetbot_ros.sh
```
実行後、別のターミナルを起動させて以下を実行します。

```
rospack find jetbot_ros
```
以下が表示されればjetbot_rosがインストールされていることになります。
/home/nvidia/catkin_ws/src/jetbot_ros

以上でJetbotの設定が終わったはずです。
スクリプトをずべて結合しても問題ありません
が、エラーが発生したときに後戻りできないので細切れに実行することをお勧めします。

それでは、実行してみましょう
それぞれ新しいターミナルを立ち上げます。
###１、roscoreを実行
###２、rosrun jetbot_ros jetbot_motors.pyを実行
###３、以下コマンドを適宜実行（モーターが動きます）
$ 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"
###４、rosrun jetbot_ros jetbot_oled.py
OLEDが点灯します。
別のターミナルから
$ rostopic pub /jetbot_oled/user_text std_msgs/String --once "HELLO!"
と送ると1行目にHelloと表示されると思います。
###5、gazebo
Jetbotのイメージデータが表示されるはずです。

###エラー
以下のエラーは、権限が無い場合です
ROSCOREの起動時にも発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/32232022-78be-8109-394f-d0d30ce0f4e6.png)

この場合は
sudo chmod 777 -R ~/.ros/
を入れます。
プログラムは、コメントアウトに変更しました

```
IOError: [Errno 13] Permission denied: '/dev/i2c-1'
```
以下を実行します。

```
sudo chmod 777 -R /dev/i2c-1
```
![Screenshot from 2019-11-11 17-20-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dc576737-8280-8a64-a4ae-d30a1f06ff1c.png)

以上で、JetbotにROSがインストールでき、モーターや、OLEDが使えるようになりました。

 jetson-statsを使うときは

```
sudo jtop
```
を実行します。

この後は、各種諸先輩方の資料をご覧ください。
###・からあげさんのJetson NanoでIntel Realsense D435を使う方法（ROS対応）
https://qiita.com/karaage0703/items/cb9bbe1b4f2504f8ad0d
###・JetbotでOpenVSLAMを試してみた。
http://masato-ka.hatenablog.com/entry/2019/07/21/235645