运行流程
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())进行数据处理,更新里程计位姿。
- 使用readings储存了scan->ranges的数据。
- 使用readings创建了LocalizedRangeScan类型的range_scan。
- 进入Process()
-
计算odom和map之间的转换关系,并发布出去
4. 对Process()函数的说明:
这里是slam核心算法部分,没有详细看,目前主要关注算法的函数调用,功能以及参数的传递。
- 输入:LocalizedRangeScan类型的range_scan
- 输出:bool
- 过程:
- 得到最近的一帧;
- 得到正确的位姿:进行了特征点匹配,得到了最优位姿(其中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地图进行了维护