💨

Realsense + Jetson Orin + dockerの環境構築

2024/09/11に公開

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: trueruntime: nvidia のオプションを指定することが必要です。これにより、カメラのアクセス権限が適切に設定されます。
Dockerfile
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"]
docker-compose.yaml
version: '3'

services:
  depth_camera:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - ./test.py:/test.py
    tty: true
    privileged: true
    runtime: nvidia

フレーム取得のPythonコード

test.py
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()

動作確認手順

  1. JetsonのUSB 3.0ポートにRealsense D456を接続します。
  2. 任意のディレクトリに以下のようにファイルを配置します。
.
├── Dockerfile
├── docker-compose.yaml
└── test.py
  1. コンテナを起動します。
docker compose up -d
  1. コンテナにアタッチします。
docker exec -it {CONTAINER ID} /bin/bash
  1. コードを実行します。
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を使用する際には、正しいベースイメージの選択が非常に重要です。このガイドに従っても、動作しない場合があるかもしれませんが、その際にはこの記事が完全ではないことをご了承の上、コメントで質問やフィードバックをお寄せください。

SRE Holdings 株式会社

Discussion