一、介绍
costmap每个格子都有三种状态(occupied, free, unknown space)
两种行为 mark and clear
标记的时候,根据传感器的信息,执行上述的mark or clear的操作。
订阅tf是为了将激光雷达基于自身坐标系获得的传感器信息,转移到map坐标系下,完成costmap的更新。
参数transform_tolerance
用于设置容忍没有获得tf_state的最大时限。超过的话,机器人将会停止。
使用move_base直接启动costmap的时候,他会创造两个costmap,分别将之命名为global_costmap 和 local_costmap。
最后,每个costmap都可以选择配置四层layer:
- static map layer
- obstacle map layer
- inflation map
- voxel_layer
他们通过插件的形式加载到cosmap_2d中。
我们会为global_costmap配置静态地图层+膨胀层,为local_costmap配置障碍物地图层 + 膨胀层
其中,静态地图层是订阅/map话题,通常由map_server提供。关键参数static_map
设置为true
障碍物地图层是通过实时获取传感器信息,在周围设置好的地图范围内获取周围障碍物信息。关键参数rolling_window
设置为true
二、示例
用turtlebot3举例
1. map_server
仅仅订阅map_server提供的/map话题:
2. global_costmap
仅仅订阅global_costmap:(下图包括静态地图层 + 障碍物层 + 膨胀层)
只看静态地图层:
只看障碍物地图层:(基于传感器)
关于膨胀地图,其中关键参数为cost_scaling_factor
,他是膨胀过程中应用到代价值的比例因子。
成本函数的计算方法如下:
exp(-1.0 * cost_scaling_factor * (distance_from_obstacle - inscribed_radius)) * (costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1)
公式中costmap_2d::INSCRIBED_INFLATED_OBSTACLE
目前指定为254。
注意:由于在公式中将cost_scaling_factor乘以负数,所以增大比例因子会降低代价值。
3. local_costmap
仅仅订阅local_costmap:(下图包括障碍物层 + 膨胀层)
其中局部代价地图,只是查看周围的一定范围内的代价数值。
局部地图通常基于odom的frame:
global_frame: odom
robot_base_frame: base_footprint