LeGO-LOAM学习

前言

在学习了LOAM之后,了解到LeGO-LOAM(面向复杂情况的轻量级优化地面的雷达里程计),进行了一个学习整理。

Github:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM
论文:https://github.com/RobustFieldAutonomyLab/LeGO-LOAM/blob/master/Shan_Englot_IROS_2018_Preprint.pdf

系统概述

系统接收来自3D激光雷达的输入并输出6个DOF姿势估计。 整个系统分为五个模块。 首先是segmentation,使用单次扫描的点云,并将其投影到范围图像上进行分段(线)。 然后将分段的点云发送到feature extraction模块。 然后,激光雷达测距仪使用从前一模块中提取的特征来找到与连续扫描相关的变换。 这些特征在lidar mapping中进一步处理,将它们注册到全局点云图。 最后,transform integration模块融合了激光雷达测距和激光雷达测绘的姿态估计结果,并输出最终的姿态估计。 

接下来,我们看具体每一个模块完成的工作

一、Segmentation

首先将收到的一帧点云投影到一副1800*16的图像上(水平精度0.2°,16线lidar),每一个收到的点代表图像的一个像素,像素的值r_{i}表示相应的点p_{i}到sensor的欧式距离

完成图像化之后得到一个矩阵,对矩阵的每一列进行估计(即完成对地面的估计),在分割之前进行地面点的提取。可能代表地面的点被标记为地面点而不用于分割。

然后,将基于图像的分割方法应用于距离图像以将点分组为多个聚类。同一类的点具有相同的一个标签(地面是较为特殊的一类);同时,为了快速可靠地完成特征提取,忽略少于30个点的类。

完成这一步之后,图像里只保留了可能代表大物体的点,然后记录下点的三个值:(1)类的标签;(2)点在矩阵中的坐标(x,y);(3)点的值即r_{i} 在接下来的模块里使用。

二、Lidar Odometry

首先是特征点的提取,方法与LOAM中的相似,只是进行特征提取的点云是Segmentation处理之后得到的点云。

为了从所有方向均匀地提取特征,作者将图像水平划分为几个相等的子图像。 然后我们基于它们的平滑度c对子图像的每一行中的点进行排序。然后通过设定的阈值c_{th}来判定平面点或者角点。效果如下图:

接下来进行了LOAM中没有的操作,即作者认为子图像中的每一行具有最大c值的edge特征点,其不属于地面; 类似地,子图像中的每一行具有最小c值的平面特征点一定是地面点。处理之后效果如下:

三、Lidar Odometry

Lidar Odometry模块估计两次连续扫描之间的传感器运动。 通过执行point-edge和point-plane扫描匹配找到两次扫描之间的转换。具体方法采用的与LOAM中一致。但在后续步骤中,作者做了一些改进。

1)Label matching

这个时候就用到了在Segmentation中记录下的类的标签(label)。然后在配准过程中,对任意一点的配准只在标签相同的点里进行匹配。例如,平面点只考虑标记为地面点的点,边缘点只考虑其他标记为大物体的点。

作者以这种方式查找对应关系有助于提高匹配准确性。 换句话说,更可能在两次扫描之间找到相同对象的匹配对应关系。 这个过程也缩小了对应点的潜在对应点。

2)Two-step LM Optimization

本文采用两步得到最佳变换:(1)通过配准平面点来得到[t_{z},\theta _{roll},\theta_{pitch}](2)然后在以[t_{z},\theta _{roll},\theta_{pitch}]为约束的情况下,通过配准边缘点来来估计[t_{x},t_{y},\theta_{yaw}]。虽然在第一步中也能估计[t_{x},t_{y},\theta_{yaw}],但它们不够准确而且不用在第二步。

通过使用两步优化方法,可以实现类似的精度,同时计算时间减少约35%。

四、Lidar Mapping

Lidar Mapping模块中,将特征点与周围点云图进行配准,以进一步优化姿势变换,但以较低频率运行。具体细节与LOAM相似。

LeGO-LOAM的主要不同之处在于如何存储最终点云图。LeGO-LOAM选择存储每一个特征点集,而不是单一的点云图。

M^{t-1}是保存所有先前特征点集的集合。在进行扫描时,M^{t-1}中的每个特征集也与传感器的位姿相关联。这样,我们可以根据M^{t-1}来得到周围点云图(surrounding point cloud map)\bar{Q}^{t-1}:第一种方法,通过选择通过选择传感器视场中的特征点集来获得\bar{Q}^{t-1};为了简单起见,选择(特征点集关联的)传感器位姿在传感器当前位置100米范围内的特征点集。然后将所选择的特征点集转换并融合到单个周围的地图中,从而得到\bar{Q}^{t-1}

