ArduCAM ToF Camera:Raspberry Pi CM5で深度センシングを検証

ArduCAMブランドは、Raspberry Pi 用カメラモジュールも販売しているので使った人もいるでしょう。
今回は同じカメラモジュールでも、ToFというちょっと特殊なカメラで、簡単に言えば撮影対象の深度が分かるカメラです。

写真は産業用Raspberry Pi (CM5)のPL-R5 BASE BOARDです。市販のRaspberry Pi でもFPCケーブルで接続できます。
普通のカメラモジュールと異なるのは、カメラ自体にも電源が必要なことです。GPIO端子に繋いで電源を取ります。

ToFとLiDARの違い

ToFカメラと似ているものにLiDARが挙げられます。
どちらもレーザー光の反射を利用していることから違いが分かりにくいですね。
あまり区別しない場合もあるようですが、特徴が違うためそれぞれが適する環境があります。

大まかに分類すると、小規模な現場ではToFが選ばれやすく、大規模な現場ではLiDARが選ばれやすいと言えそうです。

但し、利用の仕方によっては、どちらでも適応します。
例えば、LiDARにも性能によって中間カテゴリがあります。製品によっては「小規模でもLiDAR適合」や「大規模でもToFで足りる」ケースがあります。
最終判断はカーバーしたい範囲や精度、導入&運用コストなど、様々な環境条件で決めることになるでしょう。

比較項目小規模現場(ToFが適しやすい)大規模現場(LiDARが適しやすい)
距離レンジ数cm〜数十m以内数十m〜数百m以上
必要精度数cm〜数十cmcmオーダー〜高精度
データ要求単点測距、低〜中解像度深度マップ高密度3Dポイントクラウド、広域マッピング
主な制約低コスト、低消費電力、小型、簡単設置設置スペース、電源容量、レーザー安全対策、保守性
導入コスト比較的に低い比較的に高い
装置サイズ小型化しやすい大型化しやすい
得意環境屋内、近距離、組み込み用途屋外、広範囲、高所、大空間
代表用途近接検知、短距離障害物回避、ジェスチャー認識、棚管理、組み込みセンサ自動運転、地形測量、屋外監視、倉庫の全体マッピング
Raspberry Piとの親和性良い用途次第で良い(高価・高負荷になりやすい)
向いている判断軸手軽に距離取得したい広範囲を高精度3D計測したい

「ArduCAM ToF Camera」商品スペック

ArduCamToFカメラの詳細をまとめました。
接続がRaspberry Piのカメラモジュール端子と簡単にできて、V4L2ベースのビデオカーネルデバイスに対応しているため、すぐに試すことができます。

項目内容
製品概要ToF方式 深度カメラモジュール
主な特徴リアルタイム点群(Point Cloud)・深度マップ出力
有効画素数240 × 180
センサーサイズ1/6インチ
Raspberry Piでの解像度 / FPS240 × 180 @ 30fps
センサー最大フレームレート120fps
最大深度フレームレート(Raspberry Pi)30fps(4-phase)
最大深度フレームレート(NVIDIA Jetson)30fps(4-phase)
測定距離Far Mode:4m / Near Mode:2m
変調周波数75MHz / 37.5MHz
視野角対角 70°
光源940nm VCSEL レーザー内蔵
屋内外利用可(外部照明不要)
インターフェースMIPI(2-Lane)
出力形式4-phase RAW / Depth Frame / Grayscale Amplitude Frame
Linux対応V4L2ベースのビデオカーネルデバイス
SDKC / C++ / Python
ROS対応対応済み
対応OSRaspberry Pi OS Bookworm / Bullseye(32bit / 64bit)2022/01/28以降
対応ハードウェアRaspberry Pi 5 / 4 / 2 / 3 / CM3 / CM4 / Zero W / Zero 2 W / NVIDIA Jetson
消費電力(TDP)3.5W
推奨電源5V / 4A以上
基板サイズ38mm × 38mm

