ICP 为啥会陷入到局部?为何point to Plane 比point to Point 收敛更快?

一、ICP 的优化目标

目标函数

ICP 的目标是求一个刚体变换: R,t

使得两组点云误差最小:

其中:

  • pi​ ------ source 点

  • qi​ ------ target 最近点

ICP流程:

1 找最近点

2 求最优 R,t

3 变换点云

4 迭代

这实际上是一个 非凸优化问题

这里就首先要说一下什么是非凸 问题

什么是凸函数

例子:

f(x)=x^2

图像:

cpp 复制代码
      *
    *   *
  *       *
 *         *

性质:

  • 只有 一个全局最小值

  • 不会有局部最小值

所以优化很简单。

非凸函数是什么

只要不是凸函数,就是非凸函数。

图像特点:

  • 有多个山谷

  • 有多个局部最小值

例如:

常见的非凸函数的例子

非凸函数

特点:

  • 无限多个极值

  • 无限局部最优

Rosenbrock函数(优化经典测试函数)

非凸优化方法

多初值优化

最常见工程方法。

步骤:

随机初始化多个点

分别优化

选择最小结果

随机梯度

二、为什么会出现局部最优

数学原理

理解

cpp 复制代码
假设有两条直线点云:

源点云:

* * * * * * *

目标点云:

      * * * * * * *

真实位姿应该是 平移右移。

如果初始位姿错误:
* * * * * * *
      * * * * * * *

ICP 最近邻匹配可能变成:

* -> 最近 *

但对应点 错位:

p1 → q2
p2 → q3
p3 → q4

ICP 会认为:

当前已经很接近最优

于是停止。

三、解决方法

工程中常见方法:

1 好的初始值

来自:

  • 里程计

  • IMU

  • GPS


2 RANSAC 初始匹配

使用

Random Sample Consensus

先求粗配准。


3 特征匹配

例如:

  • FPFH

  • SHOT

先做 feature matching。


4 使用 Point-to-Plane ICP

优化:

5 多分辨率 ICP

粗点云 → 细点云

逐层优化。

四、为何point to Plane 比point to Point 收敛更快

Point-to-Plane 收敛更快、稳定性更好,但并不能彻底解决局部最优问题,只是降低了发生概率。

Point-to-Plane ICP(点到平面)

几何意义

只计算 点到平面的距离

cpp 复制代码
         n
         ↑
         |
p_i  →  平面
---------

误差是:

沿法向方向距离而不是点到点距离。

为什么 Point-to-Plane 收敛更快

几何解释

方法 收敛速度 稳定性 局部最优
Point-to-Point 一般 容易
Point-to-Plane 更稳定 仍存在

核心原因:

① 误差函数更接近真实几何约束

真实目标是:

点应该落在目标表面上

而不是:

点必须匹配到某个具体点。

Point-to-Plane 正好表达:

distance to surfacedistance\ to\ surfacedistance to surface

因此误差模型更合理。

② 优化函数更接近线性

③ 沿切线方向允许滑动

cpp 复制代码
这是最重要的一点。

假设两个平面:

源点云
************

目标点云
----------------

Point-to-Point:

必须匹配到最近点

Point-to-Plane:

允许沿平面滑动

  
复制代码
因为误差只看法向:   切向误差 几乎为0,所以优化空间更平滑

数学解释

为什么仍然会有局部最优

cpp 复制代码
Point-to-Plane 仍然依赖:

最近邻匹配

如果最近邻错误:

p_i → 错误平面

优化仍会收敛到错误位置。

例如:

重复柱子
| | | | |

匹配错柱子:

柱1 → 柱2

误差仍然很小。

因此:

Point-to-Plane 不能解决局部最优,只是缓解。
相关推荐
王老师青少年编程20 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【部分背包问题】:部分背包问题
c++·算法·贪心·csp·信奥赛·部分背包问题
九思十安21 小时前
HNU2026-算法设计与分析-笔记 3 摊还分析
笔记·算法
嘻嘻哈哈樱桃21 小时前
牛客经典101题题解集--哈希
java·数据结构·python·算法·leetcode·职场和发展·哈希算法
自我意识的多元宇宙21 小时前
【数据结构】 红黑树
数据结构·算法
wayz1121 小时前
Day 15 编程实战:KMeans聚类与股票风格分类
算法·机器学习·分类·kmeans·聚类
不知名的老吴21 小时前
数据结构与算法之排序算法
算法·排序算法
Brilliantwxx21 小时前
【算法题】日期类算法题
开发语言·c++·笔记·程序人生·算法
穿条秋裤到处跑21 小时前
每日一道leetcode(2026.04.27):检查网格中是否存在有效路径
算法·leetcode·职场和发展
我不是懒洋洋21 小时前
【数据结构】二叉树链式结构的实现(二叉树的遍历、使用二叉树的基本方法、二叉树的创建和销毁)
c语言·数据结构·c++·经验分享·算法·链表·visual studio
水木流年追梦21 小时前
CodeTop Top 300 热门题目8-字符串解码
linux·运维·服务器·前端·算法·leetcode