Cartographer框架简述

catographer框架分为前端和后端

前端包括雷达数据处理;位姿预测;扫描匹配和栅格地图更新。

后端包括后端:线程池任务与调度;向位姿图添加节点,计算节点的子图内约束和子图间约束(回环检测);多分辨率地图;基于分支定界算法的粗匹配,优化问题的构建与求解。

前端

雷达数据处理

local_trajectory_builder_2d.AddRangeData

点云数据处理,具体包括多传感器时间同步,点云数据去畸,以及体素滤波。

位姿预测

local_trajectory_builder_2d.AddAccumulatedRangeData.ExtrapolatePose

利用pose,以及传入的里程计,imu数据计算出线速度和角速度,不同的情况选择参与运算的传感器不同。利用线速度角速度乘以时间预测平移和姿态。

详见《》

扫描匹配

扫描匹配的目的是找到雷达点云在栅格地图中的位置与角度。

扫描匹配包括相关性扫描匹配RealTimeCorrelativeScanMatcher2D和ceres扫描匹配

将相关性扫描匹配的位姿作为ceres扫描匹配的初始值。

详见《Cartographer 基于ceres的扫描匹配-CSDN博客

更新概率栅格地图

将雷达数据写入概率栅格地图

详见《 Cartographer 栅格地图更新-CSDN博客

后端

后端主要实现的是位姿图优化。向位姿图添加节点AddNode,计算节点的子图内约束和子图间约束(回环检测);多分辨率地图;基于分支定界算法的粗匹配,优化问题的构建与求解。

cartographer 中的节点共有两类---关键帧节点和子图节点。

关键帧指的是子图关键帧,而子图是由连续的若干个激光关键帧拼接到一起形成的子地图。

在carto中子图节点称为submap,关键帧节点称为node

构建约束是在这两类节点之间构建。


图中,三角表示子图,圆圈表示节点,由于传感器的一次扫描数据可能插入到多个不同的子图,所以同一个节点可能和多个子图之间存在一定的匹配关系。

子图内约束:

local 坐标系下,子图原点指向tracking_frame的坐标变换

node和insertion_submaps之间的约束,由于在前端是,一个node只插入到了两个submap中,所以个node最多只有两个约束为子图内约束。

子图间约束:

根据global坐标计算初值,然后通过分支丁界算法粗匹配与ceres的精匹配,获取校准后的位姿,最后计算local坐标系下,子图原点指向校准后的节点间的坐标变换。

使用分支定界算法之前需要先构建多分辨率地图。

构建优化问题,并求解:

  1. 确定2个节点在global坐标系下的相对位姿变换
  2. 通过其他方式再次获取这两个节点的相对位姿变换
  3. 对这2个先对位姿变换的差的最小二乘问题进行求解
  4. 进行求解之后会得到一个增量,将当前位姿加上这个增量后就得到了优化后的位姿

cartographer中通过ceres添加残差项构建优化问题求解。

详见《》

相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark1 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法