NVIDIA Jetson

初心者向け!Jetson NanoとAIカメラ(LUXONIS OAK-D-S2)の使い方

初心者向け!Jetson NanoとAIカメラ(LUXONIS OAK-D-S2)の使い方

前回の記事では、WEBカメラを使いAIを活用して、手の特定の部分(指先や手のひら)を

検出しました。

今回は、より高度なAI処理が可能な LUXONIS製 AIカメラ「OAK-D-S2」 を使用します。

このカメラを使えば、カメラ本体でAI処理が可能 になり、

Jetson Nanoと組み合わせることで、手軽に高速な視覚認識システム を構築できます。

初心者向けに インストールから基本的な使い方まで を詳しく解説し、

実際に動作するプログラムを作成していきます。

 

トラブルシューティングのポイントも紹介しています。

AIカメラ OAK-D-S2を実際に使ってみましょう。

<一部アフィリエイトリンクが含まれています>

 

 

 

 

AIカメラ LUXONIS OAK-D-S2の特徴と使い方

OAK-D-S2の特徴

最近のAI技術の進化により、カメラは単なる撮影ツールではなく、

顔認識や物体検出などの高度な処理をリアルタイムで実行 できるようになりました。

特に OAK-D-S2 は、以下の機能を備えた オールインワンAIカメラ です。

 

①深度カメラ(ステレオカメラ) を搭載し、距離を正確に測定可能。
②AIプロセッサー内蔵 で、Jetson NanoやPCの負荷を軽減。
③USB 3.0接続 で、高速データ通信が可能。
④手の検出、物体認識、ジェスチャー認識 など、多彩なAI処理をサポート。

 

AIカメラ LUXONIS OAK-D-S2(自動終点)を使ってみる

WEBカメラを使うだけではなく、AIカメラを使いたい場合は、
いくつか設定を変更する必要があります。
次の手順に従って設定を変えていきます。

【必要な設定変更】

1.cv2.VideoCapture(0) → depthai.Pipeline() に変更
2.OAK-D-S2 からフレームを取得し、MediaPipe を使用
3.dai.Device(pipeline) を使用してカメラ制御
4.手首検出の処理は MediaPipe を継続使用

1.depthai.Pipeline() に変更

cv2.VideoCapture(0) を変更
最初に、普通のWEBカメラを使うコードから、AIカメラに対応できるように書き換えます。これを、depthai.Pipeline() に変更します。

2.OAK-D-S2から画像を取得してMediaPipeを使用

OAK-D-S2から画像を取得してMediaPipeに渡す
OAK-D-S2というAIカメラから映像(フレーム)を取り込み、手首の検出を行うために、MediaPipeというライブラリにその映像を渡します。

3.dai.Device(pipeline) を使用してカメラ制御

dai.Device(pipeline) を使ってカメラの操作をする
dai.Device(pipeline) を使って、カメラの操作や設定を行います。
このコードで、OAK-D-S2がどのように動作するかを制御します。

4.手首の検出にはMediaPipeを継続使用

手首の検出にはMediaPipeを引き続き使う
手首を検出する処理については、引き続きMediaPipeを使います。つまり、カメラの映像をAIで処理した後、手首を検出する部分はMediaPipeで行います。

 

AIカメラ セットアップ

DepthAI の Python ライブラリをインストール

まず、DepthAIというライブラリをインストールします。

これを使って、OAK-D-S2とやり取りをします。

インストールのコマンドは以下の通りです。

OAK-D-S2をJetson Nanoで使用するには、

DepthAIライブラリをインストールする必要があります。

DepthAI の Python ライブラリをインストール

pip install depthai

 

または、以下のコマンドでインストールします。

pip3 install depthai

 

もし、これでうまくいかない場合は、

以下のコマンドを使ってインストールします

sudo pip3 install depthai

 

これで、DepthAIライブラリがインストールされます。

 

DepthAI が正しくインストールされているか確認

インストール後に、以下のコマンドを実行して、

インストールが正しく行われたか確認します。

python3 -c "import depthai; print(depthai.__version__)"

 

このコマンドを実行すると、DepthAIのバージョンが表示されます。

バージョンが表示されたら、インストールは成功です!

「Ver.2.29.0.0」と表示されています。

正常にインストールされています!

 

エラーが出る場合

