Jetson TX1でZEDを使う

# Environment

- NVIDIA Jetson TX1

https://developer.nvidia.com/embedded-computing
![tx1.png](http://images.nvidia.com/content/tegra/embedded-systems/images/jetson-tx1-developer-kits.png)

- Stereolabs ZED

https://www.stereolabs.com/zed/specs/
![zed.jpg](https://www.stereolabs.com/img/about/zed_face.jpg)

# PreInstall

### CPU Fanを有効にする

```bash
# ref: http://elinux.org/Jetson/TX1_Controlling_Performance
sudo sh -c 'echo 255 > /sys/kernel/debug/tegra_fan/target_pwm'
```

当初CPUファンが回っていなかったからか、途中で固まってしまいました。。

# Installation

### JetPackを使ってOpenCV/CUDAインストール

  ZEDはCUDA対応しているのでまずはCUDAを入れる。

- https://developer.nvidia.com/embedded/jetpack
- **NOTE** JetPackはTX1ではなく、普通のPCにインストールして使用する。

  1. TX1 32-bitを選択(TX1はCPUは64bitだが、OSはデフォルトでは32bit)
  ![jetpack_top.png](https://qiita-image-store.s3.amazonaws.com/0/10402/23df362f-8607-7fb7-f56a-7294b31cab4d.png)
  2. 最低限のものだけ選択(必要のないものを"no action"へ変更する)
  ![select.png](https://qiita-image-store.s3.amazonaws.com/0/10402/c0ce8e2a-33af-89b8-c756-440bed231556.png)
  3. あとはダイアログに従う。

### ZEDをTX1に挿す。

- ZED SDKをインストールする最後にキャリブレーションが行われる。

### ZED SDKをインストール

- https://www.stereolabs.com/developers/#download_anchor

- バッチを実行する

    ```bash
chmod +x ZED_SDK_JTX1_v*.run
bash ./ZED_SDK_JTX1_v*.run
```

- 再起動

    ```bash
sudo reboot
```

### ROSインストール

```bash
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net --recv-key 0xB01FA116
sudo apt-get update
sudo apt-get install -y -qq git python-rosdep python-wstool python-catkin-tools ros-indigo-rosbash ros-indigo-roslib
sudo rosdep init
rosdep update
mkdir -p ~/ros/indigo/src
cd ~/ros/indigo/src
wstool init
wstool set zed-ros-wrapper --git https://github.com/stereolabs/zed-ros-wrapper
wstool up
rosdep install --from-paths . --ignore-src -r -n -y
cd ~/ros/indigo
catkin init
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
catkin build
echo 'source $HOME/ros/indigo/devel/setup.bash' >> ~/.bashrc
exec -l $SHELL
```

- キャリブレーションファイルの手動ダウンロード

カメラ起動時にキャリブレーションファイルを取ってくるが、Firewallの設定などで失敗する場合がある。その場合は公式サイトからキャリブレーションファイルをダウンロードしてきて、 `/usr/local/zed/settings`に置く。

# Run

### 画像・点群を見てみる

- Viewerのインストール

```bash
sudo apt-get install -y -qq ros-indigo-rqt-image-view ros-indigo-rviz

# ref: http://answers.ros.org/question/223995/rviz-bus-error-on-nvidia-jetson-tx1-board/
echo 'unset GTK_IM_MODULE' >> ~/.bashrc
exec -l $SHELL
```

- カメラの起動

```bash
roslaunch zed_wrapper zed.launch
```

- 画像表示

```bash
rqt_image_view
# /camera/rgb/image_rect_color などを選択
```

- 点群表示

```bash
rviz
# Fixed Frameをzed_initial_frameに
# Add -> PointCloud2
# Topic: /camera/point_cloud/cloud, Color Transformer: RGB8
```

### SLAMしてみる

- インストール

```bash
sudo apt-get install -y -qq ros-indigo-rtabmap-ros
```

- 以下のようなlaunchファイルを作る

```xml
<!-- zed_rtabmap.launch -->
<launch>
  <arg name="rviz" default="false" />
  <arg name="rtabmapviz" default="true" />
  <node name="camera_to_zed_frame"
	pkg="tf" type="static_transform_publisher"
	args="0 0 0 -1.5707963267948966 0 -1.5707963267948966 camera_link zed_initial_frame 100" />
  <include file="$(find rtabmap_ros)/launch/rgbd_mapping.launch">
    <arg name="rtabmap_args" value="--delete_db_on_start" />
    <arg name="depth_registered_topic" value="/camera/depth/image_rect_color" />
    <arg name="rviz" value="$(arg rviz)" />
    <arg name="rtabmapviz" value="$(arg rtabmapviz)" />
  </include>
</launch>
```

- 起動する

```bash
roslaunch zed_wrapper zed.launch
```

```bash
roslaunch zed_rtabmap.launch
```

下記画像右側に世界座標系から見たカメラの軌跡と重ねあわせられた点群が表示されているのがわかる。
![rtabmap.png](https://qiita-image-store.s3.amazonaws.com/0/10402/d918b8e5-a1f6-516e-5d73-5d9f4d32cbef.png)

画面が赤くなったら自己位置を喪失したということのようなので、一時停止ボタンを押し、Reset Odometryを押す。
![recover.png](http://official-rtab-map-forum.67519.x6.nabble.com/file/n239/red2.png)

- すごい