美文网首页
源码阅读:使用Cartographer进行毫米波SLAM(番外篇

源码阅读:使用Cartographer进行毫米波SLAM(番外篇

作者: 循梦渡 | 来源:发表于2020-11-18 15:12 被阅读0次

    局部SLAM部分:

    1. 当刚初始化一个TrajectoryBuilder时:

    初始时,发出AddTrajectory的服务请求-->cartographer_node调用MapBuilderBridge::AddTrajectory函数,同时订阅传感器的Topic-->该函数调用MapBuilder::AddTrajectory-->该函数中生成一个LocalTrajectoryBuilder2D,然后通过CreateGlobalTrajectoryBuilder把LocalTrajectoryBuilder2D的参数和回调函数传给GlobalTrajectoryBuilder-->以GlobalTrajectoryBuilder为参数构造了CollatedTrajectoryBuilder,并给CollatorInterface中的AddTrajectory函数注册回调函数的实际地址

    2. 在初始化完成后,每次传感器往Topic上广播Message后:

    传感器的ROS节点/Playbag广播到Topic上相关数据的Message---->cartographer_node中启动的StartTrajectory这个服务会订阅传感器数据---->接收到该数据由相应的处理函数处理,比如Node::HandleImuMessage---->该处理函数实际调用是MapBuilderBridge中的一个SensorBridge变量进行处理---->调用了TrajectoryBuilder的虚函数AddSensorData()---->CollatedTrajectoryBuilder或GlobalTrajectoryBuilder继承TrajectoryBuilder并具体实现AddSensorData()函数-->这些函数通过LocalTrajectoryBuilder2D将传感器数据压入相应的数据队列-->LocalTrajectoryBuilder2D通过AddRangeData等函数处理传感器数据

    对于IMU数据和里程计数据都是压入数据队列后被动地等待AddRangeData函数调用PoseExtrapolator来做处理,但当RangeData数据发布时,最后在处理RangeData的AddSensorData中,并不是把数据压入队列,而是在这其中调用了LocalTrajectoryBuilder2D的AddRangeData函数处理。所以,cartographer算法是以激光、点云数据为核心的,IMU、里程计等数据都是起到一定的辅助作用。这就是整个程序的逻辑思路

    全局SLAM部分:

    全局优化有个大致的框架:PoseGraph2D中存在一个constraints::ConstraintBuilder2D类型的变量constraint_builder_, 它的主要任务就是在新的Node加入时建立起该Node与Submap之间的约束。把这些约束放到一个向量std::vector<Constraint> constraints_中。在满足一定条件时,由OptimizationProblem2D类型的变量optimization_problem_来进行全局优化。

    相关文章

      网友评论

          本文标题:源码阅读:使用Cartographer进行毫米波SLAM(番外篇

          本文链接:https://www.haomeiwen.com/subject/bqsluktx.html