Auducam ToF カメラ

Arducamから発売されている距離の計測可能なカメラを試してみました。アイディア次第でいろいろいなことに使えそうです。

Auducam ToF カメラ

まとめると

メッシュ状に距離計測できる
1点での計測ではなく、1度に240x180ピクセルのメッシュ状に距離を計測することができます。いわゆる点群です。
対応言語はPython/C/C++
公式ライブラリをインストールするとC++やPython等から利用することができます。インストール方法もコマンドをいくつか実行するだけで可能なのでそれほど難易度は高くないように思いますが、そのままで動かない場合もあるので注意は必要です。
赤外線レーザー
このカメラは 940nmレーザーが物体に反射して戻ってくるまでの時間を計測し距離を求めています。これはToFと呼ばれる仕組みで、ピンポイントの測定にはVL53L0X等が有名です。可視光線ではないため見ることは出来ず、人の目にも安全とされています。しかし、レーザー反射が弱いガラス等とは相性が悪いです。
電源は 5V 4A 必須
付属の電源ケーブルにも記載されていますが、Rasperry Pi で利用する際は 5V 4A 以上の電源を利用する必要があります。Raspberry Piキットなどには5V 3Aのものが多いため注意が必要です。
Getting Started: Arducam ToF Camera for Raspberry Pi - Arducam Wiki
https://docs.arducam.com/Raspberry-Pi-Camera/Tof-camera/Getting-Started/
LIDARとは

LIDARは、光学式レーザー測距によって物体の距離を測定する技術です。LIDARもレーザーを発射し、物体に反射させた光を検出し、そのレーザー光の戻ってくる時間から物体までの距離を計算します。LIDARは主に自動運転車やロボットなどに使用され、物体の3次元の形状や障害物の検出、追跡、地形計測などに用いられます。

スペック

TOF Camera - Arducam Wiki
有効ピクセル240×180
イメージサイズ1/6″
最大フレームレート(センサー)120fps
最大フレームレート(Raspberry Pi)30fps, 4-phase
対応Raspberry Pi OSBullseye (32-bit/64-bit) 01/28/22 or later releases
TDPラズベリーパイを含み3.5W(少なくとも5V/4A)
対応ボードPi 2/3/CM3/4B Zero W/Zero 2 W/CM4
画角70° 対角
測距モード遠距離モード: 4m 近距離Mode: 2m
レーザー光源940nm VCSEL illuminator
ボードサイズ38mm x 38mm
インタフェースMIPI (2-Lane)
出力フォーマット4-phases RAW Frame, Depth Frame,Grayscale Amplitude Frame

取得できるフォーマット

以下のフォーマットにて取得することができます。

4-phases RAW Frame, Depth Frame,Grayscale Amplitude Frame

RAWや深度フレーム以外にグレースケールがあるため、ある程度視認できる形で画像を取得することができます。これは有効ピクセル的にも光学式カメラを置き換えるものではありませんが、用途によっては十分な場合もありそうです。

自分で試した限りですが、線形補完してあげるとだいぶそれっぽい感じになります。

解像度が低いので普通のカメラの代用にはならないかなぁ・・

完全に暗くても利用できる

また、このセンサーは外部の光源を必要としないので、完全に真っ暗な状態でも利用する事ができます。しかし、仕組み上距離が遠くなるにつれ解像度が低下する傾向が強いので、利用する条件にマッチするかあらかじめ確認が必要です。

電源ケーブル

付属の電源ケーブルはRaspberry Pi のGPIOに接続するように書かれていますが、コネクタの形状がこのようになっているため、少し干渉しています。このコネクタを利用するのは正直オススメしません。

コネクタどうしてコレになっちゃったの!

サンプル

サンプルプログラムが用意されているので実行してみました。PythonとC/C++が用意されます。

選択したエリアの距離を表示するプログラムになっています。モノクロでは距離によっては人の判別も可能なレベルでクリアです。

価格

公式サイトでは$49.99(執筆時点)となっており、メッシュ状に距離を計測できるデバイスとしてはかなり安価な印象を受けます。LIDARでよくある360度計測ではありませんが、モーターや回転する部品無しでメッシュ取得できるのは良いですね。

MEMO

物理的に動くモーター等の部品は、いつかは必ず利用できなくなります。しかしこのセンサーは可動部品が無いためレーザーや受光部などの寿命まで利用できそうです。

Arducam Time of Flight ToF Camera for Raspberry Pi Nvidia Jestson
A ToF (Time of Flight) Camera is a brand new camera module with 3D depth sensing function using a Time-of-Flight way.

長時間利用

個体差の可能性も十分にありますが15分程度連続で利用していると、精度が悪くなってくる印象を受けました。画像でいうとノイズが多くなるといった感じです。付属していたケースにもファンをマウントする部分が用意されていましたので、長時間や設置期間が長くなる場合はファンを利用するなどの対策が必要になるものを思われます。

しかし、基本的に利用している時以外は発熱しないので、アプリ側からフレームレートを落とすなどの調整である程度ファンレスも実用可能なレベルです。

また、長時間利用していると完全に外れた値になる場合もあったりと、若干エラーハンドリングを考慮して作る必要がありそうです。