作者还将位姿图SLAM集成到LeGO-LOAM中。 每个特征点集的传感器位姿可以被建模为位姿图中的节点。特征点集可以视为此节点的传感器测量值。由于Lidar Mapping模块的姿态估计漂移非常低,假设在短时间内没有漂移。通过这种方式,可以通过选择最近的一组特征点集来形成\bar{Q}^{t-1}。然后,可以使用在L-M优化之后获得的变换来添加新节点与\bar{Q}^{t-1}中的所选节点之间的空间约束。可以通过执行闭环检测来进一步消除该模块的漂移。在这种情况下,如果在当前特征点集与使用ICP的先前特征点集之间找到匹配,则会添加新约束。然后通过将位姿图发送到优化系统来更新传感器的估计位姿。

 

运行结果如下

在这里插入图片描述

具体安装测试移步LeGO-LOAM初探:原理,安装和测试

五、闲谈

对论文的学习到此告一段落,大概了解了论文作者的思路以及该算法在LOAM基础上的修改。。。。。。

由于最近比较忙,没有时间详细阅读代码以配合理解论文,后续再补上。。。。。。

 

顺带自捞一下关于LOAM学习的Blog:

LOAM_velodyne学习(一)

LOAM_velodyne学习(二)

LOAM_velodyne学习(三)

LOAM_velodyne学习(四)

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

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

相关文章

(一)低功耗设计目的与功耗的类型

一、低功耗设计的目的 1.便携性设备等需求 电子产品在我们生活中扮演了极其重要的作用,便携性的电子设备便是其中一种。便携性设备需要电池供电、需要消耗电池的能量。在同等电能提供下,低功耗设计的产品就能够工作更长的时间。时间的就是生命&#xff…

(转)彻底学会使用epoll(一)——ET模式实现分析

注:之前写过两篇关于epoll实现的文章,但是感觉懂得了实现原理并不一定会使用,所以又决定写这一系列文章,希望能够对epoll有比较清楚的认识。是请大家转载务必注明出处,算是对我劳动成果的一点点尊重吧。另外&#xff0…

Apache 设置http跳转至HTTPS访问

为什么80%的码农都做不了架构师&#xff1f;>>> <VirtualHost>...</VirtualHost> 中添加如下配置 <IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{SERVER_PORT} 80RewriteRule ^(.*)$ https://域名/$1 [R301,L] </IfModule> 转…

(二)功耗的分析

前面学习了进行低功耗的目的个功耗的构成&#xff0c;今天就来分享一下功耗的分析。由于是面向数字IC前端设计的学习&#xff0c;所以这里的功耗分析是基于DC中的power compiler工具&#xff1b;更精确的功耗分析可以采用PT&#xff0c;关于PT的功耗分析可以查阅其他资料&#…

Hibernate创建hqll时报错

Hibernate 问题,在执行Query session.createQuery(hql) 报错误 出错截图&#xff1a; 这条语句在java运行环境下&#xff0c;直接连数据库不出错&#xff0c;如果在hiberante,struts环境下就出错 出错原因&#xff1a;jar包冲突&#xff0c;struts2和hibernate框架中都有antlr包…

.NET Core TDD 前传: 编写易于测试的代码 -- 全局状态

第1篇: 讲述了如何创造"缝". "缝"(seam)是需要知道的概念. 第2篇, 避免在构建对象时写出不易测试的代码. 第3篇, 依赖项和迪米特法则. 本文是第4篇, 将介绍全局状态引起的问题. 全局状态 全局状态, 也可以叫做应用程序状态, 它是一组变量, 这些变量维护着…

(三)系统与架构级低功耗设计

前面讲解了使用EDA工具&#xff08;主要是power compiler&#xff09;进行功耗分析的流程&#xff0c;这里我们将介绍在数字IC中进行低功耗设计的方法&#xff0c;同时也结合EDA工具&#xff08;主要是Design Compiler&#xff09;如何实现。我们的讲解的低功耗设计主要是自顶向…

(四)RTL级低功耗设计

前面介绍了系统级的低功耗设计&#xff0c;换句话说就是在系统级降低功耗可以考虑的方面。系统级的低功耗设计&#xff0c;主要是由系统级设计、具有丰富经验的人员实现&#xff0c;虽然还轮不到我们设计&#xff0c;我们了解一下还是比较好的。我们前端设计人员的重点不在系统…

