R
Member
点云配准是 SLAM 和三维重建里最容易"看着收敛了、实际错了"的环节。最近在做多站激光点云拼接,ICP 配准误差从 5cm 压到 5mm 的过程里,踩了几个值得分享的坑。
一、初始位姿比算法本身更重要。ICP 是局部优化,初始位姿差得远,再好的变种也救不回来。我的做法是先用 FPFH 做粗配准,把初始误差压到 10cm 以内再进 ICP;没有粗配准兜底,ICP 经常收敛到一个"看着像"但错 20cm 的局部最优。判断收敛是不是真的,看配准后的点云重叠区残差分布,别只看均值——均值好看但尾部拖出几十厘米的,基本就是错配。
二、下采样不是越密越好。原始点云 10 万点直接跑 ICP 又慢又容易受噪声干扰;体素下采样到 2cm,速度快 10 倍,精度损失却不到 1mm。但下采样过头也有问题:2cm 体素在薄壁结构上会把两侧点云混成一层,配准反而变差。我的经验是先按 2~3cm 下采样做粗配准,再用原始点云(或 5mm 体素)做精配准,分两阶段走。
三、点到面比点到点稳。点到点 ICP 对初始位姿敏感、收敛慢;点到面利用法向量信息,收敛速度和精度都明显更好,前提是法向量估得准。法向量估计的邻域半径要和下采样体素匹配:体素 2cm 时邻域半径取 5~8cm 比较合适,太小噪声大,太大把曲面抹平。
四、别忽略点云的动态物体。拼接时如果场景里有人走过,动态点会拉偏配准。我的做法是配准前先做一轮动态点剔除(体素内点数突变或距离跳变的点先去掉),再跑 ICP。简单,但效果比调 ICP 参数明显得多。
五、收敛判据要看残差直方图。只看均方误差容易被少数离群点带偏。我的做法是看残差的中位数和 90 分位:中位数 2mm、90 分位 8mm 以内,才算配准可用;90 分位拖到 3cm 以上,基本是某个局部区域错配了,要回去查初始位姿或动态点。
最后问大家一个问题:你们在做多站点云拼接的时候,是先做全局闭环优化再做局部 ICP,还是逐站 ICP 串起来?哪种方式在你们的场景里累计误差更小?
一、初始位姿比算法本身更重要。ICP 是局部优化,初始位姿差得远,再好的变种也救不回来。我的做法是先用 FPFH 做粗配准,把初始误差压到 10cm 以内再进 ICP;没有粗配准兜底,ICP 经常收敛到一个"看着像"但错 20cm 的局部最优。判断收敛是不是真的,看配准后的点云重叠区残差分布,别只看均值——均值好看但尾部拖出几十厘米的,基本就是错配。
二、下采样不是越密越好。原始点云 10 万点直接跑 ICP 又慢又容易受噪声干扰;体素下采样到 2cm,速度快 10 倍,精度损失却不到 1mm。但下采样过头也有问题:2cm 体素在薄壁结构上会把两侧点云混成一层,配准反而变差。我的经验是先按 2~3cm 下采样做粗配准,再用原始点云(或 5mm 体素)做精配准,分两阶段走。
三、点到面比点到点稳。点到点 ICP 对初始位姿敏感、收敛慢;点到面利用法向量信息,收敛速度和精度都明显更好,前提是法向量估得准。法向量估计的邻域半径要和下采样体素匹配:体素 2cm 时邻域半径取 5~8cm 比较合适,太小噪声大,太大把曲面抹平。
四、别忽略点云的动态物体。拼接时如果场景里有人走过,动态点会拉偏配准。我的做法是配准前先做一轮动态点剔除(体素内点数突变或距离跳变的点先去掉),再跑 ICP。简单,但效果比调 ICP 参数明显得多。
五、收敛判据要看残差直方图。只看均方误差容易被少数离群点带偏。我的做法是看残差的中位数和 90 分位:中位数 2mm、90 分位 8mm 以内,才算配准可用;90 分位拖到 3cm 以上,基本是某个局部区域错配了,要回去查初始位姿或动态点。
最后问大家一个问题:你们在做多站点云拼接的时候,是先做全局闭环优化再做局部 ICP,还是逐站 ICP 串起来?哪种方式在你们的场景里累计误差更小?