LOAM框架分析
LOAM的整体思想就是将复杂的SLAM问题分为:1. 高频的运动估计(10HZ) 2. 低频的环境建图(1HZ)。
在运动估计中采用scan-to-scan方式,同时对点云进行了计算曲率,筛选线面特征,降低匹配数据量, 通过点到线和点到面构造误差函数,在求解变换关系前,通过匀速假设构造线性插值关系,对点云进行运动补偿后用非线性优化LM求解匹配;
在环境建图中采用map-to-map方式匹配,采用了PCA主成分思想提取线面特征,达到降维的目的,保证匹配精度的同时提升匹配效率。帧间匹配还有scan-to-map方式,主要差异体现在计算效率和匹配误差精度上。
添加对系统框图的关键流程理解:

从个人角度看理解loam算法的精髓主要思考两点:
(1) 如何选择特征让匹配效率更高
(2) 匹配误差模型如何建立,更精确的描述运动过程

我们知道曲线的曲率(curvature)指曲线上某个点的切线方向角对弧长的转动率,通过微分来定义,表明曲线偏离直线的程度。数学上表明曲线在某一点的弯曲程度的数值。曲率越大,表示曲线的弯曲程度越大,在点云中曲率越大的点集表示线,曲率越小的点表示面。LOAM在匹配前先对每一个点计算曲率, 曲率会用于下一步的筛选线和面特征。先看论文中定义的曲率公式:

问题的关键这个公式怎么来的了?如何理解?
这里需要提一下3D数据滤波 - laplacian平滑中的思想:
3D深度图滤波可以按照物理距离查找到相邻域的点集,用邻域点集的平均值代替滤波前点,实现平滑:

问题思路就在这里,假设我们不用邻域点集的平均值代替滤波前的点, 可以用一个权重w(即论文中的曲率c)描述滤波前的点和滤波后的点的接近程度(邻域点集平均值表示), 由于原论文和大多数博客只有结论,这里按照个人的理解给出公式的推导:

基于以上每个点的曲率计算公式,筛选特征点,按照c在不同范围的阈值,可以将点分为四类:
(1) 曲率特别大的点:charp
(2) 曲率大的点:less_sharp
(3) 曲率特别小的点:flat
(4) 曲率小的的:less_flat
最终选择以上的曲率特别大的点(charp)为边缘点(线),曲率特别小的点(flat)为平面点。

筛选完特征点后,可以对连续特征帧进行匹配,需要建立误差模型。LOAM中采用点到线的距离,和点到面的距离构造误差函数。
注意在下面讨论(1)和(2) , 点到线和点到面中点的含义指的是K+1帧点经过变化后在K参考帧的变换点,即变换后的点到线和点到面。
(1) 点到线的距离
这里的点指第k+1帧经过变换后的点, 线指第k帧经过筛选后的点云中的特征线,距离计算即求d(P,Line)。计算距离有很多方式,论文使用叉乘来实现。在2d和3d中,直线L是由两个点P0和 P1确定,可以使用叉乘直接计算从任意一点P到直线L的距离。

(2) 点到面的距离

(3) 理论误差函数
问题变为求解:

即第k+1帧点云中的第i个点的变换点到参考点云的所有的点到线和点到面的距离的累加和为求解的问题模型, 加入旋转R和平移t。

可以写出第k+1帧原始点云第i点和变化后的点云(以上推导都是)之间关系:

Loss函数变为:

貌似只要用优化的方法求解,就可以得到最佳的结果。实际雷达的频率不够快,主要有几点:
(1) 激光点数据不是瞬时获取,同一帧点云不同位置的点时间戳不一样
(2)激光扫描时,本身伴随着机器人移动
因此,激光点云频率较低时,机器人的运动补偿不得不考虑进去。
运动补偿就是需要将一帧点云中的所有不同时间戳的位置点补偿到同一个时间戳,这个时间戳不一定要求是开始扫描点的时间,可以介于任意之间任意一个时刻。补偿的方法是需要知道每个时间戳对应的点的位置,假设知道起始扫描点的姿态,相对于起始点的姿态该怎么计算了,有不同的方法:
(1) 高频率里程计校准

如果里程计中融合IMU可以对旋转角度进行高精度补偿。通过硬件传感器可以实现将一帧点云中不同时刻的位置都变换到起始时刻,不同点的时间戳为同一个时间戳。假如没有这些传感器该怎么解决了?怎么获取Delt(odom)?
(2) 匀速模型假设
匀速模型假设就是假设K-1时刻到K时刻的里程计变化量(帧间匹配)与K到K+1时刻的里程计变化量相等,同时假设K+1帧也是匀速运动,采用线性插值可以估计出每个点相对起始时刻的位姿。

