开启智能驾驶新篇章!《智能驾驶行泊车全栈基础算法专题课程》圆满收官,欢迎订阅!
36节精品课程,从零基础到全栈精通,助您快速入门智能驾驶领域!
入门必备:课程设计相对基础,循序渐进,适合初学者轻松上手,是您踏入智能驾驶行业的完美起点。
核心内容:基础概念、基础知识、相机模型、图像基础、感知算法、融合算法、定位算法、建图算法、规划算法、控制算法,一站式掌握智能驾驶行泊车核心算法。
立即行动,加入学习队列! 夯实基础,开启您的智能驾驶未来之路
【导语与总结】开启智能驾驶新篇章!《智能驾驶行泊车全栈基础算法专题课程》圆满收官,欢迎订阅!
【第1话:基础概念】自动驾驶基础概念及行泊车NOA、APA、HPA、AVP等自动驾驶功能扫盲和相关技术栈梳理
【第2话:基础知识】基于Ubuntu的ROS环境搭建与车辆可视化编程实践:初学者指南及RVIZ应用(含作业及代码)
【第3话:基础知识】自动驾驶中的世界坐标系、车辆坐标系、相机坐标系、像素坐标系概念及相互间的转换公式推导
【第4话:相机模型】针孔相机、鱼眼相机模型的介绍及其在自动驾驶中的作用及使用方法
【第5话:相机模型】相机标定在自动驾驶中的作用、相机标定方法详解及代码说明
【第6话:图像基础】图像平移、缩放、旋转、裁剪与坐标矩阵变换关系详细推导及代码举例说明
【第7话:图像基础】自动驾驶IPM图像投影拼接技术详解及代码示例
【第8话:感知算法】深度学习神经网络模型基础知识概念入门简介
【第9话:感知算法】多层感知机MLP模型详细介绍及代码举例
【第10话:感知算法】图像分类:深度学习图像分类网络模型介绍及多个常用模型详解
【第11话:感知算法】目标检测:深度学习目标检测模型介绍入门及常用模型详解
【第12话:感知算法】图像分割:深度学习图像分割模型介绍入门及常用模型详解
【第13话:感知算法】库位与可行驶区域检测:自主泊车场景中的检测及语义分割方法
【第14话:感知算法】库位与可行驶区域检测后处理方法介绍及代码示例说明
【第15话:融合算法】从卡尔曼滤波KF到扩展卡尔曼滤波EKF公式详细推导及代码举例说明
【第16话:融合算法】从贝叶斯滤波到卡尔曼滤波KF公式详细推导及代码举例说明
【第17话:定位建图】车辆状态估计:航迹递推DR公式推导详细介绍及代码实现
【第18话:定位建图】车辆状态估计:IMU、轮速脉冲、GNSS、图像特征EKF融合公式推导及python代码举例
【第19话:定位建图】 KD树(KD-Tree)的建立与最近邻算法(NN)详解
【第20话:定位建图】SLAM 语义地图创建方法及流程详解
【第21话:定位建图】SLAM点云配准之3D-3D ICP(Iterative Closest Point)方法详解
【第22话:定位建图】SLAM视觉里程计——特征点法详解
【第23话:定位建图】SLAM视觉里程计——直接法详解
【第24话:定位建图】SLAM视觉里程计——光流法(直接法)详解
【第25话:定位建图】SLAM后端优化方法详解
【第26话:定位建图】SLAM回环检测方法及原理详细介绍
【第27话:路径规划】自动驾驶路径规划概念与理论介绍
【第28话:路径规划】广度优先搜索(BFS搜索算法)算法详解及代码举例说明
【第29话:路径规划】深度优先搜索(DFS搜索算法)算法详解及代码举例说明
【第30话:路径规划】Dijkstra搜索算法详解及代码举例说明
【第31话:路径规划】自动驾驶启发式搜索算法(A星搜索算法( A* 搜索算法))详解及代码举例说明
【第32话:路径规划】自动驾驶中Hybrid A星(A*)搜索算法的详细推导及代码示例
【第33话:车辆控制】自动驾驶车辆运动学模型推导及详解
【第34话:车辆控制】自动驾驶车辆PID控制(比例-积分-微分控制)原理推导及详解
【第35话:车辆控制】自动驾驶车辆纯跟踪算法(前瞻点、预瞄点算法)控制原理推导及详解
【第36话:车辆控制】自动驾驶车辆线性二次调节器LQR(Linear Quadratic Regulator)控制原理推导及详解
【完结】智能驾驶行泊车全栈基础算法专题课程总结及全部连接
SLAM点云配准:ICP方法详解
在SLAM(同时定位与地图构建)中,点云配准是核心任务,用于对齐不同时刻采集的点云数据,实现精确的位姿估计和地图更新。ICP(Iterative Closest Point)方法是一种经典的点云配准算法,它通过迭代优化来计算两个点云之间的最优刚体变换(旋转和平移)。下面我将详细解释ICP方法,确保内容清晰可靠,并逐步展开。
1. ICP方法概述
ICP算法的核心思想是通过迭代最小化点云之间的距离误差,来求解最优变换参数。给定源点云
P
=
{
p
i
}
P = \{ \mathbf{p}_i \}
P={pi}和目标点云
Q
=
{
q
j
}
Q = \{ \mathbf{q}_j \}
Q={qj},ICP的目标是找到一个刚体变换(旋转矩阵
R
\mathbf{R}
R和平移向量
t
\mathbf{t}
t),使变换后的源点云与目标点云对齐:
min
R
,
t
∑
i
∥
q
i
−
(
R
p
i
+
t
)
∥
2
\min_{\mathbf{R}, \mathbf{t}} \sum_{i} \| \mathbf{q}_i - (\mathbf{R} \mathbf{p}_i + \mathbf{t}) \|^2
R,tmini∑∥qi−(Rpi+t)∥2
其中
R
\mathbf{R}
R是旋转矩阵(满足
R
⊤
R
=
I
\mathbf{R}^\top \mathbf{R} = \mathbf{I}
R⊤R=I),
t
\mathbf{t}
t是平移向量。ICP通过以下步骤迭代求解。
2. ICP算法步骤
ICP是一个迭代过程,包含四个主要步骤:
-
步骤1:找到最近点对应关系
对于源点云 P P P中的每个点 p i \mathbf{p}_i pi,在目标点云 Q Q Q中搜索其最近邻点 q i \mathbf{q}_i qi:
q i = arg min q ∈ Q ∥ q − p i ∥ \mathbf{q}_i = \arg\min_{\mathbf{q} \in Q} \| \mathbf{q} - \mathbf{p}_i \| qi=argq∈Qmin∥q−pi∥
这通常使用KD树等数据结构加速搜索。 -
步骤2:计算最优变换
基于对应点对 ( p i , q i ) (\mathbf{p}_i, \mathbf{q}_i) (pi,qi),计算最小化距离误差的 R \mathbf{R} R和 t \mathbf{t} t。目标函数为:
E ( R , t ) = ∑ i ∥ q i − ( R p i + t ) ∥ 2 E(\mathbf{R}, \mathbf{t}) = \sum_{i} \| \mathbf{q}_i - (\mathbf{R} \mathbf{p}_i + \mathbf{t}) \|^2 E(R,t)=i∑∥qi−(Rpi+t)∥2
通过以下子步骤求解:- 计算点云质心:
p ˉ = 1 N ∑ i p i , q ˉ = 1 N ∑ i q i \bar{\mathbf{p}} = \frac{1}{N} \sum_{i} \mathbf{p}_i, \quad \bar{\mathbf{q}} = \frac{1}{N} \sum_{i} \mathbf{q}_i pˉ=N1i∑pi,qˉ=N1i∑qi - 中心化点云:
p i ′ = p i − p ˉ , q i ′ = q i − q ˉ \mathbf{p}_i' = \mathbf{p}_i - \bar{\mathbf{p}}, \quad \mathbf{q}_i' = \mathbf{q}_i - \bar{\mathbf{q}} pi′=pi−pˉ,qi′=qi−qˉ - 构建协方差矩阵:
H = ∑ i q i ′ p i ′ ⊤ \mathbf{H} = \sum_{i} \mathbf{q}_i' \mathbf{p}_i'^\top H=i∑qi′pi′⊤ - 使用SVD分解
H
=
U
Σ
V
⊤
\mathbf{H} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top
H=UΣV⊤,最优旋转和平移为:
R = V U ⊤ , t = q ˉ − R p ˉ \mathbf{R} = \mathbf{V} \mathbf{U}^\top, \quad \mathbf{t} = \bar{\mathbf{q}} - \mathbf{R} \bar{\mathbf{p}} R=VU⊤,t=qˉ−Rpˉ
注意:需确保 det ( R ) = 1 \det(\mathbf{R}) = 1 det(R)=1,否则调整符号。
- 计算点云质心:
-
步骤3:应用变换
使用计算出的 R \mathbf{R} R和 t \mathbf{t} t更新源点云:
P new = { R p i + t ∣ p i ∈ P } P_{\text{new}} = \{ \mathbf{R} \mathbf{p}_i + \mathbf{t} \mid \mathbf{p}_i \in P \} Pnew={Rpi+t∣pi∈P} -
步骤4:检查收敛
计算平均误差:
ϵ = 1 N ∑ i ∥ q i − ( R p i + t ) ∥ \epsilon = \frac{1}{N} \sum_{i} \| \mathbf{q}_i - (\mathbf{R} \mathbf{p}_i + \mathbf{t}) \| ϵ=N1i∑∥qi−(Rpi+t)∥
如果 ϵ < τ \epsilon < \tau ϵ<τ(预设阈值)或达到最大迭代次数,则停止;否则,返回步骤1。
整个算法流程可总结为以下伪代码:
def icp(source, target, max_iter=100, tol=1e-6):
# 初始化变换
R = np.eye(3) # 单位旋转矩阵
t = np.zeros(3) # 零平移向量
error = float('inf')
for i in range(max_iter):
# 找到最近点对应
correspondences = find_nearest_neighbors(source, target)
# 计算最优R和t
R_new, t_new = compute_optimal_transform(correspondences)
# 应用变换
source = apply_transform(source, R_new, t_new)
# 更新总变换
R = R_new @ R
t = R_new @ t + t_new
# 计算新误差
new_error = compute_error(correspondences, R_new, t_new)
# 检查收敛
if abs(new_error - error) < tol:
break
error = new_error
return R, t
3. ICP方法的数学推导
ICP的核心是优化问题,其数学基础基于最小二乘。以下简化推导:
-
目标函数:
E ( R , t ) = ∑ i ∥ q i − R p i − t ∥ 2 E(\mathbf{R}, \mathbf{t}) = \sum_{i} \| \mathbf{q}_i - \mathbf{R} \mathbf{p}_i - \mathbf{t} \|^2 E(R,t)=i∑∥qi−Rpi−t∥2 -
平移优化:
固定 R \mathbf{R} R,对 t \mathbf{t} t求导:
∂ E ∂ t = − 2 ∑ i ( q i − R p i − t ) = 0 \frac{\partial E}{\partial \mathbf{t}} = -2 \sum_{i} (\mathbf{q}_i - \mathbf{R} \mathbf{p}_i - \mathbf{t}) = 0 ∂t∂E=−2i∑(qi−Rpi−t)=0
解得:
t = q ˉ − R p ˉ \mathbf{t} = \bar{\mathbf{q}} - \mathbf{R} \bar{\mathbf{p}} t=qˉ−Rpˉ -
旋转优化:
代入 t \mathbf{t} t后,目标函数简化为:
E ( R ) = ∑ i ∥ ( q i − q ˉ ) − R ( p i − p ˉ ) ∥ 2 = ∑ i ∥ q i ′ − R p i ′ ∥ 2 E(\mathbf{R}) = \sum_{i} \| (\mathbf{q}_i - \bar{\mathbf{q}}) - \mathbf{R} (\mathbf{p}_i - \bar{\mathbf{p}}) \|^2 = \sum_{i} \| \mathbf{q}_i' - \mathbf{R} \mathbf{p}_i' \|^2 E(R)=i∑∥(qi−qˉ)−R(pi−pˉ)∥2=i∑∥qi′−Rpi′∥2
最大化 ∑ i q i ′ ⊤ R p i ′ \sum_{i} \mathbf{q}_i'^\top \mathbf{R} \mathbf{p}_i' ∑iqi′⊤Rpi′,等价于最大化 trace ( R ⊤ H ) \text{trace}(\mathbf{R}^\top \mathbf{H}) trace(R⊤H)。通过SVD分解 H = U Σ V ⊤ \mathbf{H} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top H=UΣV⊤,最优解为 R = V U ⊤ \mathbf{R} = \mathbf{V} \mathbf{U}^\top R=VU⊤。
4. ICP方法的优缺点
-
优点:
- 简单高效,计算复杂度为 O ( N log N ) O(N \log N) O(NlogN)(使用KD树加速)。
- 适用于刚性变换(旋转和平移),在初始位置较好时收敛快。
- 广泛集成于SLAM框架(如LOAM、Cartographer),用于局部点云对齐。
-
缺点:
- 对初始位置敏感:如果初始偏差大,可能陷入局部最优。
- 假设点云完全重叠:在部分重叠或噪声大时性能下降。
- 仅处理刚体变换:无法处理非刚性变形。
5. 在SLAM中的应用
在SLAM中,ICP常用于:
- 帧到帧配准:实时对齐连续点云,估计机器人位姿变化。
- 局部地图优化:将新点云与局部子地图对齐,减少累积误差。
- 回环检测:对齐历史点云以检测回环,优化全局地图。
为提升鲁棒性,常结合其他技术,如点云滤波(去除噪声)或特征匹配(如FPFH)来初始化ICP。
总结
ICP是一种基础且强大的点云配准方法,通过迭代优化最小化点间距离,实现高效配准。尽管有局限性,但其简单性和效率使其成为SLAM中不可或缺的组件。理解ICP的原理和实现,有助于深入掌握SLAM的点云处理流程。