如何将具有多个值的非二进制占用网格映射到 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/
目录中,并由 rosparam
在 move_base
节点中加载。一些细节:如果你正在做一个与机器人一起移动的本地代价地图,你不想跟踪空 space,你想要一个滚动 window,并使用障碍层而不是静态层;对于全局,您将跟踪所有 space,但不会相对于机器人移动 window,并且您将使用静态地图。
我认为您遇到的问题之一是数据流。 Ros(和大多数人,因为它)如何倾斜是从一开始就为 amcl
和 move_base
加载一个 initial/static 地图 (map_server
),更新两者LaserScan
s 和/或 PointCloud
s,然后你只剩下帧 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.cpp 中 trinary_costmap 参数的值 到 'false'.
现在可以正确映射占用网格的所有中间值。
编辑:
我发现这是由于命名空间问题造成的。由于 trinary_costmap 是 static_layer-plugin 的插件内部参数,看来必须明确指定名称空间。
因此,在 global_costmap_params.yaml 中设置参数是这样的:
/move_base/global_costmap/static_layer/trinary_costmap: 假
我正在寻找一种将非二进制占用网格映射到全局成本地图的方法。占用网格的值 -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/
目录中,并由 rosparam
在 move_base
节点中加载。一些细节:如果你正在做一个与机器人一起移动的本地代价地图,你不想跟踪空 space,你想要一个滚动 window,并使用障碍层而不是静态层;对于全局,您将跟踪所有 space,但不会相对于机器人移动 window,并且您将使用静态地图。
我认为您遇到的问题之一是数据流。 Ros(和大多数人,因为它)如何倾斜是从一开始就为 amcl
和 move_base
加载一个 initial/static 地图 (map_server
),更新两者LaserScan
s 和/或 PointCloud
s,然后你只剩下帧 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.cpp 中 trinary_costmap 参数的值 到 'false'.
现在可以正确映射占用网格的所有中间值。
编辑:
我发现这是由于命名空间问题造成的。由于 trinary_costmap 是 static_layer-plugin 的插件内部参数,看来必须明确指定名称空间。
因此,在 global_costmap_params.yaml 中设置参数是这样的:
/move_base/global_costmap/static_layer/trinary_costmap: 假