Jetson NanoでIntel Realsense D435を使う方法（ROS対応）


![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/f6799c93-b4a5-333f-ebec-205f5ad950b3.gif)

# Intel Realsense D415/D435
　Intel RealsenseはIntel社が開発しているDepthカメラ（3次元的な計測ができるカメラ）です。

　普通のカメラが2次元でしか対象を捉えられないのに対して、Depthカメラは対象の奥行き（距離）も知ることができるので、ロボットの眼にピッタリのデバイスです。

　Realsenseに関して、詳しくは、本記事の最後の参考リンクを参照下さい。

　この記事では、Jetson Nanoでのセットアップ方法、ROS（Robot Operating System）との連携に関して説明いたします。

　ちなみに本記事ではD435でセットアップと動作確認を行なっておりますが、D415でも基本的に同一となります（動作は未確認）。

# Jetson NanoへのIntel Realsense D435のセットアップ
　今回は、Jetson Nano上でRealsenseをROSで使うところまで実施したいと思います。大きく以下4つの工程が必要です。

- Jetson Nanoセットアップ
- Realsenseのファームウェアアップデート
- Realsenseドライバ(Librealsense)インストール
- RealsenseのROS対応

　順に実施していきます。

## Jetson Nanoセットアップ
　Jetson Nanoに関しては、以下記事を参考にセットアップを実施しておいて下さい。

