点到点ICP-基于SVD分解的帧间点云匹配
目录1.寻找匹配点对2.直接法求解R和t2.1 求解旋转2.2 求解平移2.3 对应代码实现3.迭代上述步骤4.完整流程注本篇笔记的主体内容来源于对深蓝学院《多传感器融合定位》课程的学习推荐有一定基础的SLAM初学者学习该课程。两帧点云的配准过程如上图过程所示。假设当前存在两个点云集合相邻两帧点云scan其中X为k-1时刻激光雷达采集到的三维点云目标点集Y为k时刻采集到的三维点云源点集合。配准的目的为寻找一对合适的旋转R与平移t即帧间相对位姿T[R,t]对Y进行位姿变换后使Y‘可以完美贴合至X理想情况配准的目标即残差函数可以描述为寻找一对合适的[R, t]使旋转后的yi与xi之间的距离最小其中m为集合Y中能找到对应点的点的数量为在集合X中的对应点。算法流程大致为1.寻找匹配点对配准过程需要知道两个点集中点的匹配关系所以需要对集合Y中的点在目标集合X中寻找对应点。由于普通的激光点只包含三维坐标数据无法像视觉特征点通过比较描述子的相似度来显示地找到对应点所以一般通过将Y集合的点根据初始的相对位姿估计投影到k-1时刻并根据三维坐标距离寻找离距离最近的作为对应点。如LOAM点云投影// input_source_k时刻的源点云 // transformed_input_source用于保存转换后的点云 // predict_pose预测的帧间相对位姿T(k-1_k) pcl::transformPointCloud(*input_source_, *transformed_input_source, predict_pose);对于一个点在另一团点云中寻找最近点可以利用kd-tree加速pcl::KdTreeFLANNpcl::PointXYZ::Ptr input_target_kdtree_; // input_target_k-1时刻的目标点云 input_target_kdtree_-setInputCloud(input_target_);通过kd-tree在X中为yi寻找xi// input_source投影到k-1时刻的Y点云 // ys保存能在X点云中找到对应点xi的点yi // xs保存xi size_t ICPSVDRegistration::GetCorrespondence( const CloudData::CLOUD_PTR input_source, // Y集合 std::vectorEigen::Vector3f xs, std::vectorEigen::Vector3f ys ) { const float MAX_CORR_DIST_SQR max_corr_dist_ * max_corr_dist_; size_t num_corr 0; std::vectorint pointSearchIndex; std::vectorfloat pointSearchDistance; for(size_t i 0; i input_source-size(); i) { // 1只找最近的1个点 input_target_kdtree_-nearestKSearch(input_source-points[i], 1, pointSearchIndex, pointSearchDistance); // MAX_CORR_DIST_SQR限制点的最远距离 if(pointSearchDistance.size() 1 pointSearchDistance[0] MAX_CORR_DIST_SQR) { CloudData::POINT point input_source-points[i]; ys.push_back(Eigen::Vector3f{point.x, point.y, point.z}); point input_target_-points[pointSearchIndex[0]]; xs.push_back(Eigen::Vector3f{point.x, point.y, point.z}); num_corr; // pointSearchIndex.clear(); // pointSearchDistance.clear(); } } return num_corr; }因为并不能为Y集合中的每个点在X集合中都找到合适的最近点所以只保存能找到的合适距离之内的yi和xi。2.直接法求解R和t残差函数E可以化简由于则其中只与旋转有关。根据求解出旋转R后就可以代入并令求解平移t。2.1 求解旋转继续看因为R是正交矩阵所以可以化简成如上形式。由于与为常量可以忽略则此时为了将R从两个向量的夹心中提取出来利用矩阵的迹的性质。由于是标量并且标量的迹等于其本身则迹trace而标量的迹是其本身所以最大化等价于最大化。再根据迹的循环性质得因为和Trace()都是线性算子它们可以交换顺序。所以上式中将求和符号放进迹的内部。并且令H矩阵为去中心化后的协方差矩阵则此时问题转化为寻找合适的R使Trace(RH)的值最大。当前R和H都是3x3的矩阵。根据定理若有正定矩阵则对于任何正交矩阵B有。若能寻找到一个R能将转换成的形式则该R就是能使值最大的R。此时对H进行SVD奇异值分解其中为3x3的正交矩阵为3x3的对角矩阵为3x3的正交矩阵。取则有这就得到了能使值最大的R。2.2 求解平移令则2.3 对应代码实现// xs对应目标点集 // ys对应源点集 // transformation_待求解的相对位姿变换增量 void ICPSVDRegistration::GetTransform( const std::vectorEigen::Vector3f xs, const std::vectorEigen::Vector3f ys, Eigen::Matrix4f delta_transformation_ ) { const size_t N xs.size(); // 1.计算两个点集各自的质心 Eigen::Vector3f mu_x Eigen::Vector3f::Zero(), mu_y Eigen::Vector3f::Zero(); for(size_t i 0; i N; i) { mu_x xs[i]; mu_y ys[i]; } mu_x / N; mu_y / N; // 2.构建H矩阵 Eigen::Matrix3f H Eigen::Matrix3f::Zero(); for(size_t i 0; i N; i) { H (ys[i] - mu_y) * (xs[i] - mu_x).transpose(); } // 3.对H执行SVD分解 Eigen::JacobiSVDEigen::Matrix3f svd(H, Eigen::ComputeFullU | Eigen::ComputeFullV); Eigen::Matrix3f U svd.matrixU(); Eigen::Matrix3f V svd.matrixV(); // 4.得到R并检查行列式符号以防止镜像反射 Eigen::Matrix3f R V * U.transpose(); if(R.determinant() 0) { Eigen::Matrix3f I Eigen::Matrix3f::Identity(); I(2,2) -1; R V * I * U.transpose(); } // 5.计算t Eigen::Vector3f t; t mu_x - R * mu_y; // TODO: set output: delta_transformation_.setIdentity(); delta_transformation_.block3,1(0,3) t; delta_transformation_.block3,3(0,0) R; }3.迭代上述步骤因为寻找对应点时并不能准确地为每个yi寻找到其真正对应的xi此时只是用距离最近作为一个匹配关系但并不准确。所以需要循环上述过程直至残差或计算出的相对变换小于设定的阈值则认为找到了两帧的相对位姿变换。4.完整流程// 当前帧点云先验位姿结果点云结果位姿 bool ICPSVDRegistration::ScanMatch( const CloudData::CLOUD_PTR input_source, const Eigen::Matrix4f predict_pose, CloudData::CLOUD_PTR result_cloud_ptr, Eigen::Matrix4f result_pose ) { input_source_ input_source; CloudData::CLOUD_PTR transformed_input_source(new CloudData::CLOUD()); // 将点云根据先验位姿T(lidar(k-1)_lidar(k))进行旋转 pcl::transformPointCloud(*input_source_, *transformed_input_source, predict_pose); // init estimation: transformation_.setIdentity(); int curr_iter 0; std::vectorEigen::Vector3f xs,ys; // 目标点源点 Eigen::Matrix4f delta_transformation Eigen::Matrix4f::Identity(); while (curr_iter max_iter_) { pcl::transformPointCloud(*transformed_input_source, *transformed_input_source, delta_transformation); // 获取对应点集 size_t num_corr GetCorrespondence(transformed_input_source, xs, ys); // TODO: do not have enough correspondence -- break: size_t MIN_CORR_NUM input_source_-size() * 0.5; if(num_corr MIN_CORR_NUM) { break; } // 计算R,t GetTransform(xs, ys, delta_transformation); xs.clear(); ys.clear(); // 叠加位姿增量 transformation_ delta_transformation * transformation_; Eigen::Matrix3f R transformation_.block3,3(0,0); Eigen::Quaternionf q(R); q.normalize(); transformation_.block3,3(0,0) q.toRotationMatrix(); // 阈值判断 if(!IsSignificant(delta_transformation, trans_eps_)) { break; } curr_iter; } // set output: result_pose transformation_ * predict_pose; pcl::transformPointCloud(*input_source_, *result_cloud_ptr, result_pose); return true; }注目标点集也可以是一团局部地图点云先验位姿predict_pose也可以是T(map_lidar(k))。结尾推荐深蓝学院的《多传感器融合定位》课程。

