更新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

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

被折叠的 条评论
为什么被折叠?