[Jetson Nanoをセットアップしてディープラーニングで画像認識試してみた](https://karaage.hatenadiary.jp/entry/2019/04/29/073000)

　JetPack 4.5で確認済みです。確認したバージョンは JetPack 4.4, JetPack 4.2.2となります。JetPack 4.4以降の場合は、OpenCV4.xを使用していることによる注意点があるので、後述します。

## Realsenseのファームウェアアップデート
　Windows用とLinux用がありますので、好きな方でアップデート実施下さい。また、最近のアップデートによりRealsenseの動作確認に使用する「realsense-viewer」というソフト上で簡単にファームウェアをアップデートできるようになったので、この作業は飛ばしても大丈夫です（Jetson Nano上でアップデート可能です）。

[インテル® RealSense™ D400 シリーズ・カメラのための Windows * ファームウェア更新ユーザーガイド](https://www.intel.co.jp/content/www/jp/ja/support/articles/000026587/emerging-technologies/intel-realsense-technology.html)

[Firmware Update Tool (rs-fw-update)](https://dev.intelrealsense.com/docs/firmware-update-tool)

　~~Jetson Nanoから可能かは不明です。基本的には普通のPCで実施するのが良いと思います。~~ 

## Realsenseドライバ（Librealsense）インストール
　JetsonHackさんの[Jetson Nano – RealSense Tracking Camera](https://www.jetsonhacks.com/2019/05/07/jetson-nano-realsense-tracking-camera/)という記事を参考にしました。

### カーネルへのパッチ当て
　追記：最新のRealsenseドライバでカーネルのパッチ当て作業は不要になりましたので、ここは飛ばしてLibrealsenseのインストールに進んで下さい。以降の情報は、参考情報として残しておきます。

　最初にカーネルにパッチを当てます。パッチ当てなくても動きましたが、動作中大量のエラーが出たり、不安定だったりするので、パッチ当てを推奨します。

　SDカードの容量は、64GB必要となります。カーネルへのパッチ当ては、途中で失敗すると最悪起動できなくなるので、必要なファイルがある場合は、あらかじめバックアップをとった上で実行しましょう（私は一回起動できなくなりました）。

　パッチ当ては、以下コマンドを実行してください。

```sh
$ cd && git clone https://github.com/jetsonhacksnano/installLibrealsense
$ cd ~/installLibrealsense
$ ./patchUbuntu.sh
```

　カーネルのビルドもしているため、完了まで数時間かかります（パッチ当てに関しては kuma_XXP さんよりTwitterで情報いただきました、ありがとうございます）。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ありがとうございます。 ROSでうまく動かなかったので、参考にさせていただきます。<br><br>RealSense Depth Camerasの場合、カーネルモデルにパッチを適用するとパフォーマンスがはるかに向上します。注： D435iをお持ちの場合、パッチなしではカメラは検出されません。<br><br>とのこと</p>&mdash; XXP＠「ちょめ」 (@kuma_XXP) <a href="https://twitter.com/kuma_XXP/status/1136273665345986561?ref_src=twsrc%5Etfw">2019年6月5日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


　パッチを当てないと、この後Realsenseを使用したとき、以下のように大量のエラーが出たりします。

![realsense_error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/f20c4fc5-297b-4f0c-b7a5-21ed0ac7819a.jpeg)


### Librealsenseインストール
　以下コマンドでインストールできます。

```sh
$ cd & git clone https://github.com/jetsonhacksnano/installLibrealsense
$ cd ~/installLibrealsense
$ ./installLibrealsense.sh
```


　インストール完了したら、以下コマンドで「realsense-viewer」を立ち上げ動作確認ができます。

```sh
$ realsense-viewer
```

　Realsense Viewerを起動して、左のStereo ModuleとRGB Moduleのトグルスイッチをオンにして、以下の図のように画像とデプスマップ（奥行き情報）が表示されたらOKです。


![realsense_ok.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/6325d09b-cc3a-eccb-6cd9-fda0d67036ee.jpeg)

　ここで、Realsenseのファームウェアのバージョンが古いと、ファームウェアのアップデートが促されます。ファームウェアが古いと、問題が起きる可能性があるので、最新にアップデートしておくのがオススメです。

　ここでは、ファームウェアのバージョンは`05.12.10.00`を前提に進めます。

# Intel RealsenseのROS対応
　続いて、RealsenseをROSで動かす方法です。上記のLibrealsenseのセットアップをした上で、以下記事参考にJetson NanoにROSをインストールして下さい。

[Jetson NanoにROSをインストールする方法](https://qiita.com/karaage0703/items/aa54e086f0a2f165d3e9)

　JetPack 4.4を使用している場合は、以下コマンドを実行してシンボリックリンクをはっておいてください。OpenCVが4.x系になったための対応です。

```sh
$ sudo ln -s /usr/include/opencv4/ /usr/include/opencv
```

参考：[ROS Perception](https://gitmemory.com/ros-perception)


　続いて、以下コマンド実行してrealsense-rosをインストールします。

```sh
$ sudo apt install -y ros-melodic-ddynamic-reconfigure
$ cd ~/catkin_ws/src
$ git clone https://github.com/IntelRealSense/realsense-ros
$ catkin build
$ source ~/.bashrc
```

　私はビルドシステムにcatkin buildを使用していますが、catkin makeの場合は、5行目の`catkin build`を`catkin make`として下さい。よく意味が分からない人は、`catkin make`です。

　続いて、以下コマンドを実行してrealsenseを立ち上げます。

```sh
$ roslaunch realsense2_camera demo_pointcloud.launch
```

　以下のように、rviz上にリアルセンスの3次元点群が表示されたらOKです。

![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/f6799c93-b4a5-333f-ebec-205f5ad950b3.gif)

## うまく動かない場合
　Realsenseは、ファームウェア、librealsense、realsense-rosの動く組み合わせが決まっています。[realsense-rosのreleaseページ](https://github.com/IntelRealSense/realsense-ros/releases)で、正しい組み合せを確認するようにしましょう。

　ファームウェアは、[Firmware releases D400](https://dev.intelrealsense.com/docs/firmware-releases)でダウンロードができます。realsense viewerで好きなバージョンのファームウェアを書き込みましょう。

　librealsenseは、aptコマンドで異なるバージョンをインストールしましょう。バージョンの調べ方などは、以下記事などを参照ください。

[重要なのに忘れがちなapt関係のコマンドのメモ](https://qiita.com/karaage0703/items/f01db1cf49b151022b7c)

　realsense-rosは、以下のように好きなバージョンをcheckoutしてビルドします。

```sh
$ cd ~/catkin_ws/src/realsense-ros
$ git checkout -b 2.2.3 2.2.3
$ catkin build
```

# 3次元画像処理
　続いて、3次元画像処理をしてみましょう。詳細は以下記事参照下さい。

[PCL(Point Cloud Library)+ROSで3次元画像処理入門](https://karaage.hatenadiary.jp/entry/2017/09/11/073000)　
カラー処理

　画像処理プログラムを試す場合は、以下コマンドでセットアップして下さい。

```sh
$ sudo apt install -y ros-melodic-pcl-ros
$ cd ~/catkin_ws/src
$ git clone https://github.com/karaage0703/pcl_ros_processing
$ catkin build
$ source ~/.bashrc
```

　例えば、色フィルタを使いたい場合は、以下実行して下さい。

```sh
$ rosrun pcl_ros_processing color_filter_rgb input:=/camera/depth/color/points
```

　ここでrvizのPointCloud2のTopicを`/camera/depth/color/points`から`/color_filter`に変えて以下のような点群が表示された状態にします。
![20190605220838.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/ba9c29d6-e62f-2171-2499-e1fff10d87f9.jpeg)

　ここで、以下コマンドを実行して、赤をフィルタリングします。

```sh
$ rosparam set /max_r 10
```

　すると以下のように赤が抜けた点群が表示されます。
![20190605220810.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/5921e7ab-36c7-134c-4209-b1eea5754acc.jpeg)


# Pythonで使いたい場合
　PyRealsenseを使うのが良いです。以下記事にまとめたので参照下さい。

https://qiita.com/karaage0703/items/39040f23cbb0611c0a0e

# ハードウェア情報が知りたい場合
　シリアルNoやファームウェアバージョンをCUIで知りたい場合は、以下コマンドを実行して下さい。

```sh
$ rs-enumerate-devices -o 
```

　GUIであれば、Realsense Viewerでハードウェア情報を確認できます。

# Raspberry Piの場合
　以下記事にセットアップ方法記載しました。

https://zenn.dev/karaage0703/articles/808d3922a1671b

# その他の環境の場合
　以下記事にまとめてあります。

https://zenn.dev/karaage0703/articles/a267aa24a80c44

# まとめ
　Jetson NanoでIntel Realsense D435をROSで動かしてみました。

　重いはずの3次元画像の表示や処理がJetson Nano上でサクサク動くからビックリです。GPUのおかげでしょうか。素晴らしいですね。


# 参考サイト
[Intel RealSense Depth Cameraがいかにやばいかについて](https://qiita.com/alfredplpl/items/4a14b5250ac88cec40c7)

[Intel RealSense デプスカメラ D435 を Unity で遊んでみた](http://tips.hecomi.com/entry/2019/06/04/235243)

# 関連記事
https://qiita.com/karaage0703/items/b14c249aa33112669ee4


# 変更履歴
- 2021/06/21 他の環境でのセットアップ方法へのリンク追記
- 2020/06/05 JetPack 4.4の対応を追記