ros-navigation学习笔记(四)costmap代价地图

本文围绕ROS中costmap代价地图展开。介绍了costmap为解决原始全局地图静态、规划路径不安全问题而存在,通过costmap_2d软件包实现local_costmap和global_costmap。还阐述了创建stdr_move_base软件包,以及配置costmap相关参数文件,最后可在RViz中查看两种代价地图。

0x00 什么是costmap代价地图

在机器人进行路径规划时,我们需要明白规划算法是依靠什么在地图上来计算出来一条路径的。依靠的是gmapping扫描构建的一张环境全局地图,但是仅仅依靠一张原始的全局地图是不行的。因为这张地图是静态的,无法随时来更新地图上的障碍物信息。在现实环境中,总会有各种无法预料到的新障碍物出现在当前地图中,或者旧的障碍物现在已经从环境地图中被移除掉了,那么我们就需要来随时更新这张地图。同时由于默认的地图是一张黑白灰三色地图,即只会标出障碍物区域、自由移动区域和未被探索区域。机器人在这样的地图中进行路径规划,会导致规划的路径不够安全,因为我们的机器人在移动时需要与障碍物之间保持一定的安全缓冲距离,这样机器人在当前地图中移动时就更安全了。

costmap简单来说就是为了在这张地图上进行各种加工,方便我们后面进行路径规划而存在的。那具体该如何实现costmap呢?在ROS中使用costmap_2d这个软件包来实现的,该软件包在原始地图上实现了两张新的地图。一个是local_costmap,另外一个就是global_costmap,根据名字大家就可以知道了,两张costmap一个是为局部路径规划准备的,一个是为全局路径规划准备的。无论是local_costmap还是global_costmap,都可以配置多个图层,包括下面几种:

  • Static Map Layer:静态地图层,基本上不变的地图层,通常都是SLAM建立完成的静态地图。

  • Obstacle Map Layer:障碍地图层,用于动态的记录传感器感知到的障碍物信息。

  • Inflation Layer:膨胀层,在以上两层地图上进行膨胀(向外扩张),以避免机器人的撞上障碍物。

  • Other Layers:你还可以通过插件的形式自己实现costmap,目前已有Social Costmap Layer、Range Sensor Layer等开源插件。


0x01 创建stdr_move_base软件包

你可能会纳闷,为什么讲costmap会提到move_base这个软件包呢?这是因为move_base软件包是ROS中自动导航的核心软件包,我们可以查看下面这张图大家就会对此软件包有深刻认识了:

根据move_base的内部逻辑流程图得知,在进行路径规划时costmap是必不可少的。因此我们需要首先创建个stdr_move_base软件包,然后配置costmap相关的参数,这样move_base软件包内的路径规划器才能找到一条合适的路径控制机器人移动到达指定的目的地。

创建好软件包后,接下来就可以来编写launch文件了,命名为stdr_move_base.launch,该launch文件内容如下:

<!--
  FileName: stdr_move_base.launch
  Copyright: 2016-2018 ROS小课堂 www.corvin.cn
  Author: corvin
  Description:
    启动move_base节点,加载各个配置文件。
  History:
    20180528: initial this file.
    20180530: add arg param to rename all kinds of frames,topics,add load params file.
