local costmap empty using move_base_node|turtlebot_stage
在我运行roslaunch turtlebot_stage turtlebot_in_stage.launch
时查看local_costmap时,发现地图是空的。
这是因为,单线激光的高度在0.4米,而costmap_common_params.yaml
的所选/scan
数据的高度范围在0.25-0.35之间。
然后,我偿试改为max_obstacle_height: 0.5#0.35
,又发现如下警告:
[ WARN] [1540470442.937371426, 3.000000000]: The origin for the sensor at (2.00, 1.98, 0.40) is out of map bounds. So, the costmap cannot raytrace for it.
[ WARN] [1540470443.935926596, 4.000000000]: The origin for the sensor at (2.00, 1.98, 0.40) is out of map bounds. So, the costmap cannot raytrace for it.
[ WARN] [1540470444.935980333, 5.000000000]: The origin for the sensor at (2.00, 1.98, 0.40) is out of map bounds. So, the costmap cannot raytrace for it.
[ WARN] [1540470445.936014597, 6.000000000]: The origin for the sensor at (2.00, 1.98, 0.40) is out of map bounds. So, the costmap cannot raytrace for it.
然后就是各种搜解决方案,终于在这个问题Sensor raytrace error when maps set to voxel最后一个回答中找到了问题的产生原因。
答主的原话是,这是一个很蠢的问题(好吧!!!),z_voxels表示z轴的格数,如果设为2,分辨率因为是0.2,则costmap在z的范围[0,0.2×2]=[0.0,0.4],而0.4正好与警告里的值吻合。下图是官网给出的参数介绍costmap_2d/indigo/obstacles:
而我设定的max_obstacle_height: 0.5#0.35,0.5超出了地图z的有效范围,所以才会产生警告,又由于激光的高度正好为0.4(该值可通过查看/base_laser_link与/base_link的tf关系得知,可调的一个值,怎么调整与本篇无关,不作介绍),所以没有考虑进地图,所以局部地图中才是空白的,其实在这套参数下,实时的激光数据对global_costmap也没起作用。只是global_costmap被全局的地图初始化后,才有一个静态的初始值。这样的costmap不具备应对环境中新出现的障碍物的能力(例如原来构建的全局地图发生改变,又例如环境中有动态障碍物等)。因此,很有必要将参数配置成功,使得costmap中能包含实时的传感器信息。
对原始的costmap_common_params.yaml作上图中两处改变(红框处),z_voxels: 3,这样0.2×3=0.6>0.5>0.4,所以合适,该值取等于大于3的值都可以。
然后重新运行roslaunch turtlebot_stage turtlebot_in_stage.launch,然后就出现了梦寐以求的local_costmap。
总结
如果在知道costmap各个参数所代表的意思后,这个问题的确是一个silly question。不管怎样,现在是搞明白了各个参数的意思。该问题是由local_costmap
的空白引出,其实它的解决,也意味着解决了global_costmap
存在的问题(不包含实时的传感器信息)。