Realsense + Jetson Orin + dockerの環境構築
SREホールディングス株式会社のデータサイエンティスト、北川です。今回はJetson Orinに接続したRealsense D456をDockerコンテナ内で使用するための手順をまとめました。このガイドは、DockerやPythonの基本的な操作に慣れている方を対象にしていますが、初めて触れる方でも理解できるよう、背景や関連技術についても簡単に説明します。この記事を通じて、コンテナ内でカメラで撮影したビデオフレームを取得し、扱えるようになることを目指しています。
背景
Jetson OrinにRealsense D456カメラを接続し、pyrealsense2
ライブラリを使用してカメラからのフレームを取得しようとしたところ、ホスト環境では正常に動作するものの、Dockerコンテナ内ではエラーが発生し、フレームの取得に失敗しました。この記事では、その解決方法を詳しく説明します。
Realsense とは
Realsenseは、Intelが提供する深度カメラで、物体の距離や3Dデータを取得することができます。このカメラは、深度センサーを備え、主に物体検出や空間認識に使用されます。Realsenseは、赤外線プロジェクターとカメラセンサーを組み合わせて、深度データを提供します。
pyrealsense2
とは
pyrealsense2
は、Intel RealSenseカメラをPythonプログラムから操作するための公式ライブラリです。このライブラリを使用すると、カメラからの深度データやカラー画像を取得することができます。また、カメラの各種設定をプログラムから制御することが可能です。
Jetson Orinとは
Jetson Orinは、NVIDIAが提供する組み込みシステム向けのコンピューティングプラットフォームです。主にAIやロボティクスの分野で利用され、高い演算能力を持つことが特徴です。Jetson Orinは、GPUを搭載しており、リアルタイム処理や推論タスクに適しています。
動作確認環境
Required Info | |
---|---|
Platform | NVIDIA Jetson Orin NX 8GB |
OS & Version | Linux (Ubuntu 20.04) |
Camera Model | Realsense D456 |
Language | Python 3.8 |
SDK Version | pyrealsense2 2.55.1.6486 |
Dockerfileとdocker-compose.ymlの作成
重要なポイント
Dockerfile
- ベースイメージとして、
nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04
を使用することが非常に重要です。これにより、Jetson OrinとRealsense D456カメラの組み合わせでフレームを安定して取得できます。単なるubuntu
ベースのイメージでは、同様の結果が得られない可能性があります。 - また、カメラのデバイスへのアクセスを許可するために、ユーザーを
video
グループに追加する設定も必要です。
docker-compose
- Dockerコンテナの起動時には、
privileged: true
とruntime: nvidia
のオプションを指定することが必要です。これにより、カメラのアクセス権限が適切に設定されます。
FROM nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04
ARG USER_NAME=docker
ARG GROUP_NAME=docker
ARG UID=1000
ARG GID=1000
ENV LC_ALL="C.UTF-8"
ENV TZ=Asia/Tokyo
ENV HOME=/home/${USER_NAME}
ENV PYTHONPATH=:${APPLICATION_DIRECTORY}:${HOME}:${PYTHONPATH}
ENV PATH="${HOME}/.local/bin:$PATH"
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \
sudo \
python3.10 \
python3-pip \
ffmpeg \
make
RUN groupadd -g ${GID} ${GROUP_NAME} \
&& useradd -ms /bin/bash --uid ${UID} -g ${GID} -G sudo,video ${USER_NAME} \
&& echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER ${USER_NAME}
RUN pip install pyrealsense2
CMD ["/bin/bash"]
version: '3'
services:
depth_camera:
build:
context: .
dockerfile: ./Dockerfile
volumes:
- ./test.py:/test.py
tty: true
privileged: true
runtime: nvidia
フレーム取得のPythonコード
import pyrealsense2 as rs
config = rs.config()
pipeline = rs.pipeline()
profile = pipeline.start(config)
try:
while True:
frames = pipeline.wait_for_frames()
print(frames)
finally:
pipeline.stop()
動作確認手順
- JetsonのUSB 3.0ポートにRealsense D456を接続します。
- 任意のディレクトリに以下のようにファイルを配置します。
.
├── Dockerfile
├── docker-compose.yaml
└── test.py
- コンテナを起動します。
docker compose up -d
- コンテナにアタッチします。
docker exec -it {CONTAINER ID} /bin/bash
- コードを実行します。
python3 test.py
実行結果: フレームの取得が可能になります。
docker@6d1841f87082:/$ python3 test.py
<pyrealsense2.frameset Z16 #13 @1724143112400.939453 RGB8 #6 @1724143111809.138916
<pyrealsense2.frameset Z16 #13 @1724143112400.939453 RGB8 #7 @1724143111848.474854
<pyrealsense2.frameset Z16 #13 @1724143112400.939453 RGB8 #8 @1724143111886.998047
<pyrealsense2.frameset Z16 #13 @1724143112400.939453 RGB8 #9 @1724143111925.277588
<pyrealsense2.frameset Z16 #13 @1724143112400.939453 RGB8 #10 @1724143111963.316406
一方、ベースイメージをFROM ubuntu:20.04
に変更すると、以下のようにフレームの取得ができなくなります。
docker@8efae1af8780:/$ python3 test.py
Traceback (most recent call last):
File "test.py", line 9, in <module>
frames = pipeline.wait_for_frames()
RuntimeError: Frame didn't arrive within 5000
まとめ
Docker環境でJetson OrinとRealsense D456を使用する際には、正しいベースイメージの選択が非常に重要です。このガイドに従っても、動作しない場合があるかもしれませんが、その際にはこの記事が完全ではないことをご了承の上、コメントで質問やフィードバックをお寄せください。
Discussion