costmap_2d 之 layer

文章详细介绍了ROS导航包中Layer层的重要作用,包括初始化、更新边界、更新代价等关键功能。Layer是一个虚类,提供updateCosts和updateBounds接口,用于构建和更新代价地图。LayeredCostmap则负责聚合各层。此外,还讨论了与父costmap的交互、footprint的更新以及动态配置等功能。

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

layer

说起这个layer层,那就是所有层之母了:

请添加图片描述

甭管是Static层,Obstacles层,Inflation层,还是最后合成Master层,几乎人手必备以下功能,并各自按照实际情况单独实现。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gcd0ntyP-1680077473391)(ROS读码笔记.assets/v2-7edd8efeb6f6f2559ff89c3d9694bd54_r.jpg)]

作为一个合格的地图层,要能初始化,更新边界,更新代价,调整自己的尺寸,顺便还能带上机器人的足迹随时更新。

这个类整个就是一个虚类,提供了最重要的两个接口,updateCosts跟updateBounds,updateBounds计算打算更新的范围,updateCosts就是更新cost了。layer类中还使用到了LayeredCostmap,用来将各个层聚合在一起。LayeredCostmap类中主要的更新函数是updateMap,可以看到在udpateMap里利用到前面提到的多态,遍历调用了所有层的两个核心函数。(注意区分:layeredcostmap,costmaplayer,layeredcostmap是分层叠放的代价地图,costmaplayer是代价地图层)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C24L7Qzg-1680077473393)(ROS读码笔记.assets/v2-dac1ec3fbdacf256544735c9ec532024_r.jpg)]

1.初始化

这个类中有一个 LayeredCostmap* layered_costmap_ 数据成员,这个数据成员很重要,因为这个类就是通过这个指针获取到的对master map的操作。没有这个指针,所有基于Layer继承下去的地图的类,都无法操作master map。

void initialize(LayeredCostmap* parent, std::string name, tf2_ros::Buffer *tf);

2.更新边界大小

  virtual void updateBounds(double robot_x, double robot_y, double robot_yaw, double* min_x, double* min_y,
                            double* max_x, double* max_y) {}

3.更新代价

  virtual void updateCosts(Costmap2D& master_grid, int min_i, int min_j, int max_i, int max_j) {}

4.检查数据

  bool isCurrent() const
  {
    return current_;
  }

5.匹配父costmap大小

  virtual void matchSize() {}

6.获取机器人footprint

const std::vector<geometry_msgs::Point>& getFootprint() const;

7.更新机器人footprint

  virtual void onFootprintChanged() {}   

8.初始化子类

  //这是在initialize()结束时调用的。重写以实现子类特定的初始化。
  virtual void onInitialize() {}

其他:

  /** @brief 停止发布者。 */
  virtual void deactivate() {}

  /** @brief 如果发布者已被停止,请重新启动它们。 */
  virtual void activate() {}

  virtual void reset() {}

  //用户可以通过动态重新配置来启用/禁用层。
  inline bool isEnabled() const noexcept
  {
    return enabled_;
  }

参考文献:

ROS导航包源码学习3 — costmap_2d - 知乎 (zhihu.com)

costmap_2d:layer层 - 知乎 (zhihu.com)

ROS naviagtion analysis: costmap_2d–Layer_BobLiao1987的博客-CSDN博客

### ROS `nav2_costmap_2d` 使用说明及相关问题 #### 1. 基本概念 `nav2_costmap_2d` 是 ROS 中用于创建和维护二维代价地图的核心模块之一。该模块提供了对环境的表示能力,并支持多种传感器数据(如 LaserScan 和 PointCloud)的融合,从而构建动态更新的地图[^2]。 #### 2. 功能概述 - **全局与局部地图** 在导航过程中,`planner_costmap_ros_` 被配置为全局规划使用的地图,而 `controller_costmap_ros_` 则服务于局部路径跟踪。两者均基于 `costmap_2d::Costmap2DROS*` 封装实现[^1]。 - **生命周期管理** `Costmap2DROS` 继承自 `node_interfaces::LifecycleNodeInterface`,其设计遵循 ROS 生命周期节点的状态机模式。这意味着可以通过激活、停用等方式灵活控制地图的行为。 - **插件机制** Nav2 的代价地图框架高度依赖插件化的设计思路。开发者能够通过定义不同的图层(Layer)、过滤器(Filter),以及扩展发布/订阅接口来自定义行为[^3]。 #### 3. 参数设置 为了适配不同场景需求,`nav2_costmap_2d` 提供了一系列可调参数。这些参数通常位于 `.yaml` 文件中加载到对应的 Lifecycle Node 上: ```yaml global_costmap: ros__parameters: update_frequency: 5.0 # 地图刷新频率 (Hz)[^4] publish_frequency: 2.0 # 发布频率 (Hz) global_frame: map # 全局坐标系名称 robot_base_frame: base_link # 机器人基座帧名 resolution: 0.05 # 单元格分辨率 (m/cell) local_costmap: ros__parameters: rolling_window: true # 是否启用滚动窗口模式 width: 6 # 局部地图宽度 (米) height: 6 # 高度 (米) ``` 上述片段展示了如何分别针对全局与局部地图调整核心属性。 #### 4. 常见问题及其解决方案 ##### a) 导航失败或路径不合理 可能原因包括: - 成本阈值设定不当; - 障碍物检测范围不足; 建议检查相关参数并优化传感器输入质量。 ##### b) 性能瓶颈 如果发现 CPU 或内存占用过高,则需评估当前地图尺寸是否过大或者不必要的复杂计算正在运行。适当降低分辨率或将某些不必要图层禁用有助于缓解此现象。 ##### c) 数据同步异常 当多源感知设备间存在时间戳偏差时可能会引发一致性错误。确保所有参与话题的时间戳精确匹配至关重要。 --- ### 示例代码:初始化 Costmap2DROS 对象 以下是简单的 C++ 实现示例,展示如何实例化一个基本版本的 `Costmap2DROS` 并启动周期性更新逻辑。 ```cpp #include <ros/ros.h> #include <costmap_2d/costmap_2d_ros.h> int main(int argc, char** argv){ ros::init(argc, argv, "example_node"); // 初始化节点句柄 ros::NodeHandle nh("~"); try { costmap_2d::Costmap2DROS costmap("my_costmap", nh); while(ros::ok()){ ros::spinOnce(); costmap.updateMap(); // 手动触发更新操作 ros::Duration(0.1).sleep(); } } catch(std::exception& e){ ROS_ERROR_STREAM(e.what()); } return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值