今回の環境

  • 産業用Raspberry Pi (CM5) PL-R5 BASE BOARD
  • ArduCAM ToF カメラ(要給電)
  • Raspberry Pi OS Trixie
      - Model: Raspberry Pi Compute Module 5 Rev 1.0
      - OS: Debian GNU/Linux 13 (trixie)
      - Kernel: 6.12.54-v8-16k+
      - Python3.13

注意点:最新のTrixieで試しましたが、現在は以前のバージョンであるBookwormまたはBullseyeの方が安定動作します。

Config.txtに追記

config.txtにカメラモジュールの記述を追加する必要があります。再起動で有効です。

sudo nano /boot/firmfare/config.txt
dtoverlay=arducam-pivariety,cam0

サンプルプログラム(C/C++)を試した

./Install_dependencies.shを実行するには、Driver、Dependencies、SDK、OpenCVが必要とあります。
git cloneしてインストールとビルド用シェルスクリプトを実行すればサンプルアプリが起動します。

C/C++サンプルプログラムが利用する共有ライブラリのlibArducamDepthCamera.solibArducamDepthCamera4C.so がありましたので、C/C++のサンプルプログラムはそのまま動作します。

今回のTrixie環境では、Pythonのサンプルプログラムと、C++のPoint Cloudは追加の対応とコードの修正が必要でした。

github:https://github.com/ArduCAM/Arducam_tof_camera/
SDK:https://docs.arducam.com/Raspberry-Pi-Camera/Tof-camera/Arducam-ToF-Camera-SDK/

git clone https://github.com/ArduCAM/Arducam_tof_camera.git
cd Arducam_tof_camera
./Install_dependencies.sh
./compile.sh

サンプルプログラム(C/C++)は個別にも実行できますが、3つ全てを実行させるコマンドは./compile.shの後、ターミナルに表示されました。

/home/$USER/Arducam_tof_camera/build/example/cpp/example

個別の場合:

  cd build/example/cpp
  ./preview_depth
  # または
  ./capture_raw

実行した画面

実行すると、画面には3つのウィンドウが表示されます。

カメラの前に手をかざしてみると、色で深度の違いが分かります。

Pythonのサンプルプログラムは対応が必要

今回の環境では、Pythonのサンプルプログラム(preview_depth.py)はそのまま動作しませんでした。

エラー:

ModuleNotFoundError: No module named 'ArducamDepthCamera'
# または
ModuleNotFoundError: No module named 'cv2'

Pythonサンプルの import ArducamDepthCamera には、Python用にビルドされた拡張モジュールが必要です。
Raspberry Pi OS TrixieでPython3.13の環境では、このPython用モジュールが提供されていないか、またはインストールされていないため、ModuleNotFoundError が発生していると考えられます。