相关新闻

LLM集成前必答6大问题:从需求匹配到成本控制的实战指南

LLM集成前必答6大问题:从需求匹配到成本控制的实战指南

1. 引言:为什么在集成LLM前需要深思熟虑?在当前的AI浪潮中,大语言模型(LLM)已成为众多企业和开发者眼中的"万能钥匙"。无论是智能客服、内容生成,还是代码辅助、数据分析,LLM似乎都能…

2026/7/26 22:37:49 阅读更多 →
基于YOLOv8的输电线路智能检测系统实践

基于YOLOv8的输电线路智能检测系统实践

1. 项目背景与核心价值输电线路作为电力系统的"大动脉",其安全稳定运行直接关系到整个电网的可靠性。然而在户外复杂环境中,输电设备常年面临绝缘子破损、防雷器外壳损坏、鸟巢筑造、风筝缠绕、垃圾附着等多重威胁。传统人工巡检方式效率低下&…

2026/7/26 22:37:49 阅读更多 →
游戏AI中NPC动态决策与情感模拟技术解析

游戏AI中NPC动态决策与情感模拟技术解析

1. 项目概述:当NPC开始"思考"在《荒野大镖客2》中,NPC会记住玩家的恶行并改变后续互动;《模拟人生》里的小人会因环境变化产生不同情绪反应。这些设计背后,是游戏AI领域最迷人的课题之一——如何让虚拟角色具备拟人化的…

