深度传感器知识 —— 测距原理、实机数值、缺测的表现

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 可见光,Class 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)。这与直觉相反,原因是回波光太强,受光波形饱和,上升时刻发生偏移(距离游走,range walk)。以反光胶带或标志为基准的合成数据,不加入这一误差就与现实对不上。

此外,光束角不是等间隔的(规格上传感器以 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 的倾斜畸变,skew)。逐点附带时间戳的传感器,其点云是以利用时间戳进行校正为前提的。


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. 现有的缺口(如实说明)

• 没有传感器误差模型的 op。 2-D 一侧有 optscene,可以组合镜头、照明、传感器,输出带真值的缺陷图像。3-D 一侧与之对应的 —— 在深度上叠加 依赖 Z² 的噪声/生成无效深度带/长出 flying pixel/ 用多径把内角变圆 —— 连 1 个都没有。若要把合成 3-D 数据用于学习,首先需要的就是这里。

• 没有处理光束角非等间隔的入口(lidar_projection 以等间隔为前提)。

• 没有带时间戳点云(倾斜畸变校正)的词汇。

• 没有再现 iToF 相位折叠的手段。


8. 诊断表 —— 从症状到原因

在现场首先打开的就是这里。症状只要追溯到原理,就一定能得到解释。

| 症状 | 首先怀疑 | 确认方法 |

| --- | --- | --- |

| 只有远处精度不够 | 把三角测量用于远距离(σ_Z ∝ Z²) | 改变距离测量 σ,看是否符合 Z²。如果符合,那就是方式的极限,后处理无法修正 |

| 平面翘曲/尺寸对不上 | 正确度(trueness)方面的问题 —— 校准、温度 | 把已校准的平板放在视场的多个位置拍摄,查看平面拟合残差。比较预热前后(10 分钟) |

| 只有画面一侧出现空洞 | 立体视觉的无效深度带 | 计算宽度是否与 B·f/Z px 一致。一致的话就是原理性缺测,无法填补 |

| 只有黑色零件、发光零件缺失 | 回波光量(ToF 是反射率,结构光是镜面反射) | 用同形状的白色哑光假件重拍。如果恢复,就是材质原因 |

| 内角变圆/边缘有中间距离的点 | ToF 的多径与 flying pixel | 只抽取边缘附近的点,查看距离直方图。点落在双峰之间的谷底 |

| 只有反光胶带的位置偏移 | 距离游走(受光饱和) | 降低曝光或强度后重测。偏移减小的话就是饱和原因 |

| 点云被斜向拖拽 | 扫描中的移动(倾斜畸变)/未使用逐点时间戳 | 静止后重拍。如果恢复,就需要运动补偿 |

| 生成距离图像后出现横纹 | 假设了通道 = 等间隔仰角 | 向传感器查询 beam angles(intrinsic)并重新投影 |

| 中心对得上,只有视场边缘偏移 | 光轴 z 与斜距弄混了 | 在边缘点上查看 z 与 ‖p‖ 之比。若为 cos θ 倍,就是弄混了 |

| 1 帧满是空洞 | 以单帧方式使用了非重复扫描的 LiDAR | 累积数帧,看密度是否上升 |


出处(一手资料)

• Livox Mid-360 Specs — <https://www.livoxtech.com/mid-360/specs>

• Ouster OS1 Rev7 Datasheet (FW 3.1.x) — <https://data.ouster.io/downloads/datasheets/datasheet-rev7-v3p1-os1.pdf>

• Zivid 2+ M130 Technical Specification (1.5 – 7/25) — <https://www.zivid.com/hubfs/User%20guides%20and%20datasheets/Zivid%202+%20M130%20Datasheet.pdf>

• Intel RealSense D400 Series Datasheet, Doc. 337029-017 (Oct 2025) — <https://realsenseai.com/wp-content/uploads/2025/09/Intel-RealSense-D400-Series-Datasheet-October-2025.pdf>

• Keyence LJ-X8000 series — LJ-X8060 — <https://www.keyence.com/products/measure/laser-2d/lj-x8000/models/lj-x8060/>