二维点云ICP原理推导
描述
ICP是迭代就近点算法,大部分的实现代码都是基于PCL点云库的,也就是三维点云的匹配
实际上,二维点云数据也算是常见的数据类型,比如移动机器人经常使用的单线雷达。本文就是二维点云ICP的原理推导
算法原理
二维点云数据说明
现在假设我们有两帧点云A与B,我们把 A 称为标准点云,把 B 称为源点云。我们的需求是把点云 B 经过矩阵变换到点云 A,需要注意的是点云 A 和点云 B 是在同一坐标系下。
矩阵变换计算
在同一坐标系下,将某一片点云变换到另外一片点云,需要矩阵变换的知识。
假设我们需要点云在x方向平移Δx, y方向平移Δy, 点云整体旋转θ弧度
ICP算法核心
ICP算法很简单,简单来说就是对b点云不停进行矩阵变换,把它变换到和a很接近就停止。专业的说,分为如下几步
点云归一化
找到两片点云中的对应点对
根据对应点对的信息,计算得到这次的变换矩阵
变换点云
计算当前的损失
是否决定继续迭代。如果损失小于设定阈值或者达到最大迭代数停止,否则返回执行第1步
1. 点云归一
点云归一化只是我的一个说法,实际并不完全等同传统的归一化操作。
这里做的操作是,取点云的中心(或者有权重时可以取重心,或者其他合理的点也是可以的)
接下来的一部分操作是要使用归一化后的点集 a aa 和 b bb,有一部分是要使用原来的点云 A AA 和 B BB 的,请注意区分
2. 确定对应点对
确定对应点对这是一个比较有意思的话题。什么是对应点对?
正确的理解就是,点云A和点云B的这两个点,可能原来就是一个点。但实际上,当A和B还没有经过ICP时,往往这个关系是模糊的,没有人能够说出哪两个点是对应的。那该怎么办呢?好啦,ICP的核心来啦。
ICP算法的对应点对,计算欧式距离最近的被认为是对应点对,也就是ICP的C,closet
具体实施上可以这样做,经过归一化后的点集 a 和 b 中,a i 的对应点 b j 是
在PCL库的ICP算法过程中,有一个很重要的步骤就是对应关系去除。原因是数据是有噪声的,因此要去除对配准有影响的错误点对。
二维点云的数据量是小的,那么请你结合自己的需求来完成去噪这一步。这一步是必要的。
3. 变换矩阵计算
先明确到了这一步我们拥有的数据和要得到的东西。我们有的是很多对应的点对,我们要求的是一个变换矩阵,使用这个矩阵完成变换后,这些对应的点对的距离和是最小的(意思就是说,这个矩阵至少是当前最优的,使用这个矩阵相比于其他任何变换矩阵,能让牛郎们和织女们的距离和最小)。那么我们就来进行公式推导吧。(数学老师说的没错,数学真的很重要)
误差函数值E ( R , t ) 越大,总的距离和越小。
在这里我好好推一下公式,说明一下这是怎么得到的吧
距离和函数为D ( R , t ) D(R,t)D(R,t)其实就是对所有的对应点对距离来求和。直接写成矩阵形式会更好理解
这步推导我真的不写详细在这里,因为已经真的很简单了,推到下一步如下
旋转弧度θ θθ的计算如下
旋转矩阵 R RR 因此也能得到
平移向量t tt的计算方式如下
解释一下也很简单,本来是可以A中心减B中心的,但是刚才已经证明了经过旋转矩阵 R RR 会令点对距离和更小,因此B的中心点位置也就同时经历矩阵 R RR 的变换
4. 变换点云
第三步我们已经求出了旋转矩阵 R RR 和平移向量 t tt,接下来就是将原点云进行矩阵变换了。注意,是原来的点云 A 和点云 B ,而不是归一化后的点云 a 和点云 b。为什么?你的操作对象一直是点云 A 和点云 B ,归一化后的 a 和 b 只是你需要的中间变量而已对源点云 B 做变换,得到新的点云 B ′
′
5. 计算损失
将最新变换出的矩阵 B ′ ,与你的目标点云 A 进行计算。可以自行设计属于自己的损失函数,来表示两片点云究竟匹配的怎么样。
我在这里设计的损失函数仍然是对应点对(最近点)的距离之和
6. 是否继续迭代
接下来就要看这个计算出的 L o s s 值能否满足你的要求了。
迭代终止条件的设计其实比较自由。但我的经验告诉我,比较常见的是以下几种
L o s s < L o s s m i n : 当前迭代得到的损失值小于了设定的最小阈值了
i t e r a t i o n < i t e r a t i o n m a x : 迭代次数超过了最大迭代次数
Δ L o s s <Δ L o s s m i n : 损失值的变化小于了设定的最小变化值
分别代表的意义也是明显的:1)当前已经匹配的很好了,别迭代了;2) 已经匹配了好多次了,饭都凉了;3)这一次都没提升多少,你还继续匹配干嘛
结束语
这篇文章我真的写了好久了,公式都是我生推的,分析都是生写的,给个赞吧哈哈,谢谢