1. 仮想環境を使用している場合 仮想環境 (venv や conda) を使用している場合は、仮想環境内で pip install depthai を実行してください。

2. Jetson の Python パスを確認 Jetson Nano では、標準の Python と pip のバージョンが異なる場合があります。

Python のバージョンを確認します。

python3 --version
pip3 --version

 

Python のパスを確認:

which python3
which pip3

 

正しい pip3 で depthai をインストールします。

 

OAK-D-S2 が接続されているか確認

OAK-D-S2がJetson Nanoに正しく接続されているか確認します。

以下のコマンドを実行して確認します

 

lsusb

 

これを実行すると、OAK-D-S2が認識されているかどうかが表示されます。

認識されていれば、出力に「Luxonis」または「Intel Movidius」という

デバイスが表示されます。

 

もし表示されない場合は、USBケーブルを変更して試します。

 

udev ルールを設定

OAK-D-S2を使うには、udevルールの設定が必要です。

以下のコマンドを実行して、設定を行います

echo "Setting up Luxonis udev rules..."
sudo wget -qO- https://docs.luxonis.com/_static/install_dependencies.sh | bash

 

これで、udevルールが設定されます。

 

DepthAI デバイスが利用可能か確認

以下のコマンドを実行して、

OAK-D-S2 が正しく認識されているか確認します。

python3 -c "import depthai; print(dai.Device().getDeviceInfo())"

 

正常にデバイス情報が表示されれば、問題なく動作するはずです。

これで、デバイス情報が表示されれば、OAK-D-S2が正常に動作しています。

 

上記の手順を試しても動作しない場合OAK-D-S2 のファームウェアを更新します。

 

OAK-D-S2 のファームウェアを更新

OAK-D-S2 のファームウェアが古い可能性があります。

次のコマンドを実行して、最新の DepthAI を取得し、

ファームウェアを更新してください。

python3 -m pip install -U depthai

Jetson Nanoを、再起動します。

2. OAK-D-S2 のパーミッション設定

(1) udev ルールを手動で設定

以下のコマンドを実行し、

OAK-D-S2 の udev ルールを設定します。

echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="03e7", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/99-luxonis.rules

パスワードを入力して、ルールの設定がされます。

以上で設定が完了しました。

実際に動作させてみましょう。

サンプルプログラム

OAK-D S2を使って手を検出し、人差し指の先端をターゲットにする

簡単なサンプルプログラムを作成します。

 

AIカメラ「OAK-D S2」を使った、サンプルプログラムの動作は

手を検出し、人差し指の先端をターゲットとしてマーク(緑の円)骨格を描画し、

手のランドマークを表示します。

‘q’キーでプログラム終了します。

 

<指の動きを認識する OAK-D S2 用サンプルプログラム>

import cv2
import depthai as dai
import mediapipe as mp

# Mediapipe の初期化
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

def create_pipeline():
    """OAK-D S2 のパイプラインを作成"""
    pipeline = dai.Pipeline()

    # RGB カメラノードを作成
    cam_rgb = pipeline.create(dai.node.ColorCamera)
    cam_rgb.setPreviewSize(640, 480)
    cam_rgb.setInterleaved(False)
    cam_rgb.setFps(30)
    
    # XLinkOut ノード(データ出力用)
    xout_rgb = pipeline.create(dai.node.XLinkOut)
    xout_rgb.setStreamName("video")
    cam_rgb.preview.link(xout_rgb.input)

    return pipeline

def start_camera():
    """OAK-D S2 を使用して手を検出し、指の動きを認識する"""
    pipeline = create_pipeline()

    # DepthAI デバイスと接続
    with dai.Device(pipeline) as device:
        video_queue = device.getOutputQueue(name="video", maxSize=1, blocking=False)

        with mp_hands.Hands(
            max_num_hands=1,
            min_detection_confidence=0.7,
            min_tracking_confidence=0.5) as hands:

            while True:
                # フレームを取得
                in_frame = video_queue.get()
                frame = in_frame.getCvFrame()
                image = cv2.flip(frame, 1)  # 左右反転

                # MediaPipe で処理するために RGB 変換
                image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
                results = hands.process(image_rgb)

                if results.multi_hand_landmarks:
                    for hand_landmarks in results.multi_hand_landmarks:
                        # 人差し指の先端座標を取得
                        index_finger_tip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
                        h, w, _ = image.shape
                        x, y = int(index_finger_tip.x * w), int(index_finger_tip.y * h)

                        # 指先にターゲットマークを表示
                        cv2.circle(image, (x, y), 10, (0, 255, 0), -1)
                        cv2.putText(image, "Index Finger", (x + 10, y - 10),
                                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)

                        # 骨格を描画
                        mp_drawing.draw_landmarks(image, hand_landmarks, mp_hands.HAND_CONNECTIONS)

                # 画像を表示
                cv2.imshow('Finger Tracking (OAK-D S2)', image)

                # 'q'キーで終了
                if cv2.waitKey(5) & 0xFF == ord('q'):
                    break

    cv2.destroyAllWindows()

