详解kinectfusion之三位姿估计

2024-03-05 21:59

本文主要是介绍详解kinectfusion之三位姿估计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

kinectfusion中使用的位姿估计方式是点到面的ICP。这个方法的选择主要是考虑到相机快速运动,相邻两帧之间位姿变化微小。该ICP方法的优势是可以快速收敛至最优解。

我们先来回顾一下ICP的通用流程。

1. 输入源点云与目标点云,源点云为需要进行变换的点云,目标点云为固定点云,也是源点云经变换后能与之重合的点云。

2. 确定源点云与目标点云之间的点云匹配关系。

3. 根据上一步骤确定的匹配点云,计算旋转平移变换矩阵。

4. 将上一步骤计算的变换矩阵,作用于源点云,得到新的源点云。

5. 计算新的源点云与目标点云之间的重合误差,若小于设定的阈值,那么就结束;否则重复2-4步骤。

不同的ICP方法,主要是在计算变换矩阵这一步骤有所不同。

点到面的ICP方法介绍

接下来,针对本文中使用的icp方法,涉及到的具体步骤详细展开介绍一下。

1.源点云为当前相机拍摄到的数据帧,记作V_{k},目标点云为上一帧数据,记作V_{k-1}。方法中为了提高准确率,目标点云不是直接用的上一帧数据,而是根据上一帧的位姿,生成的新的数据帧,生成方法,我们会在后面展开介绍,此处以上一帧数据代替,进行讲解。

2. 点云匹配关系的确定,本文采用的是投影法

   假设v_{k-1}V_{k-1}中的任一点,V_{k-1}对应的位姿为T_{k-1}v_{k}V_{k}中的任一点,V_{k}对应的位姿为T_{k},其中,T_{k}的初始值与T_{k-1}相同,后面会随着ICP迭代更新。

——————————————————————————————————————————

对于V_{k-1}中的每一个点v_{k-1}作以下操作

             如果v_{k-1}是个有效的三维坐标

                      v_{k}^{g}=T_{k}*v_{k}          注:将源点云经变换矩阵,变换到世界坐标系

                      \dot{v_{k-1}}=inv(T_{k-1})*v_{k}^{g}        注:世界坐标下的源点云经逆变换矩阵,变换到V_{k-1}所在坐标系

                      u_{k-1}=P*v_{k-1}    注:k-1坐标系中的源点云坐标,经投影矩阵,到k-1像素坐标

                      如果u_{k-1}是有效的

                               \left \| \dot{v_{k-1}}- v_{k-1} \right \|<距离阈值

                                \left \| \dot{n_{k-1}} .dot(n_{k-1}) \right \|<法向量夹角阈值

                      那么该匹配关系成立

——————————————————————————————————————————

3. 根据上一步骤得到的点匹配关系,最小化误差函数,计算变换矩阵。

基于点到平面的ICP的误差函数为

J=arg min_{r}\sum \left ( \left ( R*v_{k}+t-v_{k-1} \right ) * n_{k-1}\right )^{2}

由于本文最初假设了相机运行速度快,并且旋转角度\theta非常小,趋近于0,那么

cos \theta \approx 1,sin \theta \approx \theta,\theta ^{2}\approx 0,

假设绕x,y,z轴旋转的角度分别是\alpha\beta\gamma,并且取值非常小,趋近于0,那么旋转矩阵可以近似为

R\approx \begin{bmatrix} 1 & -\gamma & \beta \\ \gamma &1 &-\alpha \\ -\beta &\alpha &1 \end{bmatrix}

可以重写误差函数

J=arg min_{r}\sum \left ( \left ( R*v_{k}+t-v_{k-1} \right ) * n_{k-1}\right )^{2}\\ =\left \| Ax-b \right \|^{2}

这样非线性的误差函数,近似为线性,每一步的最优解x为:

\hat{x}=(A^{T}A)^{-1}A^{T}b

那么\alpha =\hat{x}(0),\beta=\hat{x}(1),\gamma =\hat{x}(2)

转为旋转矩阵与平移向量为

R=\begin{bmatrix} cos\gamma &-sin\gamma&0 \\ sin\gamma &cos\gamma&0\\ 0&0&1\end{bmatrix}* \begin{bmatrix} cos\beta&0 &sin\beta\\ 0&1 &0 \\ -sin\beta&0 &cos\beta\end{bmatrix}* \begin{bmatrix} 1&0 &0\\ 0&cos\alpha &-sin\alpha \\ 0&sin\alpha &cos\alpha\end{bmatrix}

t=\begin{bmatrix} \hat{x}(3)\\\hat{x}(4)\\\hat{x}(5)\end{bmatrix}

经过多次迭代后,求得最优解R^{*}t^{*}

这篇关于详解kinectfusion之三位姿估计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777948

相关文章

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Java中的JSONObject详解

《Java中的JSONObject详解》:本文主要介绍Java中的JSONObject详解,需要的朋友可以参考下... Java中的jsONObject详解一、引言在Java开发中,处理JSON数据是一种常见的需求。JSONObject是处理JSON对象的一个非常有用的类,它提供了一系列的API来操作J