調べると、PyPIにarducamdepthcameraというPythonパッケージがありました。2026年3月時点で最新版は0.1.24(https://pypi.org/project/arducamdepthcamera/)

Python3.13の環境でも、仮想環境を --system-site-packages 付きで作成すれば、apt版OpenCVとpip版ArduCAMでPythonバインディングを併用できました。
Raspberry Pi ではpip版opencv-pythonが重く不安定な場合がありますから、システムのapt版を仮想環境から使う方法が実用的です。

pip install --upgrade pip
python3 -m venv --system-site-packages ~/venv-arducam # 初回だけ作成
source ~/venv-arducam/bin/activate # 毎回実行か.bashrcにエイリアスを追加
pip install arducamdepthcamera # 一度だけインストール

確認してみます。

python3 -c "import numpy; print(numpy.__version__, numpy.__file__)"
python3 -c "import cv2; print(cv2.__version__)"
python3 -c "import ArducamDepthCamera as ac; print(ac)"

結果、numpyはvenv内を使用し、cv2は4.10.0とシステム側、最後のArducamDepthCameraもvenv内を使用しています。

1.26.4 /home/pi/venv-arducam/lib/python3.13/site-packages/numpy/__init__.py
4.10.0
<module 'ArducamDepthCamera' from '/home/pi/venv-arducam/lib/python3.13/site-packages/ArducamDepthCamera/__init__.py'>

Pythonのサンプルプログラムを実行

再ビルドした後、Pythonのサンプルプログラムを実行してみると無事に起動しました。

python3 ~/Arducam_tof_camera/example/python/preview_depth.py

arducamdepthcamera は仮想環境内にインストールされたため、Pythonサンプルを実行する前に仮想環境を有効化する必要があります。

source ~/venv-arducam/bin/activate

この状態で実行しないと、システム側のPythonからは ArducamDepthCamera が見つからず、再び ModuleNotFoundError になります。

Point Cloud(点群)

ArduCAMのPoint CloudサンプルコードもPython同様にそのままビルドができませんでした。
調べると、Raspberry Pi OS Trixie に搭載されたOpen3DのAPI仕様が変更により、サンプルコード側の記述を現在のOpen3Dに合わせて修正することで解決しました。

修正個所

エラーのあった~/Arducam_tof_camera/open3d_preview/preview_pointcloud.cppの159行目〜にあるcase文内、160行目から6行分を差し替える必要がありました。

        case 's': {
            open3d::io::WritePointCloudToPCD( //
                "pointcloud.pcd", pcd,
                {
                    open3d::io::WritePointCloudOption::IsAscii::Ascii,
                    open3d::io::WritePointCloudOption::Compressed::Uncompressed,
                });
        } break;
        case 's': {
            open3d::io::WritePointCloudOption option(
                "pcd",
                true,   // write_ascii
                false,  // compressed
                false   // print_progress
            );

            open3d::io::WritePointCloudToPCD(
                "pointcloud.pcd",
                pcd,
                option);
        } break;

もう一度ビルドし直します。

./compile_pointcloud.sh

今度はビルドが成功しました。
/home/$USER/Arducam_tof_camera/build/open3d_preview/preview_pointcloudで実行できます。

[ 50%] Building CXX object open3d_preview/CMakeFiles/preview_pointcloud.dir/preview_pointcloud.cpp.o
[100%] Linking CXX executable preview_pointcloud
[100%] Built target preview_pointcloud
== Build success
== Run /home/pi/Arducam_tof_camera/build/open3d_preview/preview_pointcloud

Depth(深度)画像

Depth画像は、対象物までの距離を色で表現しています。

min-rangeとmax-rangeのスライダーバーで調節ができました。
max-range(最大範囲)の初期値は4,000/6,000です。

3つ並べた画像のように、それぞれ1,378、2,082、4,000で比べてみると、最大値が高い方がより赤味が増え、低い方は黒色や青系が増えているのが分かります。
目の前に置いた手だと、最大範囲が4,000だと距離の遠近があまり分かりませんが、1,378程度だと手前と奥で色の違いがハッキリと分かります。それだけ遠近感が分かりやすいですね。

何を対象にするかで調節します。
スライダーバーを動かした動画をご覧ください。

また、手を近づけたり遠ざけたりする動画で色の変化が分かるでしょうか。

ToFカメラの産業用途

ToFカメラは、近距離〜中距離の空間を低消費電力かつリアルタイムに深度計測ができます。

産業用途では「手軽に3次元情報を取得したい現場」に適しています。

例えば、次のようなケースが想定できます。

  • 搬送ライン(コンベア)で物体の判定(有無や位置)
  • 簡易的な物物体の位置合わせ
  • 簡易的な在庫管理(空棚の検知など)
  • AGV・ロボットの障害物回避
  • 人の距離監視で混雑時の把握

省スペース・低コスト・組み込みやすさが求められる設備や装置に向いています。

中でも人の感知は、通常のカメラ(RGB)と違い、顔や服装ではなく距離情報(色)中心で扱えるため、プライバシーを配慮しながら人数や位置を把握しやすい のも利点です。

広範囲の高精度測量にはLiDARが有利ですが、現場設備へ組み込む実用センサーとして、手軽なToFカメラは有力な選択肢です。


記事寄稿:ラズパイダ

非エンジニアでも楽しく扱えるRaspberry Pi 情報サイト raspida.com を運営。ラズベリーパイに長年触れた経験をもとに、ラズベリーパイを知る人にも、これから始めたいと興味を持つ人にも参考になる情報・トピックを数多く発信。PiLinkのサイトへは産業用ラズベリーパイについて技術ブログ記事を寄稿。