-->
<launch>
  <arg name="odom_frame_id"   default="/map_static"/>
  <arg name="base_frame_id"   default="/robot0"/>
  <arg name="global_frame_id" default="/map"/>

  <arg name="odom_topic"      default="/robot0/odom"/>
  <arg name="cmd_vel_topic"   default="/robot0/cmd_vel"/>
  <arg name="map_topic"       default="/amcl/map"/>

  <node pkg="move_base" type="move_base" name="stdr_move_base" output="screen">
    <rosparam file="$(find stdr_move_base)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find stdr_move_base)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find stdr_move_base)/config/local_costmap_params.yaml"  command="load" />
    <rosparam file="$(find stdr_move_base)/config/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find stdr_move_base)/config/dwa_local_planner_params.yaml"    command="load" />
    <rosparam file="$(find stdr_move_base)/config/move_base_params.yaml"            command="load" />
    <rosparam file="$(find stdr_move_base)/config/global_planner_params.yaml"       command="load" />
   
   <param name="global_costmap/global_frame"     value="$(arg global_frame_id)"/>
   <param name="global_costmap/robot_base_frame" value="$(arg base_frame_id)"/>
   <param name="local_costmap/global_frame"      value="$(arg odom_frame_id)"/>
   <param name="local_costmap/robot_base_frame"  value="$(arg base_frame_id)"/>
   <param name="DWAPlannerROS/global_frame_id"   value="$(arg odom_frame_id)"/>

    <!-- move base default publish cmd to /cmd_vel topic,now remap to /robot0/cmd_vel -->
    <remap from="/cmd_vel" to="$(arg cmd_vel_topic)"/>

    <!-- move_base default subscribe odom topic,now remap to /robot0/odom -->
    <remap from="/odom" to="$(arg odom_topic)"/>

    <!-- move_base default subscribe map topic,now remap to /amcl/map -->
    <remap from="/map" to="$(arg map_topic)"/>
  </node>
</launch>

在启动move_base节点时,可以看到我们首先加载了costmap_common_params.yaml到global_costmap和local_costmap两个命名空间中,因为该配置文件是一个通用的代价地图配置参数,即local_costmap和global_costmap都需要配置的参数。然后下面是local_costmap_params.yaml专门为了局部代价地图配置的参数,global_costmap_params.yaml专门为全局代价地图配置的参数。


0x02 配置costmap_common_params.yaml

在config目录下,创建costmap_common_params.yaml文件,配置的参数如下:

#FileName: costmap_common_params.yaml
#Copyright: 2016-2018 ROS小课堂 www.corvin.cn
#Author: corvin
#Description:
# 代价地图通用参数配置文件,就是全局代价地图和局部代价地图
# 共同都需要配置的参数,各参数意义如下:
# robot_radius: 机器人的半径
#
#History:
# 20180613: initial this file.

robot_radius: 0.2

obstacle_layer:
  enabled: true
  combination_method: 1
  track_unknown_space: true
  obstacle_range: 2.5
  raytrace_range: 3.0
  observation_sources: laser_scan_sensor
  laser_scan_sensor: {
    sensor_frame: /robot0_laser_0,
    data_type: LaserScan,
    topic: /robot0/laser_0,
    marking: true,
    clearing: true
  }

inflation_layer:
  enabled: true
  cost_scaling_factor: 5.0
  inflation_radius: 0.36

static_layer:
  enabled: true

