cartographer类的简明介绍

ImuTracker: 使用imu角速度和线速度更新位姿
queues:所用传感器数据放入其中。
ThreadPool:运行task_queues里的数据
Task:记录task及其状态,是否要放到task_queues
FixedRatioSampler:数据使用比例
RateTimer:计算频率
BlockingQueue:自定义了一个队列操作
Rigid2/Rigid3:位姿变换处理
TimestampedTransform:如其名,时间和变换矩阵
TransformInterpolationBuffer:两个变换矩阵之间的插值
MapById:记录nodeid、其数据及处理 NodeId:记录轨迹和节索引 
MapLimits: 记录地图坐标系的网格数、最大值、分辨率
ProbabilityGrid:记录MapLimits、每个cell的概率,转换表??,第一次转换表都是0开始,没问题,那第二次呢
ProbabilityGridRangeDataInserter2D:将点云填充到栅格,更新栅格值
XYIndexRangeIterator :遍历地图栅格迭代器
Submap2D:记录子地图,每20帧一个子地图
OccupiedSpaceCostFunction2D:代价函数,以点云在地图上的free值为残差值,因为点云代表有占据,所以是占据越大越好,但是优化一般是最小值,则换成free,越小越好
GridArrayAdapter:获取栅格地图的概率,专门给ceres::BiCubicInterpolator使用
CeresScanMatcher2D:前端扫描匹配,
PrecomputationGrid2D:构建不同分辨率地图
ProbabilityGridRangeDataInserter2D:查找表
CastRays:绘制二维栅格地图
FastCorrelativeScanMatcher2D:分支定界法,获得点云的粗匹配
ValueConversionTables 将a在[b,c]中的位置放大到[0,32767]
CeresScanMatcher2D:使用OccupiedSpaceCostFunction2D计算点云的残差,平移量和旋转量的残差
RayToPixelMask:使用贝汉明算法绘制地图上的线段

名词解释:

1、tracing_frame:当前点云帧
2、local坐标系:前端的坐标,子地图的坐标
3、global:后端优化时的坐标,如无特殊定义,一般与loacl坐标重合
4、Maplimits:记录分辨率、左上角最大值、网格数量,网格中心对应点云扫描匹配后local坐标值 
5、bounds_to_lookup_table、value_to_correspondence_cost_table 、conversion_tables、kValueToProbability:[0,1~32767]映射达到[0.9,0.1~0.9],存了两遍是为了针对更新过的值增大了32676,更新过的值也能查询到
6、hit_table、miss_table:每次命中后都是乘固定的odd,至于odd是多大取决于自定义。因此只要对表查询一次即可更新cell的概率
7、扫描匹配:以点云在栅格地图上的平均概率为得分,
(1)遍历子地图,找出得分最高的位姿initial_pose_estimate
(2)ceres图优化,平移残差:使用initial_pose_estimate作为初始值,位姿推测器的位置为固定值(目标值,使用位姿推测器的位姿作为目标值很怪,并且推测过程也没考虑噪声),做差;旋转残差:使用initial_pose_estimate作为初始值,使用initial_pose_estimate作为目标值

整体逻辑:

前端:
1、读取点云数据之后,对其预处理:按时间排序、去除运动畸变、将点云分段(如果点云太大)、体素滤波
2、读取到IMU数据,优化机器人位姿(重力对齐)、辅助点云去除畸变
3、使用IMU或者odom(也可以使用点云计算线速度和角速度)推测的位姿作为点云的初始值与子地图扫描匹配
4、以扫描匹配得到的结果(如果移动较大),则将其放入子地图(子地图中心(原点)是第一帧点云local坐标)。

后端:
1、将前端得到的匹配结果和子地图传入posegraph
2、每次获取一次点云,则计算新节点与已经完成的子图之间的约束(相对变换)、
(1)计算约束时,节点与子图之间的相对变换需要小于一定值(回环检测需要间隔一定的时间,一个子图180帧已经确保时间足够了)。
(2)间隔多个节点才进行一次约束
(3)为每个已经完成的子图构建多分辨率地图与进行分支定界获取节点和子图之间的约束,https://zhuanlan.zhihu.com/p/336807140
(4)插入多个节点后才进行一次优化(whendone),插入节点时需要满足(1)(2) 
(5)每次计算的约束汇总成一个vector,
3、计算刚完成子图和之前所有节点的约束(建图时,只计算子图的局部匹配,定位时才使用全局)
4、将前端的相对变换和后端计算的约束做差,优化这个残差
5、重新计算出的global值,保存到一个vector,绘图的时候再用这个值,但是并没有对前端计算出的local值修正


注:前端的重力对齐和扫描匹配有创新,其他都是基础操作
回环检测时,只进行粗匹配,粗匹配满足一定条件才进行ceres优化,减少计算量


改进:
1、前端并没有使用点云扫描匹配后的位姿变换更正线速度和角速度,误差会累积越来越多,留在了后端优化来去噪,可以引入卡尔曼滤波在前端去噪


 

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值