『OPEN3D』1.8 点云的配准理论

news2024/11/26 16:48:52

点云的配准是将不同的3D点云对齐成一个完成的点云模型;配准的目标是找到两帧点云之间的相对旋转(rotation)与平移(translation),使得两份点云中有重叠的区域能够完好拼接。

点云配准示例图(来自PCL) 

上图为初始的5份点云数据,需要将着几份点云数据拼接成如下图中完整的模型

点云动态配准示例

常见的点云配准方式主要包含ICP配准以及NDT配准以及他们的配准,当然还包括神经网络的点云配准方式。

1、点云配准理论

点云配准需要找到两份点云数据之间点的对应估计,也就是找到两份点云中重叠的部分才可以进行配准,这类配准,对于有确定对应点的配准拥有闭式解(closed form solution)不需要迭代求解即可获取最优值。

       对应点的寻找方式:

1 若为深度相机,则可以借助图像信息来寻找对应的匹配点并投影回3d空间

2 若为两帧点云信息,则可以借助点云特征点来进行确立

不过上诉方法都会出现误匹配,一般会借助RANSAC(随机采样一致性)来得到更为robust的估计。

1 ICP主要为point2point ICP和point2plane两种ICP方式

ICP配准点云时需要有较为准确的初始位姿后再使用该方法进行精配准;ICP的点云配准大体步骤分为如下几步:

1 点的匹配(可以从图像中来或者点云中来)

        1.1 在两帧点云中找到对应的关键点,点云中的关键点一般为特定的几何结构,比如书本的边角,与图像类似;点云中的关键点包括NARF;SIFT;FAST;当然也可以不适用关键点;使用每一个点或者点云中的一部分点来进行配准;不过那样的话会导致计算量过大。

        1.2 特征的描述子;与图像类似,再找到点云的关键点后,需要提取该关键点的描述子信息;通过组合该结构的信息来生成对应的向量用于比对;点云的中描述子包括NARF;FPFH;BRIEF;SIFT等。

2 匹配点估计;给定两帧点云的特征向量集合;通过关键点与描述子来找到重叠区域中相互对应的关键点:对于关键点或特征的匹配,可以使用暴力搜索;kd-tree(FLANN)等方式来进行匹配

3 匹配点对估计;类似与图像中关键点匹配;点云中的关键点匹配也存在许多误匹配;误匹配会影响最终的配准结果;因此此处可以使用ransac或者根据匹配点对的百分位进行截取等方式来进行优化;如果一帧中的某个关键点与另一帧中的多个关键点匹配;则会取最小距离来确定匹配点

4  变换矩阵计算;再得到准确的相互匹配的点云后;则可以计算变换矩阵;

        其中point2point的评估误差为

        point2plane的评估误差为(其中np为点P的法线信息)

        

估计两个点集的R和t可以使用使用SVD或者非线性优化求解; 

1 SVD方法

        给定两对匹配点的点集p{}p{}',对其中第i对匹配点的误差项为:

