fullseye

深度センサの知識 — 測距原理・実機の値・欠測の出方

3-D 族の op は 347 個あるが、その入力になる点群がどこから来たのかはどこにも書いて いなかった。この文書は op の説明ではない —— lidar_projection / range_image / structured_light / plane_sweep_stereo / two_view / depth_denoise / tsdf_fusion に渡す値の出どころと、実機がどう壊れるかを書く教材である。 2-D 側の optics/guides/mv_*.md(センサ・カメラ・フレームグラバ・ケーブル・規格)と 同じ位置づけで、こちらが 3-D 版にあたる。


1. 測距原理は 5 つしかない —— そして誤差の効き方が全部違う

選定で最初に見るのは絶対値の確度ではなく、確度が距離とどうスケールするかである。 ここを間違えると、カタログの数字が良く見える機種を選んで現場で外す。

原理 代表 測距誤差の距離依存 効く設計値
受動ステレオ 一般のステレオカメラ σ_Z ∝ Z² 基線 B、焦点距離 f、視差のサブピクセル精度
能動ステレオ RealSense D4xx 同上(テクスチャを投影で足すだけ) 上に加えプロジェクタの届く距離
構造化光(位相シフト / グレイコード) Zivid, Photoneo 同上だが B を大きく取れるので係数が小さい 投影パターンの周期、階調、露光
レーザ三角測量(ラインプロファイラ) Keyence LJ-X 同上。測定レンジを数 mm に切って µm を出す 基準距離、受光角、X ピッチ
直接 ToF(dToF) Ouster, Livox 距離にほぼ依存しない(時間分解能で決まる) パルス幅、時間分解能、戻り光量
(間接 ToF / iToF) 一部の ToF カメラ 位相分解能で決まる。折り返しがある 変調周波数(= 一意距離)

三角測量の式(全部これで説明がつく)

Z = B·f / d          B = 基線 [mm], f = 焦点距離 [px], d = 視差 [px]
δZ = Z² / (B·f) · δd

距離の二乗で悪化する。だから受動 / 能動ステレオは遠距離に使えないし、 構造化光が µm 級を出せるのは B·f を大きく取り Z を小さく固定しているからである。

カタログの %表記を視差誤差に読み替える: D455 は基線 95 mm、1280×720・HFOV 87° なので f ≈ (1280/2)/tan(43.5°) ≈ 674 px(概算 —— 厳密には左イメージャの HFOV を使う。 公表されている「深度 FOV」は無効帯のぶんだけ狭いので、この f はやや小さめに出る)。 公称「4 m で 2% 未満」は

δd = δZ·B·f / Z² = 80 × 95 × 674 / 4000² ≈ 0.32 px

に相当する。つまりこの数字は「サブピクセルマッチングが 1/3 画素で効いている」という 主張であって、テクスチャの無い面ではそのまま成り立たない。 %表記を見たらこの換算をする。

dToF の式

σ_Z = c·σ_t / 2      c = 光速, σ_t = 時間分解能

距離が入らない —— これが LiDAR が 100 m でも cm を保てる理由。 ただし戻り光量は 1/Z² で落ちるので、遠方では確度ではなく検出確率が落ちる。 カタログが「170 m @ 80% 反射率」「90 m @ 10% 反射率」と反射率つきで書くのはこのため。 反射率を書いていない到達距離は比較に使えない。


2. 実機の値(一次情報のみ)

推測値は入れない。以下はすべてメーカー公開仕様(出典は末尾)。

2.1 能動ステレオ — Intel RealSense D455

項目
方式 ステレオ(IR プロジェクタ併用)
基線 95 mm(D435 系は 50 mm、D415 は 55 mm、D405 は 18 mm)
深度 FOV(16:9) H 87° / V 58° / D 95°
深度出力 1280×720 まで、最大 90 fps
推奨レンジ 0.6 – 6 m
Min-Z(1280×720) 520 mm(848×480 で 350、424×240 で 180)

Min-Z が解像度で変わるのが要点。低解像度にすると近づける —— 視差の上限が画素数で 決まるためで、「近すぎて測れない」は解像度を落とせば回避できることがある。

無効深度帯(Intel が式で公開している構造的欠測):

無効帯の幅 [px] = B·f / Z

D455 で Z = 1 m なら 95 × 674 / 1000 ≈ 64 px が左端で必ず無効になる。 右のイメージャに写らない領域だから原理的に埋まらない。合成深度画像を作るなら、 この帯は必ず入れる(入れないと、学習側が画面端を信用するモデルになる)。

2.2 構造化光(産業用) — Zivid 2+ M130

項目
撮像 2448×2048(5.0 MPx)、ネイティブ 3D カラー
焦点距離 1300 mm / 作動範囲 800 – 2700 mm / 最適 1000 – 1600 mm
視野 790 × 650 mm @ 1300 mm
点精度 1σ 210 µm @ 焦点距離
局所平面性精度 1σ 300 µm
全体平面性 真度誤差 < 0.24 mm
寸法真度誤差 < 0.35 %(焦点距離・常温)/< 0.60 %(最適範囲・全温度)
撮像時間 50 ms – 1500 ms(処理込み)
光源 プロジェクタ 360 lm(1×)〜 900 lm(2.5×)、IEC 62471-5 RG2