ケース

Kickstarterでバックした場合は、ケースがおまけで付属していました。実際に設置して利用する際に結構必要になる場合も多いので地味に助かります。素材はABSで出来ており、かなり丈夫に出来ています。

ケースに収めた状態

ファンのネジ間サイズは 30mm x 30 mm です。サイズ的に小さいので、選択肢は少ないですがそれほど強力なものでなくても何日か稼働させてみた感触からOKそうな感じがしています。

ファンの外形サイズで40mm x 40mmのファンを利用することができますが、若干タイトめなので、ケースに入らないものもあるかもしれません。

カメラでよく利用されているネジ穴がありますので、固定に便利ですが、ケーブル以外にファンやこのカメラに電源供給の必要があるのでどのように運用するか事前よく考えておく必要がありそうです。

その他ちょっと面倒だった事

Pythonのサンプルも入っていたため、実行してみたところ私の環境では残念ながらエラーとなってしまいました。pipでインストールされるバージョンでは私の環境では動かなかったので、OpenCVを手動でビルドとインストールを実行しました。

GitHub - kotamorishi/installOpenCV: Comprehensive installer for OpenCV on Raspbian (raspberry Pi). Does NOT install virtualized.
Comprehensive installer for OpenCV on Raspbian (raspberry Pi). Does NOT install virtualized. - GitHub - kotamorishi/installOpenCV: Comprehensive installer for OpenCV on Raspbian (raspberry Pi). ...
OpenCV のビルドスクリプト
自力ビルドした場合はパスを忘れずに!
export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.9/site-packages/

Jetson Nanoでも使える

注意

これは私が試しただけで、JetPack 4.x は Arducamは公式サポートしていません。

残念ながらPythonではモジュールのインストールに失敗してしまい利用することができませんでしたが、C/C++からは問題なく利用することができました。

Pythonじゃないと動画にしにくい!!

v4l2デバイスとして利用できるので、それなりに利用しやすいのかなと思います。

v4l2-ctl --all

Driver Info (not using libv4l2):

Driver name : tegra-video

Card type : vi-output, arducam-csi2 6-000c

Bus info : platform:54080000.vi:0

Driver version: 4.9.255

Capabilities : 0x84200001

Video Capture

Streaming

Extended Pix Format

Device Capabilities

Device Caps : 0x04200001

Video Capture

Streaming

Extended Pix Format

Priority: 2

Video input : 0 (Camera 0: no power)

Format Video Capture:

Width/Height : 240/180

Pixel Format : 'Y12 '

Field : None

Bytes per Line : 512

Size Image : 92160

Colorspace : sRGB

Transfer Function : Default (maps to sRGB)

YCbCr/HSV Encoding: Default (maps to ITU-R 601)

Quantization : Default (maps to Full Range)

Flags :


User Controls


exposure 0x00980911 (int) : min=1 max=65523 step=1 default=800 value=800

horizontal_flip 0x00980914 (bool) : default=0 value=0

vertical_flip 0x00980915 (bool) : default=0 value=0

trigger_mode 0x00981901 (bool) : default=0 value=0

disable_frame_timeout 0x00981902 (bool) : default=0 value=0

frame_timeout 0x00981903 (int) : min=100 max=12000 step=1 default=2000 value=2000

frame_rate 0x00981906 (int) : min=5 max=120 step=1 default=60 value=60


Camera Controls


bypass_mode 0x009a2064 (intmenu): min=0 max=1 default=0 value=0

override_enable 0x009a2065 (intmenu): min=0 max=1 default=0 value=0

height_align 0x009a2066 (int) : min=1 max=16 step=1 default=1 value=1

size_align 0x009a2067 (intmenu): min=0 max=2 default=0 value=0

write_isp_format 0x009a2068 (bool) : default=0 value=0

sensor_signal_properties 0x009a2069 (u32) : min=0 max=0 step=0 default=0 flags=read-only, has-payload

sensor_image_properties 0x009a206a (u32) : min=0 max=0 step=0 default=0 flags=read-only, has-payload

sensor_control_properties 0x009a206b (u32) : min=0 max=0 step=0 default=0 flags=read-only, has-payload

sensor_dv_timings 0x009a206c (u32) : min=0 max=0 step=0 default=0 flags=read-only, has-payload

low_latency_mode 0x009a206d (bool) : default=0 value=0

preferred_stride 0x009a206e (int) : min=0 max=65535 step=1 default=0 value=0

sensor_modes 0x009a2082 (int) : min=0 max=30 step=1 default=30 value=1 flags=read-only


Image Source Controls


vertical_blanking 0x009e0901 (int) : min=0 max=0 step=1 default=0 value=0

horizontal_blanking 0x009e0902 (int) : min=0 max=0 step=1 default=0 value=0

analogue_gain 0x009e0903 (int) : min=100 max=3100 step=1 default=100 value=100


Image Processing Controls


pixel_rate 0x009f0902 (int64) : min=0 max=0 step=0 default=0 value=0 flags=read-only

記事の内容は間違いが無いように気をつけていますが、私の認識違いや、ミスなどにより間違っている可能性もあります。もし発見された場合はお問い合わせフォームよりご連絡頂けると幸いです。