附录 A5 - LiDAR 测距与波形¶
一块高架水平板和一块倾斜板放在平坦地表上。先用无发散光束检查交点、遮挡、回波能量和传播时延,再让有限光斑扫过高架板边缘,比较板面与地面的双回波及采样稳定性。随后用带狭缝的上下两层板,进一步检查三维遮挡、倾斜观测和三回波。
场景与观测¶
拖动可旋转,选择光束类型和后端可查看对应点云,也可单独打开三维预览。蓝圈是中心光线的直接交点,橙点是从波形提取的点,黑色十字为解析交点。
场景为 10 m × 10 m,采用开放边界,无大气衰减。地表位于 Z = 0,水平板位于 Z = 4 m,范围为 X = 5–9 m、Y = 1–4 m;倾斜板位于 X = 1–4 m、Y = 6–9 m,满足 Z = 0.5 + 0.5X。所有表面均不透明,采用 Lambertian 反射,反射率分别为 0.25、0.6、0.4。太阳辐照度为零。
| 参数 | 设置 |
|---|---|
| 激光波长 | 1064 nm |
| 单脉冲能量 | 1 J |
| 接收孔径面积 | 0.1 m² |
| 发射脉冲 | 高斯形,半高全宽 1 ns |
| 距离窗口 | 0–14 m |
| 距离单元宽度 | 0.025 m |
| 测站高度 | 10 m |
这些参数用于检验计算关系,不对应某台实际仪器的工作配置。
无发散对照¶
分别垂直观测地面、水平板和斜板,并以偏离天底 30° 的方向观测地面、水平板,以 15° 观测斜板。另设置一个向上发射的脉冲,检查没有命中时的空点云与零波形。全部测站坐标和方向见输入文件。
无发散时,fast_point_cloud 返回中心光线的几何交点;waveform 返回完整波形及从波形中提取的离散回波。后者的距离有分箱量化,两者分别评价。
有限光斑¶
光束垂直向下,半发散角为 50 mrad。高架板面处的光斑半径为
光束中心位于 Y = 2.5 m,X = 5 + qa_s,取 q = −1.25、−0.35、0、0.35、1.25。这些位置覆盖只见地面、两种偏心的部分遮挡、边缘居中和只见板面的情况。
光斑使用截断到单位圆的高斯能量分布,边缘与中心的比值为 0.368。较大的发散角使小场景中的光斑跨边缘现象更清晰。
有限光束的离散回波沿脉冲主轴定位,距离取自波形峰;它代表整个光斑的回波,不能理解为某一条子光线的精确表面交点。
独立参考¶
交点、时延与回波能量¶
对平面 \(\mathbf n\cdot\mathbf x=b\),从位置 o 沿单位方向 d 发射的光线,交点距离为
取板面范围内最近的正距离交点,便可独立判断遮挡。单站往返时延为 \(t=2R/c\)。本例理想接收器的 Lambertian 回波能量为
\(E_0\) 是入射脉冲能量,A 是接收面积,θ 是入射方向与表面法线的夹角。无发散对照具有明确的解析交点、距离和能量。
连续脉冲与距离分箱¶
脉冲半高全宽为 w 时,对应的距离标准差为
位于连续距离 R 的回波,在距离单元 \([e_b,e_{b+1}]\) 内的能量为
其中 Φ 为标准正态分布函数。参考直接积分连续脉冲,再与模拟的每个距离单元比较。
连续光斑与板边缘¶
有限光斑参考不使用 LESS 的束内格点。记归一化半径为 r,k = −ln(0.368),径向能量密度为
半径 r 上落在高架板一侧的角度比例为
对距离差 \(h_j\) 的水平表面,有 \(R_j(r)=h_j\sqrt{1+r^2\tan^2\alpha}\)。将这些比例、Lambertian 回波能量和高斯距离单元积分相乘,再对 r 积分,即得完整参考波形。
角度比例是解析值,剩余径向积分分别用 256 和 512 阶 Gauss–Legendre 积分计算;参考自身的加密变化也单独检查。因此,无发散部分为解析对照,有限光斑部分为独立的半解析积分对照。
模拟结果¶
波形纵轴为每个距离单元的接收能量。板边缘的两个峰分别来自高架板和地面;右下图比较板面回波占总接收能量的比例。
无发散使用 beam_samples = 1、7、31 检查采样不变性。有限光斑按 15、31、63、127、255、511、1023、2047 加密,最终采用 2047。这是每维采样参数,一束光的有效圆形格点约为 330 万个。板边缘与束内格点的相对位置会使局部误差非单调,因此同时检查独立参考误差和最后两档的变化。
波形相对误差定义为 \(\sum_b|W_b-W_b^{ref}|/\sum_bW_b^{ref}\)。脉冲宽度按分箱后波形的二阶矩计算,并与同样分箱的参考比较。
| 指标 | 阈值 |
|---|---|
| 直接交点的位置误差 | ≤ 0.00003 m |
| 直接回波的时延误差 | ≤ 0.0002 ns |
| 无发散回波能量相对误差 | ≤ 0.005% |
| 无发散波形相对误差 | ≤ 0.005% |
| 有限光斑波形、各表面回波能量相对误差 | ≤ 0.5% |
| 分箱后脉冲宽度偏差 | ≤ 0.005 ns |
| 最后两档束内采样的波形变化 | ≤ 0.3% |
| 有限光斑离散回波的距离偏差 | ≤ 0.025 m |
| 独立参考径向积分的加密变化 | ≤ 0.001% |
| 后端 | 交点误差 / m | 无发散波形误差 | 有限光斑波形误差 | 各表面能量误差 | 最后预算变化 | 结论 |
|---|---|---|---|---|---|---|
| optix | 3.42e-07 | 0.00105% | 0.0480% | 0.0605% | 0.0335% | 通过 |
| vulkan | 3.42e-07 | 0.00032% | 0.0480% | 0.0605% | 0.0335% | 通过 |
| embree | 1.76e-07 | 0.00034% | 0.0480% | 0.0605% | 0.0335% | 通过 |
三个后端均通过。最大直接回波时延误差为 4.56e-06 ns,最大分箱脉冲宽度偏差为 0.00000113 ns。参考积分的最大加密变化为 6.63e-09。部分遮挡的三个位置均提取到两个回波,完全落在单一表面的两个位置均为一个回波。
三维遮挡与多回波¶
再用带狭缝的上层板、下层半幅板和地面,检查同一束光中不同路径的遮挡关系。上层板位于 Z = 6 m,范围为 X = 2–8 m、Y = 4–6 m,中间留出 X = 4.9–5.1 m 的狭缝;下层板位于 Z = 3 m,范围为 X = 5–8 m、Y = 4–6 m。地面仍为 Z = 0,三者反射率分别为 0.6、0.4、0.25。可在上方三维预览中选择“Occlusion”查看这一组场景,其余激光与接收参数保持不变。
无发散光束分别照向完整上层板、狭缝下的半幅板、狭缝下的地面,并从两侧以偏离天底 20° 的方向穿过狭缝。最近的有效平面交点给出精确的表面、位置、距离、能量和时延。
有限光束半发散角仍为 50 mrad,包含以下五个观测位置:
| 位置 | 观测方式 | 预期回波 |
|---|---|---|
| 狭缝居中 | 从 (5, 5, 10) 垂直向下 | 上层板、下层板、地面,共 3 个 |
| 狭缝边缘 | 从 (4.9, 5, 10) 垂直向下 | 上层板、下层板、地面,共 3 个 |
| 向东倾斜 | 偏离天底 20°,主轴穿过上层狭缝中心 | 上层板、下层板,共 2 个 |
| 向西倾斜 | 偏离天底 20°,主轴穿过上层狭缝中心 | 上层板、地面,共 2 个 |
| 完全遮挡 | 从 (4.4, 5, 10) 垂直向下 | 仅上层板,1 个 |
每条子光线只取最近的不透明表面交点。同一有限光束的不同部分照到不同高度,便形成多个回波。无发散光束穿过狭缝时只产生一个回波。
独立波形参考¶
将连续光斑写成极坐标,按上层狭缝边缘和下层板边缘精确划分角度区间。在各区间内计算最近的平面交点、入射余弦和往返距离,再积分前述 Lambertian 能量与高斯脉冲的距离单元能量。参考采用极坐标积分,模拟采用束内格点;两者分别加密。64 阶与 128 阶径向积分、配套角度积分之间的变化也纳入参考精度检查。
前三幅图分别展示三回波、向东倾斜和向西倾斜的结果,黑线为连续光斑参考。右下图展示五个位置的最大波形误差。无发散仍使用 1、7、31 检查采样不变性;有限光束使用 511、1023、1535、2047,最终采用 2047。除原有波形、能量、距离、脉冲宽度和末档变化阈值外,还要求回波数量及编号正确,峰间距误差不超过 0.05 m;被完全遮挡表面的回波能量占比不超过 \(10^{-8}\)。
| 后端 | 波形最大误差 | 各表面能量最大误差 | 最后预算变化 | 回波数量与遮挡 |
|---|---|---|---|---|
| optix | 0.0996% | 0.1134% | 0.0729% | 通过 |
| vulkan | 0.0996% | 0.1134% | 0.0729% | 通过 |
| embree | 0.0996% | 0.1134% | 0.0729% | 通过 |
新增的 30 组三后端结果全部通过。完全遮挡的下层回波能量为零;狭缝与倾斜方向的回波数量、编号和顺序均符合参考。
下载与复现¶
将脚本与 data/lidar/ 保持相同的相对路径。独立参考需要 SciPy,绘图另需 Matplotlib:
python scripts/appendix_lidar.py --output build/tutorial-lidar
python scripts/appendix_lidar.py --plot-only build/tutorial-lidar/results.json --output build/tutorial-lidar
若已下载结果数据,只重算新增遮挡部分可加 --occlusion-only。