2026/7/26 22:36:48 阅读更多 →

最新新闻

如何快速获取九大网盘真实下载链接:网盘直链下载助手终极指南

如何快速获取九大网盘真实下载链接:网盘直链下载助手终极指南

如何快速获取九大网盘真实下载链接:网盘直链下载助手终极指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘…

2026/7/26 22:58:58 阅读更多 →
Stable Diffusion与CLIP:图像理解与生成的技术解析

Stable Diffusion与CLIP:图像理解与生成的技术解析

1. 从图像理解到生成的统一技术解析上周调试Stable Diffusion模型时,突然意识到现在的AI不仅能识别图片内容,还能根据文字描述生成新图像。这种理解与生成的双向能力背后,其实是一套统一的技术框架。今天我们就用程序员能听懂的大白话&#x…

2026/7/26 22:58:58 阅读更多 →
m4s-converter:5分钟解锁B站缓存视频,永久保存你的数字记忆

m4s-converter:5分钟解锁B站缓存视频,永久保存你的数字记忆

m4s-converter:5分钟解锁B站缓存视频,永久保存你的数字记忆 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 在数字内容瞬…

2026/7/26 22:58:58 阅读更多 →
基于嵌入技术的聊天消息主题聚类:解决技术团队信息过载问题

基于嵌入技术的聊天消息主题聚类:解决技术团队信息过载问题

那天下午,团队群里的消息又炸了。产品经理丢了个需求文档,开发在讨论接口字段,测试在报环境问题,还有人插科打诨发了个搞笑动图。等我处理完手头的事回来爬楼,发现已经错过了三个重要讨论点——这种场景,做…

2026/7/26 22:58:58 阅读更多 →
2023年AI领域核心争议与实战应对策略

2023年AI领域核心争议与实战应对策略

1. 2023年AI领域核心争议全景图今年AI行业的争论焦点呈现出明显的技术迭代与伦理博弈交织特征。根据全球顶级学术会议论文提交量和产业白皮书数据显示,以下六大议题占据了全年75%以上的公开讨论热度:1.1 大模型军备竞赛的边界之争GPT-4、Claude 2等千亿参…

2026/7/26 22:58:58 阅读更多 →
agent面试必备48-AI Agent 核心进阶:多智能体“任务分配策略”

agent面试必备48-AI Agent 核心进阶:多智能体“任务分配策略”

🎯 AI Agent 核心进阶:多智能体“任务分配策略”全解析与面试通关指南 在搭建多智能体(Multi-Agent)系统时,如果我们已经搞定了“通信机制”,紧接着就会面临一个现实的“管理学”问题:当系统里有…

2026/7/26 22:57:58 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