navigation之costmap_2d

本文详细介绍了costmap_2d包的功能和工作流程,该包用于构建2D或3D代价地图,通过整合传感器数据,生成并更新障碍物图层及缓冲区扩展,适用于动态窗口生成和静态地图构建,支持实时地图信息发送至rviz。

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

https://blog.youkuaiyun.com/weixin_37058227/article/details/79068900

    costmap_2d这个包提供了一种2D代价地图的实现方案,该方案利用输入的传感器数据,构建2D或者3D代价地图,并根据占用网格和用户定义的膨胀半径计算2D代价地图。

      以层的概念来组织图层,用户可以根据需要自己配置,默认的层由static_layer(通过订阅map_server的/map主题)来生成, obstacle_layer根据传感器获得的反馈来生成障碍物图层inflation_layer则是将前两个图层的信息综合进行缓冲区扩展。该包可用于动态窗口的生成(比如base_local_planner中使用的就是动态的局部窗口地图),也可以生成静态地图(比如global_planner中使用的就是全局静态地图)。https://blog.youkuaiyun.com/weixin_37058227/article/details/79368234

       此外,该包还在实时发送自己的地图信息,通过nav_msgs::OccupancyGrid发送消息给rviz。所以可以仿照该写法来发送自己想要的数据到rviz中去。
 

流程分析:

......

### 如何使用 `costmap_2d` 发布 ROS Costmap Topic 为了使 `costmap_2d` 成功发布成本地图(Costmap),通常需要配置好相应的ROS节点和服务。具体来说,`move_base` 节点作为集成导航堆栈的一部分会自动启动并管理 `costmap_2d` 的实例化过程[^2]。 #### 配置文件设置 首先,在参数服务器上定义全局和局部规划器的成本映射配置。这可以通过编辑 launch 文件来完成,确保指定了正确的 YAML 参数文件路径: ```xml <param name="global_costmap" command="$(find my_robot_name_bringup)/params/costmap_common_params.yaml"/> <param name="local_costmap" command="$(find my_robot_name_bringup)/params/local_costmap_params.yaml"/> ``` 这些YAML文件应包含必要的层描述符以及每层的具体选项,比如障碍物检测、膨胀半径等属性。 #### 启动 Move Base 和 Costmap Nodes 通过运行带有适当参数的launch脚本可以激活整个导航系统,其中包括了 `costmap_2d` 实例: ```bash roslaunch my_robot_navigation move_base.launch ``` 一旦上述命令被执行,`move_base` 将读取先前设定好的参数,并创建两个独立的工作空间——一个是用于全球范围内的路径规划;另一个则是针对即时避障需求而设计的小区域视窗。这两个工作区都会持续不断地广播各自的状态至 `/move_base/global_costmap/costmap` 及 `/move_base/local_costmap/costmap` 主题下。 #### 订阅 Costmap Topics 任何希望接收来自 `costmap_2d` 数据的应用程序都可以订阅上面提到的主题名称之一。例如,利用RViz可视化工具查看实时更新的地图信息非常简单直观: 1. 打开 RViz (`rosrun rviz rviz`) 2. 添加新的显示项 -> 占用网格 (Occupancy Grid) 3. 设置主题为 `/move_base/global_costmap/costmap` 或者 `/move_base/local_costmap/costmap` 这样就可以看到由传感器输入所构建出来的环境模型了。 ```python import rospy from nav_msgs.msg import OccupancyGrid def callback(data): # Process the received occupancy grid data here. pass if __name__ == '__main__': rospy.init_node('costmap_subscriber') sub = rospy.Subscriber('/move_base/global_costmap/costmap', OccupancyGrid, callback) rospy.spin() ``` 此Python代码片段展示了如何编写一个简单的ROS节点去监听特定于全局或本地级别的成本图消息流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值