下面来依次解释下各参数的意义,方便大家以后来根据需要来自行修改调试:

  • robot_radius:设置机器人的半径,单位是米。由于在stdr中机器人是圆形的,所以可以直接设置该参数。如果你的机器人不是圆形的那就需要使用footprint这个参数,该参数是一个列表,其中的每一个坐标代表机器人上的一点,设置机器人的中心为[0,0],根据机器人不同的形状,找到机器人各凸出的坐标点即可,具体可参考下图来设置:

  • obstacle_layer:配置障碍物图层

    enabled:是否启用该层

    combination_method:只能设置为0或1,用来更新地图上的代价值,一般设置为1;

    track_unknown_space:如果设置为false,那么地图上代价值就只分为致命碰撞和自由区域两种,如果设置为true,那么就分为致命碰撞,自由区域和未知区域三种。意思是说假如该参数设置为true的话,就意味着地图上的未知区域也会被认为是可以自由移动的区域,这样在进行全局路径规划时,可以把一些未探索的未知区域也来参与到路径规划,如果你需要这样的话就将该参数设置为false。不过一般情况未探索的区域不应该当作可以自由移动的区域,因此一般将该参数设置为true;

    obstacle_range:设置机器人检测障碍物的最大范围,意思是说超过该范围的障碍物,并不进行检测,只有靠近到该范围内才把该障碍物当作影响路径规划和移动的障碍物;

    raytrace_range:在机器人移动过程中,实时清除代价地图上的障碍物的最大范围,更新可自由移动的空间数据。假如设置该值为3米,那么就意味着在3米内的障碍物,本来开始时是有的,但是本次检测却没有了,那么就需要在代价地图上来更新,将旧障碍物的空间标记为可以自由移动的空间。

    observation_sources:设置导航中所使用的传感器,这里可以用逗号形式来区分开很多个传感器,例如激光雷达,碰撞传感器,超声波传感器等,我们这里只设置了激光雷达;

    laser_scan_sensor:添加的激光雷达传感器

    sensor_frame:激光雷达传感器的坐标系名称;

    data_type:激光雷达数据类型;

    topic:该激光雷达发布的话题名;

    marking:是否可以使用该传感器来标记障碍物;

    clearing:是否可以使用该传感器来清除障碍物标记为自由空间;

  • inflation_layer:膨胀层,用于在障碍物外标记一层危险区域,在路径规划时需要避开该危险区域

    enabled:是否启用该层;

    cost_scaling_factor:膨胀过程中应用到代价值的比例因子,代价地图中到实际障碍物距离在内切圆半径到膨胀半径之间的所有cell可以使用如下公式来计算膨胀代价:exp(-1.0 * cost_scaling_factor * (distance_from_obstacle – inscribed_radius)) * (costmap_2d::INSCRIBED_INFLATED_OBSTACLE – 1),公式中costmap_2d::INSCRIBED_INFLATED_OBSTACLE目前指定为254,注意: 由于在公式中cost_scaling_factor被乘了一个负数,所以增大比例因子反而会降低代价

    inflation_radius:膨胀半径,膨胀层会把障碍物代价膨胀直到该半径为止,一般将该值设置为机器人底盘的直径大小。如果机器人经常撞到障碍物就需要增大该值,若经常无法通过狭窄地方就减小该值。

  • Static_layer:静态地图层,即SLAM中构建的地图层

    enabled:是否启用该地图层;

通过下图来认识下为何要设置膨胀层以及意义:


0x03 配置global_costmap_params.yaml

全局代价地图是作为进行全局路径规划时的参考,我们需要在config目录中,创建global_costmap_params.yaml文件,该文件是为全局代价地图配置的参数,具体配置的参数如下:

#FileName: global_costmap_params.yaml
#Copyright: 2016-2018 ROS小课堂 www.corvin.cn
#Author: corvin
#Description:
#  全局代价地图参数配置文件,各参数的意义如下:
#  global_frame:在全局代价地图中的全局坐标系;
#  robot_base_frame:机器人的基坐标系;
#
#History:
#  20180613: initial this file.
global_costmap:
  global_frame: /map
  robot_base_frame: /robot0
  update_frequency: 0.5
  static_map: true
  rolling_window: false
  transform_tolerance: 1.0
  plugins:
    - {name: static_layer,    type: "costmap_2d::StaticLayer"}
    - {name: obstacle_layer,  type: "costmap_2d::ObstacleLayer"}
    - {name: inflation_layer, type: "costmap_2d::InflationLayer"}

下面我们来详细解释下该全局代价地图配置文件中各参数的意义:

  • global_frame:全局代价地图需要在哪个坐标系下运行;

  • robot_base_frame:在全局代价地图中机器人本体的基坐标系,就是机器人上的根坐标系。通过global_frame和robot_base_frame就可以计算两个坐标系之间的变换,得知机器人在全局坐标系中的坐标了。

  • update_frequency:全局代价地图更新频率,一般全局代价地图更新频率设置的比较小;

  • static_map:配置是否使用map_server提供的地图来初始化,一般全局地图都是静态的,需要设置为true;

  • rolling_window:是否在机器人移动过程中需要滚动窗口,始终保持机器人在当前窗口中心位置;

  • transform_tolerance:坐标系间的转换可以忍受的最大延时;

  • plugins:在global_costmap中使用下面三个插件来融合三个不同图层,分别是static_layer、obstacle_layer和inflation_layer,合成一个master_layer来进行全局路径规划。