精度(precision)と真度(trueness)を分けて載せているのがこのメーカーの美点で、 そこが読みどころ。点精度 210 µm は「連続撮像でどれだけばらつかないか」、 寸法真度 0.35 % は「校正長を測ったときにどれだけずれるか」。 測定用途で効くのは後者。 前者しか書かないカタログは、平均すれば良くなる数字だけを 見せている。さらに真度は温度で 0.35 % → 0.60 % に倒れると明記されている —— 盤内で暖まる装置では、常温スペックをそのまま使うと合わない。

2.3 レーザ三角測量(ラインプロファイラ) — Keyence LJ-X8060

項目
基準距離 64 mm
Z 測定範囲 ±7.3 mm(F.S. 14.6 mm)
X 測定範囲 15 mm(近側)/16 mm(基準距離)
光源 405 nm 可視、クラス 2M
プロファイルデータ間隔(X ピッチ) 5 µm
Z 繰り返し精度 0.4 µm
X 繰り返し精度 0.5 µm
1 プロファイルの点数 3200 点

µm を出すために測定レンジを ±7.3 mm に切っているのが本質。三角測量の δZ ∝ Z² は 変わらないので、レンジを狭めるほかに手が無い。 そしてここに載っているのは繰り返し精度であって直線性ではない —— 「0.4 µm で測れる」 と読むのは誤り。絶対寸法を主張するなら直線性(linearity)と校正が別途要る。

2.4 回転式 LiDAR — Ouster OS1(Rev7)

項目
波長 / クラス 865 nm / Class 1(IEC 60825-1:2014)
到達距離 170 m @ 80% ランバート/90 m @ 10% ランバート(1024@10 Hz、検出確率 > 90%、100 klx 日照)
最小距離 0.0 m(既定 0.5 m、0.3 m 選択可)
垂直 FOV 42.4° ±1.0°(+21.2° 〜 −21.2°)
解像度 垂直 32 / 64 / 128 ch、水平 512 / 1024 / 2048、回転 10 / 20 Hz
測距確度 ±2.5 cm(ランバート)/±5 cm(再帰反射)
測距精度 1σ ±0.5 cm(最小)〜 ±3 cm(最大)
距離分解能 0.1 cm
点数 最大 5,242,880 点/秒(128 ch)
ビーム 出射径 9.5 mm、発散 0.18°(FWHM)
1 点あたりのデータ 距離・信号強度・反射率・近赤外・チャンネル・方位角・タイムスタンプ
誤検出率 1/10,000

再帰反射ターゲットのほうが確度が悪い(±5 cm)のが重要。直感に反するが、戻り光が 強すぎて受光波形が飽和し、立ち上がり時刻がずれる(レンジウォーク)。 反射テープや標識を基準に据えた合成データは、この誤差を入れないと現実と合わない。

また ビーム角は等間隔ではない(センサが intrinsic として beam angles を返す仕様)。 チャンネル番号を等間隔の仰角と仮定してレンジ画像にすると、系統的に歪む。

2.5 非反復走査 LiDAR — Livox Mid-360

項目
波長 905 nm
到達距離 70 m @ 80% 反射率/40 m @ 10% 反射率(周囲 25 °C)
最小距離 0.1 m
FOV 水平 360°/垂直 −7° 〜 +52°
点数 200,000 点/秒(ファーストリターン)
測距精度 1σ ≤ 2 cm @ 10 m、≤ 3 cm @ 0.2 m
角度精度 1σ < 0.15°
内蔵 IMU ICM40609

走査が非反復なので、1 フレームだけ見ると穴だらけで、積算するほど密になる。 「1 スキャンで完成した点群が得られる」前提のアルゴリズムはここで崩れる。 垂直 FOV が上下非対称(−7° 〜 +52°)なのも実務では効く —— 足元は見えない。


3. 欠測と誤りの出方(合成データの肝)

深度に一様なガウス雑音を載せるのは、この分野で最もよくある嘘である。 実機の壊れ方は原理ごとに決まっていて、それぞれ形を持つ。

原理 出る故障モード
受動ステレオ テクスチャの無い面で/繰り返し模様で視差が飛ぶ(誤マッチは滑らかな誤りになるので気づきにくい)/オクルージョン境界で片側だけ欠測
能動ステレオ 上に加え、プロジェクタが届かない遠方で受動に劣化/日光下でパターンが埋もれる(屋外で急に性能が落ちる)
構造化光 鏡面で飛ぶ(戻らない)/凹部の相互反射で位相が壊れ面が膨らむ/透明・半透明で表面下散乱により奥にずれる
dToF マルチパスで入隅が丸まる/エッジで flying pixel(1 画素に 2 距離が混ざり中間値が出る)/再帰反射でレンジウォーク/雨・霧・粉塵で偽点
iToF マルチパスがさらに強い/位相の折り返しで遠方が近距離に化ける(変調周波数で決まる一意距離を超えたとき)
レーザ三角測量 オクルージョンが2 種類(投光側の影・受光側の影)/鏡面で戻らない/段差の縁で座標が引きずられる

