目录
- 说明
- 一. 开篇
- 二. 数据集
- 三. 软件框架
- 四. 前端里程计初试
- 五. 前端里程计代码优化
- 六. 传感器时间同步
- 七. 里程计精度评价
- 八. 点云畸变补偿
- 九. 建图系统结构优化
- 十.
说明
学习知乎上任乾写的从零开始做激光slam系列,在这里总结一下收获
一. 开篇
- 作者给出了本系列的简单介绍,包括用的传感器,平台,写作思路等等。
二. 数据集
- 作者使用了KITTI数据集,在下载的过程中发现,直接翻墙从国外网站下载速度非常快。
- 主要是利用激光雷达数据和RTK数据做融合。
RTK,GNSS,IMU等定位方式的精度要详细了解一下 - 将数据集转换成ROSBAG,然后利用rviz就能进行原始数据效果查看了。
三. 软件框架
- 将订阅和发布写成分开的类,同时,再按照传感器数据类型进行进一步分类
- 功能流程:
(1) 接收数据放到队列中
(2) 选出时间基本一致的数据组
(3) 发布数据
四. 前端里程计初试
-
功能流程:
(1)接收数据放到队列里
(2)选出时间基本一致的数据
(3)点云预处理
清洗NAN数据
点云稀疏化
(4)第一帧单独处理,直接更新局部和全局地图
(5)利用ndt匹配点云,获得单步的运动变换关系
(6)当运动距离达到一定程度,就更新局部地图和全局地图
-
局部和全局地图更新流程:
“地图”:是一个一个的点云数据帧序列
地图:是一个大的点云数据帧,包含了20个小关键帧帧的点
(1)更新局部地图关键帧队列,保证只有20个
(2)把所有的点加到一个地图点云帧里
(3)更新ndt的目标点云
(4)更新全局地图关键帧队列,每100个关键帧,进行一次全局地图点云帧更新
五. 前端里程计代码优化
- 这里功能流程基本没有什么变化
- 除了将订阅和发布分开,不同类型的数据分开之外,也将处理方法单独列出了一些类和函数,运用了继承的方式,便于以后扩展
- 地图关键帧存储在了硬盘上,可以节约内存空间
六. 传感器时间同步
-
时间同步处理包含两个方面:
(1)各个传感器用的时间源是一致的,kitti数据集已经处理好
(2)通过插值的方式获得同一个时刻的数据值,这里主要是与雷达数据对齐
-
功能流程
(1)接收数据放到队列里
a. 索引:找到和激光雷达数据时间戳对齐的前后两针imu或gnss数据
b. 插值:线性插值获得和激光雷达数据时间一致的imu/gnss数据
c. 注意:这里处理完后deque里实际上只有一个数据!!,这里是不是损失了一些可积分位置信息
(2)选出时间基本一致的数据
(3)点云预处理
a. 清洗NAN数据
b. 点云稀疏化
(4)第一帧单独处理,直接更新局部和全局地图
(5)利用ndt匹配点云,获得单步的运动变换关系
(6)当运动距离达到一定程度,就更新局部地图和全局地图
-
这里车辆航向角四元数插值用的是线性插值,不是球面插值
七. 里程计精度评价
- 只要把数据存储下来,然后调用evo命令就能对结果进行评价,有两种评价
(1)每100米误差
(2)累计误差
八. 点云畸变补偿
-
功能流程,只变化了标黄部分
(1)接收数据放到队列里
a. 索引:找到和激光雷达数据时间戳对齐的前后两针imu或gnss数据
b. 插值:线性插值获得和激光雷达数据时间一致的imu/gnss数据
c. 注意:这里处理完后deque里实际上只有一个数据!!
(2)选出时间基本一致的数据
(3)点云预处理
a. 利用车辆运动信息,消除点云运动畸变,
a. 清洗NAN数据
b. 点云稀疏化
(4)第一帧单独处理,直接更新局部和全局地图
(5)利用ndt匹配点云,获得单步的运动变换关系
(6)当运动距离达到一定程度,就更新局部地图和全局地图
-
这里有很多坐标系变换,速度变换的东西,可以仔细整理一下
九. 建图系统结构优化
- 由于模块比较多,作者重新梳理了结构:
目前有:数据预处理,里程计,后端优化,闭环检测,显示五大模块 - 在之前的基础上,增加了不同的功能节点,将五大功能模块划分清楚,变成了不同的rosnode。
- 每一个node都有一个flow,在flow中调用核心的一些算法
十.