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

Navigation 如何将具有多个值的非二进制占用率网格映射到ROS中的成本映射?,navigation,ros,Navigation,Ros,我正在寻找一种将非二进制占用率网格映射到全局成本图的方法。占用栅格的值为-1表示未定义,0表示未碰撞,1-100表示碰撞区域。这里有一个类似的问题,给出的答案并没有提供具体的解决方案: 要获得更好的概述: 我用的是罗斯旋律 我的入住率网格如下所示: 我的global_costmap_params.yaml如下所示: global_costmap: plugins: - {name: static_layer, type: "costmap_2d::StaticLayer"} - {name

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

要获得更好的概述:

我用的是罗斯旋律

我的入住率网格如下所示:

我的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
请注意,我是costmaps的纯粹初学者,所以这可能根本没有意义

使用给定的全局_costmap_params.yaml可提供以下costmap:

如您所见,costmap“忽略”碰撞区域,并以与非碰撞路径区域相同的成本对其进行映射。是否有任何方法修改costmap_参数,以便正确映射占用率网格


提前谢谢

更具体地说,我会查看插件的costmap参数,主要是和插件。也许您希望
staticmap
参数
trinary\u costmap
为true,以获得costmap中值的完整比例。
障碍物中的障碍物
可能会改变您期望看到的内容,具有多个图层或输入数据

我还想看一下Clearpath的Husky包,以获得一个很好的示例,例如.file。所有参数都写入
config/
dir,并由
rosparam
move_base
节点中加载。一些细节:如果你正在做一个随机器人移动的局部成本图,你不想跟踪空白区域,你需要一个滚动窗口,并且使用障碍层而不是静态层;对于全局,您将跟踪所有空间,但不相对于机器人移动窗口,并且您将使用静态地图

我认为您遇到的一个问题是数据流。Ros(因为它,大多数人)的倾向是从一开始就为
amcl
move\u base
加载一个初始/静态地图(
map\u server
),并使用
LaserScan
s和/或
PointCloud
s进行更新,然后只剩下帧tfs和局部位置估计的
amcl
输出,并将其输入到
move\u base
节点,您只需要
目标
。例如,要使用occ网格图消息更新
amcl
,您必须更改
use\u map\u主题
参数

编辑: 如果这是您真正需要的,下面是我从husky_nav中提取的一个示例用法:


结果表明,该插件不知何故无法从global_costmap_params.yaml中读取给定的参数(关于原因可能是什么或如何修复的想法?)

我通过将导航repo克隆到我的catkin_ws/src文件夹(而不是通过sudo-apt-get-install-ros-melodic-navigation安装导航)解决了这个问题和三元costmap-costmap\u 2d/plugins/static\u layer.cpp内部参数的默认值更改为'false'

它现在能够正确地映射占用率网格的所有中间值

编辑:

我发现这是由于名称空间的问题。由于trinary_costmap是静态_layer-plugin的插件内部参数,因此似乎必须显式指定名称空间

因此,在global_costmap_params.yaml中设置参数如下:


/move\u base/global\u costmap/static\u layer/trinary\u costmap:false

我可能读错了,但看起来有点正确。costmap和Occupation_grid都使用uint_8值(0-255)的单元格,但其中1-127表示“无冲突”。我会查看墙壁的实际值,其中激光雷达在occ_网格中标记障碍物,然后查看costmap中的数值。您的两个插件意味着使用occ_网格,并“分散”这些值,对附近的遍历进行负权重。如果您实际上没有看到任何东西(范围的末尾),val可能会设置得很低。但是占用率网格不是只取-1到100之间的值吗?(根据)哦,是的,我的错。我在心理上认为两者都是有效的百分比,occ_网格实际上是一个百分比,因为它们用一点来表示未知。但这不应该改变问题。你有没有检查过翻译的数字是否相等?如果指定了机器人多边形,则对occ_网格的高更新(例如100)应导致该点的高costmap值。如果还没有的话,你可能还想看。我通过玩静态地图的致命成本阈值参数来检查它。它的默认值是100,当我将该值设置为50时,地图的一半是黑色的,这是有意义的,因为在我的占用网格中,障碍物面积值随着距离原点的增加而从100减少到0。我尝试将trinary_costmap-param切换为建议的false(其默认值为true),根据它的描述,这应该完全满足我的需要(如果为false,则可以使用一系列中间值),但不知何故它仍然不起作用。我想,我还是遗漏了一些东西。我刚刚查看了husky_导航,但看起来只有所用图层的默认值。我知道全球地图实际上不应该和机器人一起移动。在我们的应用程序中,这是因为我们没有固定的移动区域。因此,我们使用从照相机接收到的图像来检测我们的环境,并看到我们面前的路径,然后假装是我们的全球地图。我将在另一个线程中解决另一个问题。正如我已经提到的,将三元成本映射更改为false(因为true是默认值,意味着只考虑3个值,即无信息、自由空间和致命障碍)似乎是错误的