Jetson nanoとRealSenseをROS対応ロボットに搭載する

#Jetson nanoとRealSenseをROS搭載ロボットに搭載する
RoboMaster S1にROSを搭載する計画は鋭意進めておりますが、
今回はRoboMaster S1に搭載する予定のJetson nanoのセットアップについてまとめます。
からあげさんなど、さまざまな記事をベースにさせていただいております。

##準備
###注意事項
 - FANがないとインストール中に止まることがあるので注意（私は保冷剤で対応しましたw）
 - 電源はDCジャックから5V/4A以上のACアダプターから供給しましょう
 - RealSense用のUSBハブは相性問題が出やすいので注意

##Jetson nanoのSDカードを用意
こちらに関しては、いろいろ書かれている方が多いので省略します。
https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write
このサイトに従って作成してください。
###やっておいたほうが良いこと
 - SDカード作成し、そのまま作成したPC上でgpartedを使用してパーティションを広げておく
 - その際にSWAP領域を作っておくのが良い（大体4GB）
 - 作成したSWAP領域はfstabに書く必要があるが、Jetson nanoで起動してから書けばOK
 - インストール時にAutologinをONにしておく
 
##セットアップ
###aptで必要なものを入れる
Jetson nanoが起動した後、Networkを接続して、いつもの通り

```console
$ sudo apt update
$ sudo apt upgrade
```

その後必要なパッケージを入れていく（お好みでどうぞ）

```console
$ sudo apt install avahi-daemon vim emacs git htop curl wget ssh 
```

###ROS melodicを入れる
ROS melodicはARM64用のパッケージが用意されているので、aptで入れることができます。
以下のサイトに従ってセットアップしてください。
http://wiki.ros.org/melodic/Installation/Ubuntu

###Intel RealSense用ライブラリを入れる
今回はIntel RealSense D435とT265をセットアップします。
USBハブを使用する場合は相性問題が発生しがちなので、大手メーカーでDCジャックから別途電源をとれるものをおすすめします。

まず、各RealSenseは別途WindowsなどでFirmware Updateしておきましょう。

どうやらJetson nanoではIntel RealSenseは一筋縄では動かないようです。
カーネルにパッチを当てたり、librealsenseもコンパイルして入れる必要があります。

海外の方がGithubにスクリプトをおいていてくれているので、コレを利用しましょう。
Ubuntuのカーネルにパッチを当てて自動でコンパイルしてくれます。

```console
$ git clone https://github.com/jetsonhacksnano/installLibrealsense
$ cd ~/installLibrealsense
$ ./patchUbuntu.sh
```
ここで一旦再起動します。
その後librealsenseを入れます。

```console
$ ./installLibrealsense.sh
```
インストールが完了したらまずはUSBを接続し、

```console
$ rs-enumerate-devices
```
を実行してデバイスが認識されていることを確認します。
認識できていない時は、USBを抜き差ししましょう。

認識できていれば、

```console
$ realsense-viewer
```
で、D435とT265の動作が確認できます。

###realsense-rosを入れる
intel RealSenseをROSで動かすためにrealsense-rosを入れます。

```console
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace .
$ git clone https://github.com/IntelRealSense/realsense-ros
$ cd realsense-ros
```

インストールしたlibrealsenseのバージョンにより、realsense-rosのバージョンも変わってきます。
LibRealSense v2.24.0の場合は2.2.7になります。
あってないとエラーが出るのでわかります。

```console
$ git checkout -b 2.2.7 2.2.7
```
その後コンパイルします。

```console
$ catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
```

すると以下のエラーが出ます。

```
ddynamic_reconfigureConfig.cmake
ddynamic_reconfigure-config.cmake
```

なので

```console
$ sudo apt install ros-melodic-ddynamic-reconfigure
```
再度、

```console
$ catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
```
これで準備は完了です。
ただし、T265のROS用のデモはSerialの指定が必要になっています。

```console
$ rs-enumerate-devices | grep Serial
```

を実行すると、Serial No.がわかるので、T265のみを繋いで実行し、Serialをメモしておいてください。
以下の通りserial_noに記載しておきましょう。なおD435はシリアルナンバーを入れなくてもデモは動きます。

```console
$ vi ./src/realsense-ros/realsense2_camera/launch/rs_t265.launch
<arg name="serial_no"           default="XXXXXXXXXXXXXXX"/>
```

####Intel Realsense T265のデモを実行

```console
$ source ./devel/setup.bash
$ roslaunch realsense2_camera demo_t265.launch
```
####Intel Realsense D435のデモを実行
```console
$ roslaunch realsense2_camera demo_pointcloud.launch
```
##リモート開発環境を構築
Jetson nanoを実機に搭載すると、ほとんどの場合ディスプレイを接続できなくなりますので、
VNCでのリモートデスクトップ接続は必須です。
そこで、Ubuntuには標準でVinoというVNCサーバーが搭載されているので、使用しましょう。
しかしながら、Jetson nanoのSDイメージのVinoの設定はどうもバグっていますので、以下の手順に従って有効化してください。

まず、SettingウインドウのDesktop Sharingの項目が正しく動くようにします。

```console
$ sudo vi /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml
```
以下を追加

```xml
<key name='enabled' type='b'>
    <summary>Enable remote access to the desktop</summary>
    <description>
        If true, allows remote access to the desktop via the RFB
        protocol. Users on remote machines may then connect to the
        desktop using a VNC viewer.
    </description>
    <default>false</default>
</key>
```
その後

```console
$ sudo glib-compile-schemas /usr/share/glib-2.0/schemas
```
これで、Desktop SharingのWindowが正しく動作するようになりますので、
パスワードなどを設定しましょう。
Desktop Sharingの設定に項目がないものについてはターミナルで設定します。

```console
$ gsettings set org.gnome.Vino require-encryption false
$ gsettings set org.gnome.Vino prompt-enabled false
```
Ubuntu 18.04からネットワークごとに有効無効を設定するそうなので、以下通りネットワークのUUIDを登録しておきます。

```console
$ nmcli connection show
```
でUUIDを確認して以下を実行

```console
$ dconf write /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections "['xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx']"
```

最後に設定内容を確認します。

```console
$ gsettings list-recursively org.gnome.Vino
```
最後に、このままだとHDMIを接続していない状態でVNC接続を行うと、解像度が低すぎるので、以下の設定をします。

```console
$ sudo vi /etc/X11/xorg.conf
```
以下を追加

```
Section "Monitor"
    Identifier "DSI-0"
    Option    "Ignore"
EndSection

Section "Screen"
    Identifier    "Default Screen"
    Monitor        "Configured Monitor"
    Device        "Default Device"
    SubSection "Display"
        Depth    24
        Virtual 1280 800
    EndSubSection
EndSection
```

Virtualの箇所が解像度ですので、ネットワークの速度を考慮して設定しましょう。

以上です。快適なロボット開発を!