# カメラ開始
start_camera()

 

このコードを実行してみます。

手の動きを検出し、指の位置をリアルタイムで確認できます!

他の指の認識や、ジェスチャーの判定を追加することも可能です。

 

AIカメラ「OAK-D S2」をUSB電源で使用する際の注意点

AIカメラ「OAK-D S2」は、USB 3.0 接続を使用する高性能なデバイスですが、

使用環境によっては十分な電力を供給できない場合があります。

特に、Jetson Nano に接続する際、デフォルトの USB ポートの出力が 500mA に

制限されているため、動作が不安定になる可能性があります。

 

Jetson Nano の USB ポートはデフォルトで 500mA の電流しか供給できません。

OAK-D S2 は動作時には 900mA 以上 の電流を必要とする場合があります。

そのため、Jetson Nano に直接接続すると、

以下のような問題が発生することがあります。

 

①動作が不安定になる(カメラが正常に認識されない・フリーズする)

②デバイスが認識されない(USB接続が途切れる)

③映像処理時に電力不足で動作が遅くなる

 

USB電源から安定供給する方法

OAK-D S2 を Jetson Nano に接続して安定動作させるには、

以下のいずれかの方法を採用します。

① 外部USB電源を使用する(推奨)

OAK-D S2 には USB Type-Cポート があり、外部電源(5V/2A以上)

接続することで安定動作が可能です。

【必要なもの】

 電源分離アダプタ

 5V/2A 以上の USB アダプタ

 USB Type-C ケーブル

 

 

 

接続手順

OAK-D S2 の USB Type-C ポートに、5V/2A 以上のUSB電源を接続

Jetson Nano の USB 3.0 ポートに、USB Type-C ケーブルで OAK-D S2 を接続

 

コマンドでデバイスが認識されているか確認

lsusb

 

 

Jetson Nano の USB 電流制限を解除する

Jetson Nano には、USB ポートの電流制限を解除し、最大 1.2A まで供給する

設定があります。

 

ターミナルを開き、以下のコマンドを実行します。

echo 1 | sudo tee /sys/kernel/debug/usb/../authorized

 

設定を固定化する場合は、rc.local に追加

sudo nano /etc/rc.local

 

以下の行を追加(exit 0 の前に記述)

echo 1 > /sys/kernel/debug/usb/../authorized

 

保存して Jetson Nano を再起動

sudo reboot

 

この方法は Jetson Nano の電力供給能力に依存するため、

電源アダプタが 5V/4A 以上 であることが必要です。

 

 

まとめ

AIカメラ「OAK-D S2」 を使用して、手の指を検知する方法を解説しました。

・OAK-D S2のセットアップ方法
・DepthAIのインストールと接続確認
・手の検出プログラムの実装

Jetson Nano に接続する際の USB電源の供給方法 や、指のランドマークを

活用した検出方法 について詳しく紹介しました。

 

OAK-D S2 の活用により、リアルタイムで高速で手指トラッキングが可能になり、

ジェスチャー操作やAIへの応用が広がります。

また、電力供給の最適化により、より安定した動作を実現できることも確認しました。

複数の指の動きに応じたアクション設定 や、ジェスチャー認識の精度向上に

挑戦するのも面白いでしょう。

OAK-D S2 と Jetson Nano を活用し、さまざまなAIアプリケーションを

作ってみてください!

 

【JetsonNano】サイト内の全リンク案内:カテゴリ別に探そうNVIDIA Jetson Nano関連 Jetson Orin Nanoとは?最新AI開発キットの魅力と性能 URL: Jetso...