专栏文章:
深蓝学院-多传感器融合定位课程-第1章-概述_goldqiu的博客-CSDN博客
深蓝学院-多传感器融合定位课程-第2章-3D激光里程计I_goldqiu的博客-CSDN博客
github保存了相关代码和学习笔记:
https://github.com/goldqiu/Shenlan-Course-Multi-Sensor-Fusion-for-Localization-Mapping/tree/main/%E7%AC%AC3%E7%AB%A0%EF%BC%9A3D%E6%BF%80%E5%85%89%E9%87%8C%E7%A8%8B%E8%AE%A1II
代码、PPT、视频见文件夹
本质:拿特征做里程计的推算。
参考github:
https://github.com/AlexGeControl/Sensor-Fusion-for-Localization-Courseware
https://github.com/kahowang/sensor-fusion-for-localization-and-mapping
参考文献:LOAM: Lidar Odometry and Mapping in Real-time Ji Zhang and Sanjiv Singh
推荐博客:https://blog.csdn.net/robinvista/article/details/104379087
在第k+1帧中找到一个线特征点(曲率最大),转换到k帧坐标系下(根据运动模型或者其他传感器猜测得到),然后在第k帧中找与k+1帧中特征点最近的一个点,然后再找相邻的一个点,组成一条线,那么第k+1帧的点到第k帧的线就有了,可以构建优化问题了。
面特征也一样,先在第k帧搜索离第k+1帧面点(曲率最小)最近的一个点,然后在第k帧是找同根线的一个点和相邻线的一个点,三点构建平面,然后构建点面残差方差,进行优化求解。
整个优化问题的核心是求得残差关于待求变量的雅可比矩阵。
• 自动求导实现方便,但效率会比解析求导低 (比较 A-LOAM 和 F-LOAM );
• 实际使用中,能够自动求导且效率没有形成障碍的,优先使用自动求导;
• 除这两种方法外,还有数值求导(SLAM问题中不常见,不过多介绍)
只做帧间匹配的后果:
A-LOAM主要特点 1) 去掉了和IMU相关的部分 2) 使用Eigen(四元数)做位姿转换,简化了代码 3) 使用ceres做迭代优化,简化了代码,但降低了效率 代码:https://github.com/HKUST-Aerial-Robotics/A-LOAM
F-LOAM主要特点 1) 整体和ALOAM类似,只是使用残差函数的雅可比使用的是解析式求导 代码:https://github.com/wh200720041/floam
原始loam是没有帧的概念的,帧和地图做匹配,地图已经是无序的点云了,是做线和平面拟合来构建残差。没有保存每个关键帧的位姿和点云,进行后端优化后的调整,这是比较不足的。
代码和文档见文件夹。
注:
由于 make_unique 是c++ 14的新特性,需要在CMakelists.txt 中添加c++14 的编译指向:
在CMakelists.txt 添加
set(CMAKE_CXX_STANDARD 14)
参考博客:
slam中ceres的常见用法总结
Ceres详解(一) Problem类
Ceres详解(二) CostFunction
Ceres(二)LocalParameterization参数化
优化库——ceres(二)深入探索ceres::Problem
[ceres-solver] From QuaternionParameterization to LocalParameterization
基于线面特征的激光里程计
代码和文档见文件夹。