costmap_2d详解2:Costmap 代码整体分析

本文深入解析了ROS中的costmap_2d模块结构与工作原理,详细介绍了其代码文件组织、类继承关系及整体逻辑流程。从mobe_base调用costmap_2d_ros接口开始,至LayeredCostmap的实例化与插件加载,直至地图更新过程,全面展示了costmap如何通过不同插件层处理静态与动态障碍物,为机器人路径规划提供关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码文件结构:

costmap_2d
├── plugins
│   ├── beifen-virtualWall_layer.cpp
│   ├── inflation_layer.cpp  //膨胀层
│   ├── obstacle_layer.cpp  //动态障碍物层
│   ├── simple_layer.cpp
│   ├── static_layer.cpp   //静态障碍物层
│   ├── virtualWall_layer.cpp
│   └── voxel_layer.cpp //将动态障碍物层分成三维障碍物层
├── src
│   ├── array_parser.cpp
│   ├── costmap_2d_cloud.cpp
│   ├── costmap_2d.cpp
│   ├── costmap_2d_markers.cpp
│   ├── costmap_2d_node.cpp
│   ├── costmap_2d_publisher.cpp  //发布master costmap
│   ├── costmap_2d_ros.cpp  //与ros 对接的入口
│   ├── costmap_layer.cpp
│   ├── costmap_math.cpp
│   ├── footprint.cpp   //足迹
│   ├── layer.cpp  //各种costmap层的基类
│   ├── layered_costmap.cpp  //管理master costmap
│   └── observation_buffer.cpp  //动态障碍物数据信息保存数组

代码类继承关系及整体逻辑流程

mobe_base 中调用costmap_2d_ros 接口

  planner_costmap_ros_ = new costmap_2d::Costmap2DROS("global_costmap", tf_);   

  controller_costmap_ros_ = new costmap_2d::Costmap2DROS("local_costmap", tf_);

costmap_2d_ros.cpp 中调用LayeredCostmap

//实例化LayeredCostmap的指针,track_unknown_space is true
  layered_costmap_ = new LayeredCostmap(global_frame_, rolling_window, track_unknown_space);

//创建一个以 type为类类型的实例变量,然后让plugin这个指针指向这个实例
      boost::shared_ptr<Layer> plugin = plugin_loader_.createInstance(type);     
      layered_costmap_->addPlugin(plugin);      

      //这里就会调用到插件的initialize 函数
      plugin->initialize(layered_costmap_, name + "/" + pname, &tf_);
      (initialize 在父类layer.cpp 中,它会调用虚函数onInitialize,最后各个plugin 层会实现该方法)

另外一个线程mapUpdateLoop,去更新地图
 

//更新地图
    updateMap(); => layered_costmap_->updateMap(x, y, yaw);

然后更新各个插件层地图范围,和cost 值
    (*plugin)->updateBounds(robot_x, robot_y, robot_yaw, &minx_, &miny_, &maxx_, &maxy_);
    (*plugin)->updateCosts(costmap_, x0, y0, xn, yn);

LayeredCostmap 中更新每一costmap 范围和cell栅格cost 值
//根据各层的更新情况确定地图更新范围的边界
(*plugin)->updateBounds(robot_x, robot_y, robot_yaw, &minx_, &miny_, &maxx_, &maxy_);
//更新该层costmap 大小
costmap_.resetMap(x0, y0, xn, yn);

//调用各层的updateCosts函数用各层的信息去更新更新范围内的地图信息
//x0, y0, xn, yn是该层costmap地图左下角和右上角坐标,以像素表示
(*plugin)->updateCosts(costmap_, x0, y0, xn, yn);

 

 

 

# Move base node parameters. For full documentation of the parameters in this file, please see # # http://www.ros.org/wiki/move_base # shutdown_costmaps: false controller_frequency: 5.0 controller_patience: 3.0 planner_frequency: 1.0 planner_patience: 5.0 oscillation_timeout: 10.0 oscillation_distance: 0.2 # local planner - default is trajectory rollout #base_local_planner: "dwa_local_planner/DWAPlannerROS" base_local_planner: "teb_local_planner/TebLocalPlannerROS" #alternatives: global_planner/GlobalPlanner, carrot_planner/CarrotPlanner base_global_planner: "navfn/NavfnROS" #We plan to integrate recovery behaviors for turtlebot but currently those belong to gopher and still have to be adapted. ## recovery behaviors; we avoid spinning, but we need a fall-back replanning recovery_behavior_enabled: true recovery_behaviors: #- name: 'super_conservative_reset1' #type: 'clear_costmap_recovery/ClearCostmapRecovery' #- name: 'conservative_reset1' #type: 'clear_costmap_recovery/ClearCostmapRecovery' #- name: 'aggressive_reset1' #type: 'clear_costmap_recovery/ClearCostmapRecovery' - name: 'clearing_rotation1' type: 'rotate_recovery/RotateRecovery' - name: 'super_conservative_reset2' type: 'clear_costmap_recovery/ClearCostmapRecovery' #- name: 'conservative_reset2' #type: 'clear_costmap_recovery/ClearCostmapRecovery' #- name: 'aggressive_reset2' #type: 'clear_costmap_recovery/ClearCostmapRecovery' - name: 'clearing_rotation2' type: 'rotate_recovery/RotateRecovery' #super_conservative_reset1: #reset_distance: 3.0 #conservative_reset1: #reset_distance: 1.5 #aggressive_reset1: #reset_distance: 0.0 super_conservative_reset2: reset_distance: 2.0 #conservative_reset2: #reset_distance: 1.5 #aggressive_reset2: #reset_distance: 0.0
最新发布
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值