📷

ROS2: Realsense+Jetson Nano(Eloquent/Docker Foxy)の環境構築

2022/12/13に公開

海洋ロボコンをやってた人です。

今回は、Jetson Nanoに接続したRealsense D435/D435iをROS2で使用するための手順を備忘録として記載していきます。

なぜまとめるかは以下です。

  • Realsense SDKのビルドを公式通りにやっていると大変
  • Realsense ROSのパッケージって何使えばいいか分からない
  • Realsense ROSをFoxyで使いたい(後述:探すとブランチがある)
  • Jetson NanoでFoxy使いたい(後述:Foxy OS/Dockerを利用)
  • Jetson Nano のGPU使えてるか分かりづらい

また、自身の研究機体にもRealsenseを搭載しているため、環境構築手順およびどのパッケージを使用しているかを明記することも目的の一つです。

"もっとこうすれば簡単に使用できる"や"ここは違うのではないか"というご意見がありましたら、是非ご教授いただけますと幸いです。


※2023/02/26追記

本記事の「ROS2」表記、正しくは「ROS 2」です。

ROS2: Realsense+Jetson Nano(Eloquent/Docker Foxy)の環境構築

動作環境は以下の通りです。

  • Jetson Nano B01
    • ROS2 Eloquent
    • Docker
      • ROS2 Foxy
  • Realsense D435i

Jetson Setup

https://developer.nvidia.com/embedded/jetpack-sdk-462

上記公式サイトより、JetPack 4.6.1のイメージファイルをダウンロードします。
Installing JetPack > JETSON NANO DEVELOPER KITS > Download the SD Card Image

インストール後フォルダを解凍し、Raspberry Pi Imager等でSDカードに書き込みます。

Jetson起動後に各設定を行い、nanoのインストールとsudo権限をNOPASSWD:ALLへ変更

sudo visudo
sudo apt install nano 

固定IP等も設定して、ラップトップからsshできるようしておく。
Settings > Brightness & Lock のブラックスクリーンもOFFにしておく。

動画を録画できるようSimpleScreenRecorderもインストールしておく。

sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder
sudo apt update
sudo apt install simplescreenrecorder

Realsense+Jetson Nano Eloquent

Realsense D435/D435iとJetson Nano EloquentでGPU処理でのRealsense動作/PointCloudを確認していきます。

  • Install Jtop & Check GPU utilization
sudo apt install python3-pip
sudo pip3 install jetson-stats
sudo jtop

JetsonにROS2 Eloquentをインストール

sudo apt update && sudo apt install curl gnupg2 lsb-release
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
sudo apt update
sudo apt install ros-eloquent-desktop
echo "source /opt/ros/eloquent/setup.bash" >> ~/.bashrc
sudo apt install python3-argcomplete
sudo apt install python3-colcon-common-extensions
sudo nano ~/.bashrc
# add "export ROS_DOMAIN_ID=89"
source ~/.bashrc

Realsenseに必要なパッケージをインストール&動作確認

RealsenseSDKのインストール等はJetsonユーザーとして有名なJetsonHacks様のパッケージ、記事、Youtubeを見て行っていきます。

https://jetsonhacks.com/2019/12/22/install-realsense-camera-in-5-minutes-jetson-nano/

  • RealsenseSDK & Swapfile
mkdir jetsonhacks
cd jetsonhacks
git clone https://github.com/jetsonhacks/installRealSenseSDK
cd ./installRealSenseSDK
./installLibrealsense.sh

cd ~/jetsonhacks
git clone https://github.com/JetsonHacksNano/installSwapfile
cd installSwapfile
./installSwapfile
  • Intel RealSense Viewer(v2.53.1)での確認
realsense-viewer

3DViewで、GPU処理しつつ動作していることが確認できました。

  • Realsense ROS2

RealsenseをROS2で使用するには、ros2_intel_realsenseのパッケージを使用します。

このパッケージを使用することで

Depth Camera D415, D435, D435i

Tracking Camera T265

をROS2で使用することができます。

cd ~/
mkdir -p ros2_ws/src
cd ros2_ws/src
git clone -b eloquent https://github.com/intel/ros2_intel_realsense.git
cd ~/ros2_ws
colcon build
  • Realsense ROS2およびGPU使用の確認
cd ~/ros2_ws
. install/setup.bash
ros2 launch realsense_examples rs_camera.launch.py

rviz2でRGB Image, Depth Image, PointCloudを確認してみます。

Realsense+Jetson Nano Docker Foxy

  • Dockerの確認
    JetPackではデフォルトでdockerがインストールされているので、バージョン確認をする。
docker -v
Docker version 20.10.7, build 20.10.7-0ubuntu5~18.04.3
  • Dockerを基礎から学ぶのに読んだ本

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59