采用线性插值后得到:

(3) 修正误差函数
没有考虑补偿的第k+1帧原始点云第i点和变化后的点云之间关系,经过运动补偿后为:

整理得到优化损失函数:

注意:
矩阵R是满足罗德里格斯变换的旋转矩阵 loam-velodyne采用欧拉角计算的,A-LOAM采用四元数计算。

最终的loss函数满足:

论文采用LM算法进行优化求解,具体算法可以看优化课程。只关心迭代过程:

其中,雅可比矩阵J, 具体如何解决雅可比矩阵:

多元函数在某一点的梯度是一个非常特殊的向量,其由多元函数对每个变量的偏导数组成(这即是为什么求梯度的时候需要对各个变量求偏导的原因),其方向为函数在该点增加最快的方向,大小为函数在该点的最大变化率。向量求导
以上不断的匹配计算的是相邻两点云之间的平移变换,即激光里程计,是在雷达坐标系L下,需要转化到全局地图坐标系W下:

高频里程计的不断的输出经过补偿后校准的点云帧序列,以及其对应的激光在全局坐标系下的姿态,但是以上是基于scan-to-scan的匹配方式,效率虽然提高了,但是精度不高。可以思考是否基于以上不精确的初值再做一次匹配, 参考帧选择基于初值附近的局部点云地图,待匹配帧采用基于初值后的一定梳理的被校准过的连续帧,论文中取10帧。

问题的模型变为:给定初值,计算两团(每团包含不同数量点云)的之间变换,并求解全局坐标。

由上图知道OA已知是由激光里程计输出的不精确姿态,要输出OB,则需要先基于两团点云(每团包含不同数量帧点云)计算AB,这里也是属于帧间匹配问题, 那么计算两团点云如何计算了?
(1) 点云团的数量量大,需要降低数据量,即采用特征手段或者其他方法匹配,降低数据量。
(2) 与激光里程计(高频率)中计算曲率筛选特征不同,这里采用计算点相邻点集合的协方差,判断边缘点和平面点
(3) 筛选了边缘点和平面点之后的过程都是一样,包括问题建模和LM优化。
因此,我们只需深入讨论协方差如何判断边缘点(线特征)和面特征?这里包含了点云的哪些基础知识点了?
主要思想是PCA分析3D点云的几何形状参数,如下介绍:
(1) 基本原理
可以参考博客PCA:详细解释主成分分析 借用其中一句解释PCA思想:
最大方差理论:方差越大,信息量就越大。协方差矩阵的每一个特征向量就是一个投影面,每一个特征向量所对应的特征值就是原始特征投影到这个投影面之后的方差。由于投影过去之后,我们要尽可能保证信息不丢失,所以要选择具有较大方差的投影面对原始特征进行投影,也就是选择具有较大特征值的特征向量。然后将原始特征投影在这些特征向量上,投影后的值就是新的特征值。每一个投影面生成一个新的特征,k个投影面就生成k个新特
PCA是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度,同时保留住较多的原数据点的特性。
(2) 计算方法
PCA的核心思想是矩阵的特征值分解。将一团点云看成时3D的"椭球体", 可以用PCA主成分分析椭球体三个轴的方向(主方向),三个轴相互垂直。
主要计算方法流程如下:

(3) 分析结论
(1) 特征λi值代表点云在该方向上(基座标)的投影后的方差大小,方差代表点的离散程度
(2) 特征值越大,方差越大,点越分散到此特征值对应的方向上 ,反之越小方差越越小,点越集中,越远离该方向
(3) 可以知道线特征都分散到一个基座标,面特征都分散到两个基座标
基于以上可以方法可以筛选出点云中的边缘点(线)和平面点,如下图所示:

(4)直线和平面方程

算出直线和平面的法向量,就可以继续按照点到线和点到面,计算损失函数。其他优化过程与高频激光里程计部分一样。
[1] https://zhuanlan.zhihu.com/p/111388877
[2] http://www.everyinch.net/index.php/computergeometry2/
[3] https://www.zhihu.com/question/58312854
[4] https://blog.csdn.net/lanyuelvyun/article/details/82384179
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标
网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.
一、机器人介绍 此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接
目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在Rails上做两个项目,它们运行良好,但在这个过程中重新发明了轮子,自来水(和热水)和止痛药,正如我随后了解到的那样,这些已经存在于框架中。那么基本上,正确了解框架中所有智能部分的最佳方法是什么,这将节省时间而不是自己构建已经实现的功能?从第1页开始阅读文档?是否有公开所有内容的特定示例应用程序?一个特定的开源项目?所有的rails交通?还是完全
我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s