Auducam ToF カメラ
Arducamから発売されている距離の計測可能なカメラを試してみました。アイディア次第でいろいろいなことに使えそうです。
まとめると
LIDARは、光学式レーザー測距によって物体の距離を測定する技術です。LIDARもレーザーを発射し、物体に反射させた光を検出し、そのレーザー光の戻ってくる時間から物体までの距離を計算します。LIDARは主に自動運転車やロボットなどに使用され、物体の3次元の形状や障害物の検出、追跡、地形計測などに用いられます。
スペック
有効ピクセル | 240×180 |
イメージサイズ | 1/6″ |
最大フレームレート(センサー) | 120fps |
最大フレームレート(Raspberry Pi) | 30fps, 4-phase |
対応Raspberry Pi OS | Bullseye (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度計測ではありませんが、モーターや回転する部品無しでメッシュ取得できるのは良いですね。
物理的に動くモーター等の部品は、いつかは必ず利用できなくなります。しかしこのセンサーは可動部品が無いためレーザーや受光部などの寿命まで利用できそうです。
長時間利用
個体差の可能性も十分にありますが15分程度連続で利用していると、精度が悪くなってくる印象を受けました。画像でいうとノイズが多くなるといった感じです。付属していたケースにもファンをマウントする部分が用意されていましたので、長時間や設置期間が長くなる場合はファンを利用するなどの対策が必要になるものを思われます。
しかし、基本的に利用している時以外は発熱しないので、アプリ側からフレームレートを落とすなどの調整である程度ファンレスも実用可能なレベルです。
また、長時間利用していると完全に外れた値になる場合もあったりと、若干エラーハンドリングを考慮して作る必要がありそうです。
ケース
Kickstarterでバックした場合は、ケースがおまけで付属していました。実際に設置して利用する際に結構必要になる場合も多いので地味に助かります。素材はABSで出来ており、かなり丈夫に出来ています。
ファンのネジ間サイズは 30mm x 30 mm です。サイズ的に小さいので、選択肢は少ないですがそれほど強力なものでなくても何日か稼働させてみた感触からOKそうな感じがしています。
ファンの外形サイズで40mm x 40mmのファンを利用することができますが、若干タイトめなので、ケースに入らないものもあるかもしれません。
カメラでよく利用されているネジ穴がありますので、固定に便利ですが、ケーブル以外にファンやこのカメラに電源供給の必要があるのでどのように運用するか事前よく考えておく必要がありそうです。
その他ちょっと面倒だった事
Pythonのサンプルも入っていたため、実行してみたところ私の環境では残念ながらエラーとなってしまいました。pipでインストールされるバージョンでは私の環境では動かなかったので、OpenCVを手動でビルドとインストールを実行しました。
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