著者の「ほげさん」様、非常に理解しやすく勉強になりました。ありがとうございます。

JetsonにDocker ROS/ROS2イメージをインストール

JetsonにROS/ROS2のDocker Imageをインストールする一つの方法として下記を使用します。

https://github.com/dusty-nv/jetson-containers

sudo docker pull dustynv/ros:foxy-desktop-l4t-r35.1.0
sudo docker image ls # imageの確認
sudo docker container run -it --name ros2_foxy 9d63c8bdf23d #[IMAGE ID]

X11を使用したコンテナを作製します。

sudo docker container run -it --name ros2_foxy --runtime nvidia --net host --privileged -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix 9d63c8bdf23d

--privilegedオプションを使用することで、ホストすべてのデバイスへアクセスできるようになります。

Realsenseに必要なパッケージをビルド

RealsenseSDKは先ほどと同様のリポジトリを使用しますが、Docker上では./installLibrealsense.shがエラーとなるため、ビルドしてSDKを準備します。

mkdir jetsonhacks
cd jetsonhacks
git clone https://github.com/jetsonhacks/installRealSenseSDK
cd ./installRealSenseSDK
./buildLibrealsense.sh

ここまでできたら、Jetson(ホスト)側で

xhost +

でXサーバーを実行するホストからのアクセス許可を行います。
続いて、Docker Containerに入り

sudo realsense-viewer

を立ち上げ動作確認をしてみましょう。

また上記の./buildLibrealsense.shは以下で代替可能かもしれません、こちらは検討中です。

sudo apt-get install ros-foxy-librealsense2
sudo apt-get install -y libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev
sudo apt-get install -y libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev

Foxyで使用可能なRealsenseパッケージのインストール

ros2_intel_realsenseをFoxyで使用する場合は、refactorブランチを使用します。

mkdir -p ros2_ws/src
cd ros2_ws/src
git clone -b refactor https://github.com/intel/ros2_intel_realsense.git
cd ~/ros2_ws
colcon build

またbashrcにROS_DOMAIN_ID等を記述しておく。

sudo apt install nano
sudo nano ~/.bashrc
# export ROS_DOMAIN_ID=89

Docker FoxyとJetson EloquentでROS通信

Docker Foxy側とJetson Eloquentのホスト側でROS通信をしてみます。

下記の設定が必要かと思っていましたが、特に必要なさそうです。

  • docker default bridge network

https://docs.docker.com/network/bridge/#configure-the-default-bridge-network

テストとしてDocker側とJetson側で下記の通信ができることを確認してみましょう。

ros2 run demo_nodes_cpp talker

ros2 run demo_nodes_py listener

確認ができればOKです。

Docker Foxy Container側でrealsenseのノードを起動し、Jetson Eloquent側で映像を描画してみます。

Docker Containerを出ると、STATUS: Exitedとなるためsudo docker container start ros2_foxyでコンテナを起動し、sudo docker attach ros2_foxyで先程のコンテナに入ります。

root(Docker Foxy)
cd ~/ros2_ws
. install/setup.bash
ros2 launch realsense_examples rs_camera.launch.py


  • その他ROS/ROS2イメージインストールで試したこと

NVIDIAよりAI用のイメージが公開されているようで、イメージをpullしてみましたが、apt updateが通らなかった点や上記のほうが多様なros/ros2ディストリビューションを選べるため、今回はこちらをスルーしました。

https://github.com/NVIDIA-AI-IOT/ros2_jetson/tree/main/docker


  • Dockerでよく使用したコマンドたち
# Dockerイメージの一覧表示
sudo docker image ls

# Dockerイメージの停止&削除
sudo docker image rm --force [IMAGE ID]

# Dockerコンテナの一覧表示
sudo docker container ps -a

# コンテナに名前をつけて起動
sudo docker container run -it --name ros2_foxy 45f7e3294c0d

# コンテナの起動と停止
sudo docker container start ros2_foxy
sudo docker container stop ros2_foxy

# コンテナの停止&削除
sudo docker container rm --force [CONTAINER ID]

# 起動中のコンテナに入る
sudo docker container exec -it ros2_foxy bash
sudo docker attach ros2_foxy

# コンテナからイメージを作成する: commit [元のコンテナ] [新規コンテナ]
sudo docker commit ros2_foxy ros2_foxy_rs

# Docker Networkの一覧表示
sudo docker network ls

以上。
2022/12月よりJetson Nanoが昨年の2倍以上の価格で再販売されるようになったので、Jetson NanoでRealsenseを使用する方/研究室の学生が増えるのかなと思いまとめました。

少しでも参考にしていただければ幸いです。

Discussion