共通: 反射率・強度チャンネルは距離と入射角に依存する(1/Z²、cos θ)。生の強度を そのまま特徴量に使うと、距離に依存した学習をしてしまう。正規化するか、距離を明示的に 与える。


4. 座標系と単位の罠

  1. 深度は「光軸方向の z」か「斜距離」か。 レンジ画像(LiDAR 由来)は斜距離、 深度カメラは光軸 z が普通。取り違えると中心では一致し視野の端だけ系統的にずれる ので、テストが中心だけ見ていると通ってしまう。fullseye は optscene_depth で 光軸 z を採っている(マシンビジョンの慣習)。
  2. 深度スケール。 RealSense は既定で 1 unit = 1 mm だが機種と設定で変わる。 深度画像を uint16 で受けたら、必ずスケールを一緒に運ぶ。
  3. LiDAR の ring / channel は等間隔でない。 §2.4 のとおり。
  4. 点群の原点。 カメラは前面ガラス基準ではない(RealSense は左イメージャ中心、 Ouster は筐体の基準面)。数 mm 〜 十数 mm の系統オフセットになる。
  5. 時刻。 移動体では 1 フレーム内でも走査中に動く(LiDAR のスキュー)。 タイムスタンプが点ごとに付くセンサは、それを使って補正する前提の点群である。

5. 選定の決め方

用途 → 距離 → 要求確度 → 原理 の順に決まる。逆順(機種から入る)と外す。

用途 距離 要求確度 原理
インライン形状・段差検査 数十 mm µm レーザ三角測量(ラインプロファイラ)
ビンピッキング・組付 0.5 – 2 m 0.1 – 0.5 mm 構造化光
人・什器の大まかな把握 0.5 – 6 m cm 能動ステレオ
移動ロボットの自己位置・障害物 0.5 – 100 m cm LiDAR
屋外広域・地形 10 m 〜 cm LiDAR / フォトグラメトリ

判断の芯は 1 行で言える —— µm が要るなら測定レンジを削る(三角測量)、 遠くが要るなら確度が距離に依存しない方式にする(ToF)。両立はしない。


6. fullseye op への接続

渡す値 出どころ 使う op
垂直 FOV・チャンネル数・角度分解能 §2.4 / §2.5 lidar_projection 系(3 op)、range_image 系(4 op)
基線・焦点距離・Min-Z・無効帯 §2.1 two_view 系(5 op)、plane_sweep_stereo(2 op)
パターン周期・位相段数 §2.2 structured_light 系(7 op)
点精度 1σ・平面性 §2.2 surface_fit / registration_metrics / metrics
flying pixel・エッジ欠測 §3 depth_denoise 系(3 op)
点間隔(ボクセルはこれより粗く) §2.2 の空間分解能 tsdf_fusion(3 op)、occupancy(4 op)
反射率の距離・角度依存 §3 末尾 photometric 系(4 op)

7. 現状の穴(正直に)


8. 診断表 —— 症状から原因へ

現場で最初に開くのはここ。症状は原理まで遡れば必ず説明がつく。

症状 まず疑う 確かめ方
遠くだけ精度が出ない 三角測量を遠距離に使っている(σ_Z ∝ Z²) 距離を変えて σ を測り、Z² に乗るか見る。乗るなら方式の限界で、後処理では直らない
平面が反る/寸法が合わない 真度(trueness)側の問題 —— 校正・温度 校正済み平面板を視野の複数位置で撮り、平面フィット残差を見る。暖機前後(10 分)で比べる
画面の片側だけ穴が空く ステレオの無効深度帯 幅が B·f/Z px に一致するか計算する。一致すれば原理的な欠測で、埋まらない
黒い部品・光る部品だけ落ちる 戻り光量(ToF なら反射率、構造化光なら鏡面反射) 同形状の白い艶消しダミーで撮り直す。直れば材質起因
入隅が丸い/エッジに中間距離の点 ToF のマルチパスと flying pixel エッジ近傍の点だけ抜いて距離ヒストグラムを見る。二峰の谷に点が乗る
反射テープの位置だけずれる レンジウォーク(受光飽和) 露光や強度を下げて再測。ずれが減れば飽和起因
点群が斜めに引きずられる 走査中の移動(スキュー)/点ごとのタイムスタンプ未使用 静止させて撮り直す。直れば動き補正が要る
レンジ画像にすると横縞が出る チャンネル = 等間隔仰角と仮定した センサの beam angles(intrinsic)を問い合わせて投影し直す
中心は合うのに視野の端だけずれる 光軸 z と斜距離の取り違え 端の点で z‖p‖ の比を見る。cos θ 倍になっていれば取り違え
1 フレームが穴だらけ 非反復走査の LiDAR を単フレームで使った 数フレーム積算して密度が上がるか見る

出典(一次情報)