【第21话:定位建图】SLAM点云配准之3D-3D ICP(Iterative Closest Point)方法详解

开启智能驾驶新篇章!《智能驾驶行泊车全栈基础算法专题课程》圆满收官,欢迎订阅!
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,tminiqi(Rpi+t)2
其中 R \mathbf{R} R是旋转矩阵(满足 R ⊤ R = I \mathbf{R}^\top \mathbf{R} = \mathbf{I} RR=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=argqQminqpi
    这通常使用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)=iqi(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ˉ=N1ipi,qˉ=N1iqi
    • 中心化点云:
      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=pipˉ,qi=qiqˉ
    • 构建协方差矩阵:
      H = ∑ i q i ′ p i ′ ⊤ \mathbf{H} = \sum_{i} \mathbf{q}_i' \mathbf{p}_i'^\top H=iqipi′⊤
    • 使用SVD分解 H = U Σ V ⊤ \mathbf{H} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top H=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+tpiP}

  • 步骤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}) \| ϵ=N1iqi(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)=iqiRpit2

  • 平移优化
    固定 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 tE=2i(qiRpit)=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(qiqˉ)R(pipˉ)2=iqiRpi2
    最大化 ∑ 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(RH)。通过SVD分解 H = U Σ V ⊤ \mathbf{H} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top H=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的点云处理流程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一碗白开水一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值