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 版。
选型时首先要看的不是绝对精度,而是精度如何随距离缩放。 这里弄错的话,就会选中目录数字看起来漂亮的型号,然后在现场失手。
| 原理 | 代表 | 测距误差对距离的依赖 | 起作用的设计值 |
| --- | --- | --- | --- |
| 被动立体视觉 | 普通的立体相机 | σ_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 像素的水平上起作用”,在没有纹理的表面上并不能直接成立。看到 % 表述就做这个换算。
σ_Z = c·σ_t / 2 c = 光速, σ_t = 时间分辨率
式中不含距离 —— 这就是 LiDAR 在 100 m 处也能保持 cm 级的原因。但回波光量按 1/Z² 衰减,所以在远处下降的不是精度,而是检测概率。目录写成“170 m @ 80% 反射率”“90 m @ 10% 反射率”这样附带反射率,原因就在于此。没有注明反射率的探测距离不能用于比较。
不放入推测值。以下全部来自厂商公开的规格(出处在文末)。
| 项目 | 值 |
| --- | --- |
| 方式 | 立体视觉(配合 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 无效。这是右成像器拍不到的区域,从原理上无法填补。制作合成深度图像时,一定要加入这条带(不加的话,学习一侧会变成信任画面边缘的模型)。
| 项目 | 值 |
| --- | --- |
| 成像 | 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 % 劣化 —— 在柜内会升温的设备上,直接使用常温规格会对不上。
| 项目 | 值 |
| --- | --- |
| 基准距离 | 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)和校准。
| 项目 | 值 |
| --- | --- |
| 波长 / 等级 | 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)。假设通道号对应等间隔的仰角来生成距离图像,会产生系统性畸变。
| 项目 | 值 |
| --- | --- |
| 波长 | 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°)在实际中也有影响 —— 看不到脚下。
在深度上叠加均匀的高斯噪声,是这个领域最常见的谎言。实际设备的出错方式由各原理决定,各有其形态。
| 原理 | 出现的故障模式 |
| --- | --- |
| 被动立体视觉 | 无纹理表面上出现空洞/重复图案上视差跳变(误匹配表现为平滑的错误,因此难以察觉)/遮挡边界处只有一侧缺测 |
| 主动立体视觉 | 在上述基础上,投影仪照不到的远处退化为被动方式/在日光下图案被淹没(到户外性能骤降) |
| 结构光 | 镜面上飞点(无回波)/凹处的相互反射破坏相位,使表面鼓起/透明、半透明物体因次表面散射而向里偏移 |
| dToF | 多径使内角变圆/边缘出现 flying pixel(1 个像素中混入 2 个距离,出现中间值)/回射体上的距离游走/雨、雾、粉尘造成伪点 |
| iToF | 多径更强/相位折叠使远处变成近距离(超出由调制频率决定的无模糊距离时) |
| 激光三角测量 | 遮挡有 2 种(投光侧的阴影、受光侧的阴影)/镜面无回波/台阶边缘处坐标被拖拽 |
共通点:反射率、强度通道依赖于距离和入射角(1/Z²、cos θ)。把原始强度直接用作特征量,就会进行依赖距离的学习。要么归一化,要么显式地给出距离。
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)。逐点附带时间戳的传感器,其点云是以利用时间戳进行校正为前提的。
按 用途 → 距离 → 要求精度 → 原理 的顺序决定。倒过来(从型号入手)就会失手。
| 用途 | 距离 | 要求精度 | 原理 |
| --- | --- | --- | --- |
| 在线形状、台阶检测 | 几十 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)。二者不可兼得。
| 传入的值 | 来源 | 使用的 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) |
• 没有传感器误差模型的 op。 2-D 一侧有 optscene,可以组合镜头、照明、传感器,输出带真值的缺陷图像。3-D 一侧与之对应的 —— 在深度上叠加 依赖 Z² 的噪声/生成无效深度带/长出 flying pixel/ 用多径把内角变圆 —— 连 1 个都没有。若要把合成 3-D 数据用于学习,首先需要的就是这里。
• 没有处理光束角非等间隔的入口(lidar_projection 以等间隔为前提)。
• 没有带时间戳点云(倾斜畸变校正)的词汇。
• 没有再现 iToF 相位折叠的手段。
在现场首先打开的就是这里。症状只要追溯到原理,就一定能得到解释。
| 症状 | 首先怀疑 | 确认方法 |
| --- | --- | --- |
| 只有远处精度不够 | 把三角测量用于远距离(σ_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/>