点云配准
摘要:本文整理 ICP、点到平面 ICP 与 NDT 点云配准,从刚体变换、误差模型和初始位姿理解算法流程。各方法分别配合 PCL 核心代码,讲解输入准备、参数配置、迭代求解与配准结果检查。
1. 点云配准的目标
配准估计两份点云之间的空间变换,使同一场景的表面尽可能重合。源点云(source)是待变换的点云,目标点云(target)是参考点云。帧间配准可用于里程计,当前帧与地图配准可用于定位,但动态物体和不充分的几何结构可能干扰位姿估计。
本文采用列向量表示,源点 变换到目标坐标系:
表示旋转, 表示平移。明确变换方向可以避免把返回矩阵直接当成其逆矩阵使用。
下文代码为处理函数内的教学片段,点云非空、已去除 NaN/Inf,长度单位为米。参数是示例值,实际需要结合场景与分辨率设置。
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/common/transforms.h>
#include <Eigen/Geometry>
#include <cmath>
using PointT = pcl::PointXYZ;
using Cloud = pcl::PointCloud<PointT>;
// source、target 是已加载的 Cloud::Ptr。
1.1 代码讲解:提供初始位姿
const float yaw = 0.05f; // 弧度:示例初始偏航角
Eigen::Affine3f initial = Eigen::Translation3f(0.5f, 0.0f, 0.0f)
* Eigen::AngleAxisf(yaw, Eigen::Vector3f::UnitZ());
Eigen::Matrix4f guess = initial.matrix();
guess 也应表示源到目标的变换。工程中初值可来自上一帧位姿、IMU、轮速计或其他定位结果。ICP 与 NDT 都是局部优化方法,初值偏差较大时可能落入错误的局部最优。
2. ICP(点到点迭代最近点)
参考:PCL ICP 教程。
流程:按当前位姿变换源点 → 搜索目标中的对应点 → 剔除过远对应 → 求解增量变换 → 更新位姿 → 检查停止条件。
设 为源点当前匹配到的目标点索引,点到点误差为:
对应集合 会随迭代改变,最近邻不一定是真实的同一表面点。通常需要足够重叠和较好的初始位姿。
| 配置项 | 示例值 | 作用 |
|---|---|---|
setMaxCorrespondenceDistance | 1.0 | 允许对应点的最大距离 [m] |
setMaximumIterations | 50 | 最大迭代次数 |
setTransformationEpsilon | 1e-6 | 相邻变换的平移变化停止阈值,PCL 使用平方平移量 |
setEuclideanFitnessEpsilon | 1e-6 | 配准误差变化的停止阈值 |