两份costmap如下:
planner_costmap_ros_ = newcostmap_2d::Costmap2DROS("global_costmap", tf_);
controller_costmap_ros_ = newcostmap_2d::Costmap2DROS("local_costmap", tf_);
看看区别:
他们的参数分别如下;
local_costmap_params.yaml:
local_costmap:
global_frame: odom
robot_base_frame: /base_footprint
update_frequency: 5.0
publish_frequency: 2.0
//注意,其实ros里提供了一种cfg机制,可以建立dynamic_reconfigure::Server并设置callback,当配置变化时,会调用callback。那么那些config会被通知到?需要定义一些cfg文件,config文件制定了关心的config参数。在make时,python处理这些cfg文件生成一些cpp的类,这些类就是具体的config类,他们会从rosparam server获取和设置参数,而rosparam中的参数的源头其实都是这里的yaml文件中的参数。所以我们看到的cfg文件中的和这里同名的参数,那只是说明那些自动生成的类会用到我们在yaml中设置的参数。并且设置了默认,最小,最大值等等。这样以来,我们可以有两条获取config的方法,一是直接访问paramserver,一是访问config。数据源头其实都是yaml文件。
//update frequency控制voidCostmap2DROS::mapUpdateLoop(doublefrequency)这个函数循环执行的频率。每次循环都会调用layeredCostmap的updateMap,将各个layer的数据合并算出结果。publishfrequency用来控制向外publishcostmap的频率。所以增大update_frequency频率会加快内部的地图合成速度。增大publish_frequency会加快发送给rviz的速度。
static_map: false //这个参数貌似是老板本的代码遗留物,目前有了plugins项目后,就不再使用这个了
rolling_window: true //这个costmap是否随着robotroll.默认是false.这里因为是local costmap要随着机器人滚动。而globalcostmap就不需要。当滚动时,layeredcostmap的origin要在每次updatemap时都被更新。
width: 4.0
height: 4.0
resolution: 0.05 //
transform_tolerance: 0.5//这个是Costmap2DROS::getRobotPose函数获取基于globalframe的robotpose所耗时间的一个阈值,超过这个阈值就会有warning.
plugins:
- {name: obstacle_layer, type: "costmap_2d::VoxelLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
global_costmap_params.yaml:
global_costmap:
global_frame: /map
robot_base_frame: /base_footprint
update_frequency: 1.0
publish_frequency: 0.5
static_map: true
transform_tolerance: 0.5
plugins:
- {name: static_layer, type:"costmap_2d::StaticLayer"}
- {name: obstacle_layer, type:"costmap_2d::VoxelLayer"}
- {name: inflation_layer, type:"costmap_2d::InflationLayer"}
看看缺别,看看如何使用这些参数的。
先来看看<