0x04 配置local_costmap_params.yaml

局部代价地图配置参数所建立的地图主要是为局部路径规划所使用,我们可以在config目录下,创建local_costmap_params.yaml文件,完整内容如下:

#FileName: local_costmap_params.yaml
#Copyright: 2016-2018 ROS小课堂 www.corvin.cn
#Author: corvin
#Description:
#  本地代价地图需要配置的参数,各参数意义如下:
#  global_frame:在本地代价地图中的全局坐标系;
#  robot_base_frame:机器人本体的基坐标系;
#
#History:
#  20180613: initial this file.

local_costmap:
  global_frame: /map_static
  robot_base_frame: /robot0
  update_frequency: 5.0
  publish_frequency: 3.0
  static_map: false
  rolling_window: true
  width: 4.0
  height: 4.0
  resolution: 0.05
  transform_tolerance: 0.5
  plugins:
    - {name: obstacle_layer,  type: "costmap_2d::ObstacleLayer"}
    - {name: inflation_layer, type: "costmap_2d::InflationLayer"}
下面来详细解释下每个参数的意义:
  • global_frame:在局部代价地图中的全局坐标系,一般需要设置为odom_frame,但是由于stdr没有这个坐标系,我就拿/map_static来代替了;

  • robot_base_frame:机器人本体的基坐标系;

  • update_frequency:局部代价地图的更新频率;

  • publish_frequency:局部代价地图的发布频率;

  • static_map:局部代价地图一般不设置为静态地图,因为需要检测是否在机器人附近有新增的动态障碍物;

  • rolling_window:使用滚动窗口,始终保持机器人在当前局部地图的中心位置;

  • width:滚动窗口的宽度,单位是米;

  • height:滚动窗口的高度,单位是米;

resolution:地图的分辨率,该分辨率可以从加载的地图相对应的配置文件中获取到;

  • transform_tolerance:局部代价地图中的坐标系之间转换的最大可忍受延时;

  • plugins:在局部代价地图中,不需要静态地图层,因为我们使用滚动窗口来不断的扫描障碍物,所以就需要融合两层地图(inflation_layer和obstacle_layer)即可,融合后的地图用于进行局部路径规划;


0x05 在RViz中查看global_costmap和local_costmap

我们介绍了半天global_costmap和local_costmap的意义及参数如何设置,但是大家应该还是对它们没有一个直观的感受和认识,我们这里就通过在Rviz中来看看这两种代价地图,如下图所示:


0x06 Bibliography

[1] costmap_2d的ROS Wiki主页. http://wiki.ros.org/costmap_2d/

[2] move_base软件包的ROS Wiki主页. http://wiki.ros.org/move_base

[3] 机器人操作系统入门中关于costmap的介绍. https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/chapter10/10.3.html

[4] costmap_2d软件包学习笔记. https://blog.youkuaiyun.com/sonictl/article/details/51518492

[5] costmap_2d之inflation层简介. https://blog.youkuaiyun.com/x_r_su/article/details/53420209

参考文章

[1]在STDR中学习costmap代价地图 http://www.corvin.cn/829.html

 

 

 

 

 

 

 

 

 

 

 

 

