专栏文章:
深蓝学院-多传感器融合定位课程-第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
第3章:3D激光里程计II
课程内容 代码、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帧是找同根线的一个点和相邻线的一个点,三点构建平面,然后构建点面残差方差,进行优化求解。
文章图片
整个优化问题的核心是求得残差关于待求变量的雅可比矩阵。
基于线面特征的位姿优化
文章图片
文章图片
位姿优化代码实现
ceres 基础知识
文章图片
文章图片
文章图片
文章图片
文章图片
自动求导与解析求导的对比
? 自动求导实现方便,但效率会比解析求导低 (比较 A-LOAM 和 F-LOAM );
? 实际使用中,能够自动求导且效率没有形成障碍的,优先使用自动求导;
【人工智能|深蓝学院-多传感器融合定位课程-第3章-3D激光里程计II】? 除这两种方法外,还有数值求导(SLAM问题中不常见,不过多介绍)
自动求导实现位姿优化(A-LOAM)
文章图片
文章图片
解析求导实现位姿优化(F-LOAM)
文章图片
文章图片
相关开源里程计
基于特征的里程计实现流程
文章图片
只做帧间匹配的后果:
- 雷达角分辨率不够、频率低,导致下一帧没有特征关联。
- 精度也不够,两帧之间的关联特征很少,优化的精度不够。
文章图片
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
基于线面特征的激光里程计
实验室实车实现 代码和文档见文件夹。
推荐阅读
- 霍金(人工智能可能是人类文明史的终结,除非学会如何避免风险)
- Pytorch|Pytorch optimizer.step() 和loss.backward()和scheduler.step()的关系与区别
- 计算机视觉|机器视觉——目标跟踪
- ros编译工程失败
- 嵌入式|干货(嵌入式系统设计开发大全!(万字总结))
- 资讯|抖音开放平台,究竟开放了什么()
- 人工智能|CNN-1: LeNet-5 卷积神经网络模型
- ?项目复现?|?项目复现?基于CIFAR-10+LeNet的训练实现
- 智能优化算法应用|智能优化算法应用(基于麻雀搜索算法的工程优化案例)