如何将具有多个值的非二进制占用网格映射到 ROS 中的成本图?

How do I map a non-binary Occupancy Grid with several values to a cost map in ROS?

我正在寻找一种将非二进制占用网格映射到全局成本地图的方法。占用网格的值 -1 表示未定义,0 表示非碰撞,1-100 表示碰撞区域。这里有一个类似的问题,给定的答案没有提供具体的解决方案:

https://answers.ros.org/question/335530/what-range-of-costs-does-ros-navigation-support/

为了更好地了解:

我正在使用 ROS Melodic。

我的占用网格如下所示: Image of Occupancy grid

我的 global_costmap_params.yaml 看起来像这样:

global_costmap:
plugins: 
- {name: static_layer, type: "costmap_2d::StaticLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
global_frame: base_link
map_topic: "prediction_occ_grid"
update_frequency: 10.0
publish_frequency: 10.0
rolling_window: true
always_send_full_costmap: true
height: 26.9
width: 36.4

请注意,我是成本地图的初学者,所以这可能根本没有意义!

使用给定的 global_costmap_params.yaml 提供以下成本图:Image of the resulting global costmap

如您所见,成本图 "ignores" 碰撞区域并以与非碰撞路径区域相同的成本映射它们。有什么方法可以修改 costmap_params 以使其正确映射占用网格?

提前致谢!

最具体地说,我会查看插件的成本图参数,主要是 static_map and obstacles 插件。也许您希望 staticmap 参数 trinary_costmap 为真,以便在成本图中具有完整的值。 obstacles 中的那些可能会改变您期望看到的内容,包括多层或输入数据。

我还会查看 Clearpath 的 Husky husky_navigation package for a good example, ex. move_base.launch 文件。所有参数都写在 config/ 目录中,并由 rosparammove_base 节点中加载。一些细节:如果你正在做一个与机器人一起移动的本地代价地图,你不想跟踪空 space,你想要一个滚动 window,并使用障碍层而不是静态层;对于全局,您将跟踪所有 space,但不会相对于机器人移动 window,并且您将使用静态地图。

我认为您遇到的问题之一是数据流。 Ros(和大多数人,因为它)如何倾斜是从一开始就为 amclmove_base 加载一个 initial/static 地图 (map_server),更新两者LaserScans 和/或 PointClouds,然后你只剩下帧 tfs 和局部位置估计的 amcl 输出,并将其输入 move_base节点,你只需要goal。例如,要使用 occ_grid 地图消息更新 amcl,您必须更改 use_map_topic 参数。

编辑: 如果 map_server was what you really needed, here's an example usage I pulled from husky_nav's amcl_demo.launch:

<!-- Run the map server -->
<arg name="map_file" default="$(find husky_navigation)/maps/playpen_map.yaml"/>
<node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" />

原来插件无法从 global_costmap_params.yaml 中读取给定的参数(关于可能是什么原因或如何解决这个问题的任何想法?)。

我通过将 navigation-repo 克隆到我的 catkin_ws/src 文件夹(而不是通过 sudo apt-get install ros-melodic-navigation 安装导航)和 更改默认- costmap_2d/plugins/static_layer.cpptrinary_costmap 参数的值'false'.

现在可以正确映射占用网格的所有中间值。

编辑:

我发现这是由于命名空间问题造成的。由于 trinary_costmap 是 static_layer-plugin 的插件内部参数,看来必须明确指定名称空间。

因此,在 global_costmap_params.yaml 中设置参数是这样的:

/move_base/global_costmap/static_layer/trinary_costmap: 假