e{_i} = p{_i} - (R p{_i}'+t)

因此可以对所有点构建最小二乘问题,求得使误差平方和达到极小的R和t:

min{(_R,_t)}\frac{1}{2}\sum_{i=1}^{n}\left \| (p{_i} - (Rp{_i}'+t) ) ) \right \|{_2^2}

分别定义两组点的质心为(此处使用不带下标的项来代表质心):

p = \frac{1}{n}\sum_{i=1}^{n}(p{_i})

p' = \frac{1}{n}\sum_{i=1}^{n}(p{_i}')

在误差函数中进行展开

展开后最后一项元素求和为0(所有p{_i}元素相加减去n个p{_i}的质心p为0),因此优化的结果仅与前两项相关,即

min_{(R,t)}J = \frac{1}{2} \sum_{i=1}^{n}\left | \left | p{_i} - R(p{_i}'-p') \right | \right |^2 + \left \| p -Rp'-t \right \|^2

上式中,只有左边和旋转矩阵R相关,右侧同时R与t。因此只要求得R后令右式为0即可求出t。

ICP的SVD方法流程如下

        1、计算两组匹配点的质心pp',  然后将每个点减去质心得到去质心的坐标:

q{_i} = p{_i} - p

   q{_i}' = p{_i}' - p'

        2、根据上述阐述的优化,计算旋转矩阵:

R{*} =argmin{_R} (\frac{1}{2} \sum_{i=1}^{n}\left | \left | q{_i} - R(q{_i}') \right | \right |^2)

        3、根据计算得到的旋转矩阵计算平移向量t

                t* = p-Rp'        

因此,按照上面的步骤,要先求取两组点集之间的旋转矩阵,所以下面说重点一下R的计算:

\frac{1}{2} \sum_{i=1}^{n}\left | \left | q{_i} - R(q{_i}') \right | \right |^2 = \frac{1}{2} \sum_{i=1}^{n} (q{i}^Tq{_i} + q{_i}'^T R^T R q{_i}' - 2q{_i}^T R q{_i}')

其中第一项q{i}^Tq{_i}与R无关;第二项q{_i}'^T R^T R q{_i}'中因为R为正交矩阵因此R^T R = I,也与R无关;只有最后一项的-2q{_i}^T R q{_i}'与R有关,因此有如下推导:

\sum_{i=1}^{n}(-q{_i}^T R q{_i}') = \sum_{i=1}^{n}-tr(q{_i}^T R q{_i}')=-tr(R\sum_{i=1}^{n}q{_i}'q{_i}'^T)        

               注: 其中tr为trace(迹),有a^Tb = tr(ba^T)

        然后可以使用SVD分解得出最优的旋转矩阵R。

W=\sum_{i=1}^{n}q{_i}'q{_i}'^T

        可知W是一个n*n的矩阵,n为点集的维度,若是点云数据则n=3则W是3*3的矩阵,

若此时W是可逆矩阵,则可以直接通过公式获得最优的旋转矩阵

R = (W^T W)^\frac{1}{2} H^{-1}

但考虑到所有情况,直接对W进行SVD分解也是可以的:

        W = U\sum V^T        

其中\sum为奇异值组成的对角矩阵,对角线元素从大到小排列,UV则为正交矩阵;当W满秩时,R为

        R = UV^T

若R的行列式为负数,则去-R为最优数值。

对这块刚兴趣的同学可以参考Kabsch算法的实现

https://en.wikipedia.org/wiki/Kabsch_algorithmicon-default.png?t=N7T8https://en.wikipedia.org/wiki/Kabsch_algorithm

2 非线性优化

2 open3d中使用ICP

更新中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1255022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库基础教程之数据库的创建(一)

双击打开Navicat,点击:文件-》新建连接-》PostgreSQL 在下图新建连接中输入各参数,然后点击:连接测试,连接成功后再点击确定。 点击新建数据库 数据库设置如下:

10分钟构建本地知识库,让 ChatGPT 更加懂你

大家好,本文将从零开始构建本地知识库,从而辅助 ChatGPT 基于知识库内容生成回答。 这里再重复下部分核心观点: 向量:将人类的语言(文字、图片、视频等)转换为计算机可识别的语言(数组&#xf…

ios开发 之 网络通信

第一节:URL、http 简介 运营商提供的DNS服务器(有可能挂,所以有时候通过ip可以打开,通过域名不可以访问)逐级递增请求,解析域名 google 提供的dns服务器8.8.8.8 编码怎么来的: 最开始是ASCII码…

【Web】/proc利用相关例题wp

先贴一篇文章一起学习一下 [CTF]proc目录的应用 - CodeAntenna ①[HDCTF 2023]YamiYami 点击Read somethings直接跳转到了百度 从url中发现存在任意文件读取,因为不知道flag在哪,所以考虑读环境变量 payload: ?urlfile:///proc/1/environ 拿到fla…

系列十七、各种各样的bean

一、Spring bean 1.1、概述 一句话,被Spring容器管理的bean就是Spring bean。 二、Java bean VS Spring bean 2.1、概述 Java bean是程序员自己new 出来的,Spring bean是Spring工厂创建出来的。 三、配置bean的方式 3.1、概述 所谓配置bean&#xff0…

【精选必读】MyBatis关联查询及注解开发

文章目录 MyBatis关联查询MyBatis一对一关联查询创建持久层接口创建映射文件配置文件注册映射文件测试一对一关联查询 MyBatis一对多关联查询创建持久层接口创建映射文件测试一对多关联查询 MyBatis多对多关联查询创建持久层接口创建映射文件测试多对多关联查询 MyBatis分解式查…

性能测试必看系列之Jmeter:硬件性能监控指标

硬件性能监控指标 一、性能监控初步介绍 性能测试的主要目标 1.在当前的服务器配置情况,最大的用户数 2.平均响应时间ART,找出时间较长的业务 3.每秒事务数TPS,服务器的处理能力 性能测试涉及的内容 1.客户端性能测试:web前…

一. BEV感知算法介绍

目录 前言1. BEV感知算法的概念2. BEV感知算法数据形式3. BEV开源数据集介绍3.1 KITTI数据集3.2 nuScenes数据集 4. BEV感知方法分类4.1 纯点云方案4.2 纯视觉方案4.3 多模态方案 5. BEV感知算法的优劣6. BEV感知算法的应用介绍7. 课程框架介绍与配置总结下载链接参考 前言 自动…

Nginx常见的中间件漏洞

目录 1、Nginx文件名逻辑漏洞 2、Nginx解析漏洞 3、Nginx越权读取缓存漏洞 这里需要的漏洞环境可以看:Nginx 配置错误导致的漏洞-CSDN博客 1、Nginx文件名逻辑漏洞 该漏洞利用条件有两个: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7 php-fpm.conf中的s…

由于找不到vcruntime140.dll无法继续执行代码-提供5个修复方法分你对比

摘要:本文将介绍vcruntime140.dll文件的作用及其在程序运行中的重要性,并提供五个解决vcruntime140.dll无法继续执行的方法。 一、vcruntime140.dll文件介绍 vcruntime140.dll是Windows操作系统中的一项重要文件,它是由Microsoft Visual C提…

交换技术-电路交换-报文交换-分组交换

交换技术是指主机之间、通信设备之间或主机与通信设备之间为交换信息所采用的数据格式和交换装置的方式。按交换技术可分为:电路交换、报文交换和分组交换。 电路交换 交换(switching),就是按照某种方式动态地分配传输线路的资源。 电路交换是在源结点…

Scrapy爬虫异步框架之持久化存储(一篇文章齐全)

1、Scrapy框架初识(点击前往查阅) 2、Scrapy框架持久化存储(点击前往查阅) 3、Scrapy框架内置管道(点击前往查阅) 4、Scrapy框架中间件(点击前往查阅) Scrapy 是一个开源的、基于…

如何在Ubuntu系统上安装MongoDB

简单介绍 MongoDB是由C语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数…

openGauss学习笔记-132 openGauss 数据库运维-查看openGauss状态

文章目录 openGauss学习笔记-132 openGauss 数据库运维-查看openGauss状态132.1 背景信息132.2 前提条件132.3 操作步骤132.4 参数说明132.5 示例 openGauss学习笔记-132 openGauss 数据库运维-查看openGauss状态 132.1 背景信息 openGauss支持查看整个openGauss的状态&#…

【从亮机卡开始的云炼丹】环境配置记录debug

要更改Anaconda环境的默认路径到D盘 可以按照以下步骤操作: 1. 打开Anaconda Prompt(或者命令行窗口)。 2. 输入以下命令更改Anaconda环境的默认路径到D盘: conda config --set envs_dirs D:\Anaconda\envs 这将把Anaconda环境…

【挑战业余一周拿证】二、在云中计算 - 第 2 节 - Amazon EC2 实例类型

第 2 节 - Amazon EC2 实例类型 如果我们想让企业尽可能高效地运作,那就一定要确保员工的技能组合适合他们的角色,就 像我们的咖啡店有不同类型的员工一样,亚马逊云科技也有不同类型的 EC2 实例。每种实例类型 都归属于一个实例系列&#x…

jQuery_08 each函数的使用

each函数的使用 可以循环数组,json,dom对象数组 1.$.each(要循环的内容,function(index,element){处理函数}) 要循环的内容可以是数组,json对象,dom数组 function:循环的处理函数 每个成员都会执行这个函数一次 index&…

Rust语言入门教程(七) - 所有权系统

所有权系统是Rust敢于声称自己为一门内存安全语言的底气来源,也是让Rust成为一门与众不同的语言的所在之处。也正是因为这个特别的所有权系统,才使得编译器能够提前暴露代码中的错误,并给出我们必要且精准的错误提示。 所有权系统的三个规则…

【Linux】Linux项目自动化构建工具 --- make / makefile

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和Linux还有算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 …

tidyverse数据特征学习

目录 特征缩放 1,标准化-scale 2,归一化-rescale 3,行规范化 4,数据平滑 特征变换 1. 非线性特征 2. 正态性变换 3. 连续变量离散 特征降维 特征缩放 不同数值型特征的数据量纲可能相差多个数量级,这对很多…