shr@ubuntu:~$ sudo apt install ros-noetic-navigation 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 将会同安装下列软件: ros-noetic-amcl ros-noetic-base-local-planner ros-noetic-carrot-planner ros-noetic-clear-costmap-recovery ros-noetic-costmap-2d ros-noetic-dwa-local-planner ros-noetic-fake-localization ros-noetic-global-planner ros-noetic-move-base ros-noetic-move-base-msgs ros-noetic-move-slow-and-clear ros-noetic-nav-core ros-noetic-navfn ros-noetic-rotate-recovery ros-noetic-voxel-grid 下列【新】软件包将被安装: ros-noetic-amcl ros-noetic-base-local-planner ros-noetic-carrot-planner ros-noetic-clear-costmap-recovery ros-noetic-costmap-2d ros-noetic-dwa-local-planner ros-noetic-fake-localization ros-noetic-global-planner ros-noetic-move-base ros-noetic-move-base-msgs ros-noetic-move-slow-and-clear ros-noetic-nav-core ros-noetic-navfn ros-noetic-navigation ros-noetic-rotate-recovery ros-noetic-voxel-grid 升级了 0 个软件包,新安装了 16 个软件包,要卸载 0 个软件包,有 64 个软件包未被升级。 需要下载 1,931 kB 的归档。 解压缩后会消耗 9,841 kB 的额外空间。 您希望继续执行吗? [Y/n] y 获取:1 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-amcl amd64 1.17.3-1focal.20250521.001518 [268 kB] 获取:2 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-voxel-grid amd64 1.17.3-1focal.20250519.231756 [16.7 kB] 获取:3 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-costmap-2d amd64 1.17.3-1focal.20250521.001646 [449 kB] 获取:4 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-nav-core amd64 1.17.3-1focal.20250521.004844 [8,784 B] 获取:5 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-base-local-planner amd64 1.17.3-1focal.20250521.005206 [243 kB] 获取:6 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-carrot-planner amd64 1.17.3-1focal.20250521.010103 [35.6 kB] 获取:7 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-clear-costmap-recovery amd64 1.17.3-1focal.20250521.005210 [42.4 kB] 获取:8 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-dwa-local-planner amd64 1.17.3-1focal.20250521.005823 [123 kB] 获取:9 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-fake-localization amd64 1.17.3-1focal.20250520.001758 [104 kB] 获取:10 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-navfn amd64 1.17.3-1focal.20250521.005304 [122 kB] 获取:11 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-global-planner amd64 1.17.3-1focal.20250521.005728 [145 kB] 获取:12 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-move-base-msgs amd64 1.14.2-1focal.20250516.000952 [32.9 kB] 获取:13 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-rotate-recovery amd64 1.17.3-1focal.20250521.010109 [39.4 kB] 获取:14 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-move-base amd64 1.17.3-1focal.20250521.010519 [249 kB] 获取:15 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-move-slow-and-clear amd64 1.17.3-1focal.20250521.005242 [49.3 kB] 获取:16 http://packages.ros.org/ros/ubuntu focal/main amd64 ros-noetic-navigation amd64 1.17.3-1focal.20250521.011054 [3,064 B] 已下载 1,931 kB,耗 50秒 (38.6 kB/s) 正在选中未选择的软件包 ros-noetic-amcl。 (正在读取数据库 ... 系统当前共安装有 250290 个文件和目录。) 准备解压 .../00-ros-noetic-amcl_1.17.3-1focal.20250521.001518_amd64.deb ... 正在解压 ros-noetic-amcl (1.17.3-1focal.20250521.001518) ... 正在选中未选择的软件包 ros-noetic-voxel-grid。 准备解压 .../01-ros-noetic-voxel-grid_1.17.3-1focal.20250519.231756_amd64.deb . .. 正在解压 ros-noetic-voxel-grid (1.17.3-1focal.20250519.231756) ... 正在选中未选择的软件包 ros-noetic-costmap-2d。 准备解压 .../02-ros-noetic-costmap-2d_1.17.3-1focal.20250521.001646_amd64.deb . .. 正在解压 ros-noetic-costmap-2d (1.17.3-1focal.20250521.001646) ... 正在选中未选择的软件包 ros-noetic-nav-core。 准备解压 .../03-ros-noetic-nav-core_1.17.3-1focal.20250521.004844_amd64.deb ... 正在解压 ros-noetic-nav-core (1.17.3-1focal.20250521.004844) ... 正在选中未选择的软件包 ros-noetic-base-local-planner。 准备解压 .../04-ros-noetic-base-local-planner_1.17.3-1focal.20250521.005206_amd6 4.deb ... 正在解压 ros-noetic-base-local-planner (1.17.3-1focal.20250521.005206) ... 正在选中未选择的软件包 ros-noetic-carrot-planner。 准备解压 .../05-ros-noetic-carrot-planner_1.17.3-1focal.20250521.010103_amd64.de b ... 正在解压 ros-noetic-carrot-planner (1.17.3-1focal.20250521.010103) ... 正在选中未选择的软件包 ros-noetic-clear-costmap-recovery。 准备解压 .../06-ros-noetic-clear-costmap-recovery_1.17.3-1focal.20250521.005210_ amd64.deb ... 正在解压 ros-noetic-clear-costmap-recovery (1.17.3-1focal.20250521.005210) ... 正在选中未选择的软件包 ros-noetic-dwa-local-planner。 准备解压 .../07-ros-noetic-dwa-local-planner_1.17.3-1focal.20250521.005823_amd64 .deb ... 正在解压 ros-noetic-dwa-local-planner (1.17.3-1focal.20250521.005823) ... 正在选中未选择的软件包 ros-noetic-fake-localization。 准备解压 .../08-ros-noetic-fake-localization_1.17.3-1focal.20250520.001758_amd64 .deb ... 正在解压 ros-noetic-fake-localization (1.17.3-1focal.20250520.001758) ... 正在选中未选择的软件包 ros-noetic-navfn。 准备解压 .../09-ros-noetic-navfn_1.17.3-1focal.20250521.005304_amd64.deb ... 正在解压 ros-noetic-navfn (1.17.3-1focal.20250521.005304) ... 正在选中未选择的软件包 ros-noetic-global-planner。 准备解压 .../10-ros-noetic-global-planner_1.17.3-1focal.20250521.005728_amd64.de b ... 正在解压 ros-noetic-global-planner (1.17.3-1focal.20250521.005728) ... 正在选中未选择的软件包 ros-noetic-move-base-msgs。 准备解压 .../11-ros-noetic-move-base-msgs_1.14.2-1focal.20250516.000952_amd64.de b ... 正在解压 ros-noetic-move-base-msgs (1.14.2-1focal.20250516.000952) ... 正在选中未选择的软件包 ros-noetic-rotate-recovery。 准备解压 .../12-ros-noetic-rotate-recovery_1.17.3-1focal.20250521.010109_amd64.d eb ... 正在解压 ros-noetic-rotate-recovery (1.17.3-1focal.20250521.010109) ... 正在选中未选择的软件包 ros-noetic-move-base。 准备解压 .../13-ros-noetic-move-base_1.17.3-1focal.20250521.010519_amd64.deb .. . 正在解压 ros-noetic-move-base (1.17.3-1focal.20250521.010519) ... 正在选中未选择的软件包 ros-noetic-move-slow-and-clear。 准备解压 .../14-ros-noetic-move-slow-and-clear_1.17.3-1focal.20250521.005242_amd 64.deb ... 正在解压 ros-noetic-move-slow-and-clear (1.17.3-1focal.20250521.005242) ... 正在选中未选择的软件包 ros-noetic-navigation。 准备解压 .../15-ros-noetic-navigation_1.17.3-1focal.20250521.011054_amd64.deb . .. 正在解压 ros-noetic-navigation (1.17.3-1focal.20250521.011054) ... 正在设置 ros-noetic-amcl (1.17.3-1focal.20250521.001518) ... 正在设置 ros-noetic-voxel-grid (1.17.3-1focal.20250519.231756) ... 正在设置 ros-noetic-move-base-msgs (1.14.2-1focal.20250516.000952) ... 正在设置 ros-noetic-costmap-2d (1.17.3-1focal.20250521.001646) ... 正在设置 ros-noetic-fake-localization (1.17.3-1focal.20250520.001758) ... 正在设置 ros-noetic-nav-core (1.17.3-1focal.20250521.004844) ... 正在设置 ros-noetic-clear-costmap-recovery (1.17.3-1focal.20250521.005210) ... 正在设置 ros-noetic-move-slow-and-clear (1.17.3-1focal.20250521.005242) ... 正在设置 ros-noetic-rotate-recovery (1.17.3-1focal.20250521.010109) ... 正在设置 ros-noetic-navfn (1.17.3-1focal.20250521.005304) ... 正在设置 ros-noetic-base-local-planner (1.17.3-1focal.20250521.005206) ... 正在设置 ros-noetic-carrot-planner (1.17.3-1focal.20250521.010103) ... 正在设置 ros-noetic-move-base (1.17.3-1focal.20250521.010519) ... 正在设置 ros-noetic-global-planner (1.17.3-1focal.20250521.005728) ... 正在设置 ros-noetic-dwa-local-planner (1.17.3-1focal.20250521.005823) ... 正在设置 ros-noetic-navigation (1.17.3-1focal.20250521.011054) ... shr@ubuntu:~$ rospack find gmapping /opt/ros/noetic/share/gmapping shr@ubuntu:~$ rospack find map_server /opt/ros/noetic/share/map_server shr@ubuntu:~$ rospack find navigation [rospack] Error: package 'navigation' not found shr@ubuntu:~$ rospack find navigation [rospack] Error: package 'navigation' not found shr@ubuntu:~$
07-29
### 三级标题:ROS Noetic 中 navigation 包安装后无法通过 `rospack find navigation` 找到的可能原因及解决方法 在安装 ROS Noetic 的 `navigation` 包后,若无法通过 `rospack find navigation` 命令找到该包,通常与环境变量配置、包路径未正确加载或安装方式有关。 1. 确保已正确安装 `ros-noetic-navigation` 包: ```bash sudo apt-get install ros-noetic-navigation ``` 若安装过程中出现依赖问题,可参考相关提示安装缺失的依赖项,例如 `ros-noetic-map-server`、`ros-noetic-tf2-geometry-msgs` 等 [^2]。 2. 安装完成后,检查 ROS_PACKAGE_PATH 环境变量是否包含 `/opt/ros/noetic/share`,该路径通常包含系统级安装的 ROS 包: ```bash echo $ROS_PACKAGE_PATH ``` 若未设置,可手动添加: ```bash export ROS_PACKAGE_PATH=/opt/ros/noetic/share:$ROS_PACKAGE_PATH ``` 3. 若使用源码安装方式,需确保 `navigation` 包位于工作空间的 `src` 目录中,并完成编译: ```bash cd ~/catkin_ws catkin_make source devel/setup.bash ``` 编译成功后,`rospack find navigation` 应能正确识别该包 [^2]。 4. 若系统提示 `package 'navigation' not found`,可尝试更新 ROS 的包缓存: ```bash rospack profile ``` 该命令会刷新 ROS 的包索引,有助于识别新安装或移动的包 [^2]。 5. 若安装过程中遇到依赖冲突,如 `ros-noetic-libg2o` 无法安装,可能由于 `libsuitesparse-dev` 依赖问题导致。此可尝试手动安装缺失依赖,或使用 `aptitude` 工具进行智能依赖解析 [^3]。 6. 检查是否因 ROS 环境未正确初始化导致的问题。每次新开终端,需确保已加载 ROS 环境变量: ```bash source /opt/ros/noetic/setup.bash ``` 若使用自定义工作空间,还需加载其环境变量: ```bash source ~/catkin_ws/devel/setup.bash ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值