lego-loam学习笔记

本文详细解读了LOAM及LeGO-LOAM算法,分享了作者一个月的学习心得,包括算法原理、实现细节及性能提升。针对高动态环境、平面假设前提等问题进行了深入探讨,同时提供了丰富的参考资料。

更新20191205,花了一个月时间,读了一遍lego-loam和loam,发现原文中的转换关系搞不懂,然后借照aloam和lego-loam实现思路,重新复现了一下算法。

综合效果,比论文稍好。loam原始论文学习告一段落,有问题的同学可以留言讨论。

接下来,集中力量攻克一下3D slam

 

原始的github仓库已经不开源了,但是有别人fork过去的仓库,

别人fork的仓库链接如下,

https://github.com/laboshinl/loam_velodyne

目前2019,有比原始loam效果更好的改进版本,链接如下https://github.com/RobustFieldAutonomyLab/LeGO-LOAM

所以,主要学习该文章。争取一个星期内将其搞清楚。

 

有人解读lego-loam,https://wykxwyc.github.io/2019/04/26/LeGO-LOAM-Paper-Traslation-and-Summary/

参照这个翻译,比较容易懂算法原理

 

知乎专栏也有代码解读 https://zhuanlan.zhihu.com/p/57351961  可以参考一下

 感觉更加详细的版本, https://blog.youkuaiyun.com/wykxwyc/article/details/98317100

 

另一个写loam的版本,可以参考,其中把bfs的代码单独写为了一个节点,可以分析下。

 

第一遍lego-loam,问题

1. 在高动态环境中,比如室内有扶梯时,表现会怎么样,和风吹小草的环境类比呢?

2. 平面假设的前提,如果遇到围观和狭小空间的场景,由于lidarFOV问题,看不到地面时,表现会怎么样?

3. 取2,4, 40, 80这几个参数,比如车在完全平面的大空地时,是不是实际nFe的值小于40,此时怎么处理?

 

第一遍看代码问题

1.         segMsg.startOrientation = -atan2(laserCloudIn->points[0].y, laserCloudIn->points[0].x); 为啥角度时负值,坐标关系是怎样的?

解答:应该是两个原始电云坐标系和当前坐标系不一样,当前坐标系前x左y,原始电云坐标系前x右y。换算关系就能对上了。

2. 讲解velodyne 16坐标的帖子, http://s1nh.org/post/project-velodyne/

TODO

velodyne_points中的ring是可以解析出来的,这样代码中就不用去计算ring了

有velodyne的模型 https://codediversion.wordpress.com/2019/01/16/simple-ros-c-and-lidar-with-pcl-on-ubuntu-16-04/ 后面做视频时,也许可以用到

 

featureAssociation中的 float ori = -atan2(point.x, point.z); 说是求解的yaw角,但是没有搞懂哇?

转换了一下坐标系,注意有个赋值,是将原来的xyz转换为了zxy

 

写代码时,每个成员函数最好明确输出输出,不要把类成员变量当做全局变量使用,人脑的记忆能力是有限的,这样可读性高一些。

 

为什么看别人的代码,需要花费很久的时间,原理在于记忆力有限。我们需要花足够多的时间熟悉代码,记住函数名、成员名,当任何一个函数调用时,可以明确的知道其中意思,那么就可以很快的理解代码了。

对比一下自己写的代码,其实就是这样,比如自己谢了2000行代码,也是需要很久时间的,这个时间里,就在不断的记忆函数名和逻辑。特别是调试的过程中,这个记忆更加加深。

所以说,读别人的代码,没有捷径,就应该不断的堆时间看结构,看原理,不断记忆。

 

imageprojection中的colum_index的计算还是没有弄清楚

罗德里格斯公式中,常数项是否带cos(theta),slam14讲的推导中带,但是wiki百科上的又不带。到底时哪个?

答案:经过毛毛师兄的提醒,搞懂了,有个换算关系,n^n^ = nn_T - I

 

featureAssociation.cpp中,姿态转换的时候,为什么要乘以10, 按源码的话,得到是一个比例呢?而且后续都是用到了,

 

我问了几个看过这个代码的同学,大家在细节上,并没有注意弄清楚。问到的坐标转换,时间系数细节都不清楚,所以这是一种方法还是疏漏呢,如果我啃下来了,那么如何将关键细节和阅读代码的方法沉淀下来呢?

 

雷神的激光和velodyne激光的坐标系定义不一样,而且velodyne的包中有ring,雷神的包里有timestamp

loam_velodyne中倒是没有乘以系数s 

https://github.com/laboshinl/loam_velodyne

 

在函数 laserOdometryHandler 中,transformSum的坐标转换没有搞清楚,

 

早上有个思路,将xyz坐标系转换到yaw, pitch, distance坐标系下,草稿上画了一下,range图就类似这个作用,

同时地面检测约束了yaw角度0.25度(代码中时0.005弧度),但是pitch角度并没有约束,所以打到墙面上的点,好多并不是surface feature。这个结论也不成立。

另外一个改进思路,地图的存储,点云地图-》特征地图(surface&corner)-》自动提取点线地图,作为导航地图。

 

翻译 https://wykxwyc.github.io/2019/05/18/LOAM-Paper-Translation-and-Summary/

aloam,秦通他们实现的一个版本

这个解读也蛮好的 https://zhuanlan.zhihu.com/p/57351961

 

bfs聚类的点云分割算法

https://blog.youkuaiyun.com/OORRANNGGE/article/details/87860577

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值