karto-slam运行流程

运行流程

1. 订阅了 /scan 话题,得到了LaserScan结构的数据;

2. 进入了回调函数,首先是:通过scan数据,创建了一个激光装置实例(getLaser())。

       · 在函数中,通过scan数据对激光实例的参数进行了设定,并且计算出了激光对于base_link的位姿。

3. 进入了addScan(laser, scan,odom_pose)函数(

  •         对于激光laser的输入数据scan,添加局部的scan 数据(range_scan)       将局部数据range_scan 添加到地图中:processed = mapper_->Process(range_scan)
  • 以达到矫正位姿的效果;):

·获取里程计位姿(getOdomPose()),调用process(Process())进行数据处理,更新里程计位姿。

  1. 使用readings储存了scan->ranges的数据。
  2. 使用readings创建了LocalizedRangeScan类型的range_scan。
  3. 进入Process()
  4. 计算odom和map之间的转换关系,并发布出去

4. 对Process()函数的说明:

这里是slam核心算法部分,没有详细看,目前主要关注算法的函数调用,功能以及参数的传递。

  1. 输入:LocalizedRangeScan类型的range_scan
  2. 输出:bool
  3. 过程:
  •         得到最近的一帧;
  •         得到正确的位姿:进行了特征点匹配,得到了最优位姿(其中bestPose是sensor scan在世界坐标系的位置),并且根据此计算了车在世界坐标系map的位置;
  •         完成了回环检测。
  •         TryCloseLoop ()是用来回路检测的,其实也可以看成是在做匹配,因为函数的内部就调用了MatchScan()的代码;因为是用位姿图来做优化的,把位姿看成节点,节点之间的边看成协方差,作为约束;经过多次MatchScan()让协方差足够小时就完成了回路检测。

5. 跳出addscan(),又进入了updateMap()

维护地图:更新地图传入了参数mapper_->GetAllProcessedScans(),他是一个LocalizedRangeScanVector类型的变量。应该是所有的处理过的scan。

        注:updateMap()函数设计的函数另外说明

参数的传递

回调函数得到了scan数据

--->由scan生成了laser激光装置实例

--->由laser, scan,得到机器人在odom坐标系下的2维平面的位姿odom_pose

--->由scan的ranges创建了LocalizedRangeScan类型的range_scan

--->而LocalizedRangeScan类型的range_scan包含了这一帧的数据,并且有这一帧对应的机器人在odom和map的坐标系下的位置

--->range_scan传入了Process()进行了匹配回环检测,将这一帧的局部scan加入到了全部的scan,得到了机器人的GetCorrectedPose(map下),发布了odom map tf

--->更新地图传入了参数mapper_->GetAllProcessedScans()

--->得到了栅格地图,并对ros地图进行了维护

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值