Unity3D 游戏前端开发技能树(思维导图)

如果做游戏也是一种游戏,那么这个游戏的自由度实在是太高了.(导图源文件链接&#xff1a;http://pan.baidu.com/s/1eSHpH5o 密码&#xff1a;qzl5) 最近要用思维导图软件Xmind把自己的思路好好捋一捋,算是温故知新吧. 转载于:https://www.cnblogs.com/qiaogaojian/p/6098962.ht…

SQL Server 死锁的告警监控

原文:SQL Server 死锁的告警监控今天这篇文章总结一下如何监控SQL Server的死锁&#xff0c;其实以前写过MS SQL 监控错误日志的告警信息&#xff0c;这篇文章着重介绍如何监控数据库的死锁&#xff0c;当然这篇文章不分析死锁产生的原因、以及如何解决死锁。死锁&#xff08;D…

关于web性能一些特性汇总

关于web性能一些特性汇总 DOMContentLoaded & load load事件是window对象上的事件。指的是网页资源已经加载完毕&#xff08;包括但不限于DOM、图片、音频、脚本、插件资源以及CSS&#xff09;。 DOMContentLoaded事件是document对象上的事件。指的是DOM已经加载完毕。IE中…

(五)门级电路低功耗设计优化

&#xff08;1&#xff09;门级电路的功耗优化综述 门级电路的功耗优化(Gate Level Power Optimization&#xff0c;简称GLPO)是从已经映射的门级网表开始&#xff0c;对设计进行功耗的优化以满足功耗的约束&#xff0c;同时设计保持其性能&#xff0c;即满足设计规则和时序的要…

Spring3向Spring4升级过程中quartz修改

为什么80%的码农都做不了架构师&#xff1f;>>> 问题 nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name ... 原因 org.spri…

EasyUI--messager

1.    alert 方法 <script type"text/javascript">$( function(){$.messager.alert("调用messager","文本内容") ;});</script> 这里还可以通过icon添加相应的图标及info加入回调函数 <script type"text/javascript&quo…

Redis学习第八课:Redis高级实用特性(一)

Redis高级实用特性 注&#xff1a;我学习的环境是vmware7.1 ubantu10.10 redis 3.0.2 1、安全性 设置客户端连接后进行任何其他指定前需要的密码。因为redis速度相当快&#xff0c;一个外部用户可以在一秒钟进行很多次的密码尝试&#xff0c;这就需要设定非常强大的密码来防止…

分布式缓存的面试题9

1、面试题 如何保证缓存与数据库的双写一致性&#xff1f; 2、面试官心里分析 你只要用缓存&#xff0c;就可能会涉及到缓存与数据库双存储双写&#xff0c;你只要是双写&#xff0c;就一定会有数据一致性的问题&#xff0c;那么你如何解决一致性问题&#xff1f; 3、面试题剖析…

ROS与navigation教程——概述

navigation是ROS的二维导航功能包&#xff0c;简单来说&#xff0c;就是根据输入的里程计等传感器的信息流和机器人的全局位置&#xff0c;通过导航算法&#xff0c;计算得出安全可靠的机器人速度控制指令。 代码库&#xff1a;https://github.com/ros-planning/navigation 代…

【设计模式】单例模式 Singleton Pattern

通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例&#xff08;Instance&#xff09; 的情况&#xff0c; 比如说我们想做一计数器&#xff0c;统计某些接口调用的次数&#xff0c;通常我们的数据库连接也是只期望有一个实例。Windows系统的系统任务管理器…

进程及线程通信总结

上文我们介绍了如何建立一个简单的多线程程序&#xff0c;多线程之间不可避免的需要进行通信 。相比于进程间通信来说&#xff0c;线程间通信无疑是相对比较简单的。 首先我们来看看最简单的方法&#xff0c;那就是使用全局变量&#xff08;静态变量也可以&#xff09;来进行通…

ROS multi-master——multimaster_fkie配置

多主站ROS配置和mutimaster_fkie ROS版本&#xff1a;kinetic 操作系统&#xff1a;Ubuntu 16.04。 multimaster_fkie&#xff1a;github 1网络配置 1.1路由器 设置无线路由器并连接两台计算机/机器人。为这两台计算机设置静态IP地址。相互测试ping命令和ssh。 1.2主机 …