在Costmap_2d里面插入Prohibition_layer(禁止区域层)

Posted dxmcu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Costmap_2d里面插入Prohibition_layer(禁止区域层)相关的知识,希望对你有一定的参考价值。

在Costmap_2d里面插入Prohibition_layer(禁止区域层)
简介
costmap_2d在navigaition里面是一个很重要的板块,通常默认的是三层地图(静态/障碍/膨胀层)叠加在一起,构成整个完整的代价地图,但是我们也可以插入一些自定义的图层,然后实现自己定制化的功能,基础的教程大家可以参考costmap_2d中插入自定义层。本文的主要目的是来告诉大家如何在代价地图中插入Prohibition_layer(禁止层),然后在已经建好的地图中设立禁止通行区域,关于prohibition_layer具体的作用大家可以参照roswiki上的解释。

具体实现步骤
1 代码下载与编译
  之前我们学习插入simple_layer的时候是在自己的工作空间(catkin_ws)中建立一个pakage,然后再去自己创建.cpp文件和.h头文件,再去改cmakelist,添加.xml文件,在这个教程中我们不需要这么麻烦,我们可以直接在github上把prohibition_layer的包下载下来(源码下载地址戳这里).,解压后放在自己的工作空间中的 src 文件夹里面,然后在终端输入:

$ cd catkin_ws("catkin_ws"替换成你的工作空间名称)
$ catkin_make

编译完成以后在终端中输入:

rospack plugins --attrib=plugin costmap_2d

当你发现终端中输出:


这就表明prohibition_layer已经是一个可供使用的地图插件了. 

2 在代价地图中插入prohibition_layer
  完成步骤1后说明prohibition_layer已经可以供costmap使用了,现在我们要做的就是把prohibition_layer插入到costmap中去.
  我们在自己的代价地图参数配置文件夹中找到 global_costmap_params.yaml 和 local_costmap_params.yaml ,打开这两个文档,分别在两个文档的末尾做修改,修改后应该是下面的内容:

 plugins:
      - {name: static_map,       type: "costmap_2d::StaticLayer"}
      - {name: obstacles,        type: "costmap_2d::VoxelLayer"}
      - {name: costmap_prohibition_layer,        type: "costmap_prohibition_layer_namespace::CostmapProhibitionLayer"}     
      - {name: inflation_layer,        type: "costmap_2d::InflationLayer"}


3 修改launch文件
  完成插入地图后我们还需要修改自己的launch文件,我是在自己的move_base.launch 中插入的,这个大家根据自己的需求,你用的carlike就修改carlike的launch文件.打开自己的launch文件中插入如下内容:

<rosparam file="$(find turtlebot3_navigation)/param/prohibition_areas.yaml" command="load" ns="global_costmap/costmap_prohibition_layer" />
<rosparam file="$(find turtlebot3_navigation)/param/prohibition_areas.yaml" command="load" ns="local_costmap/costmap_prohibition_layer" />
1
2
其中的"turtlebot3_navigation"需要根据自己的情况修改,你打开自己的launch文件对照上下文就知道怎么更改了.

4 设置禁止区域坐标参数
  完成以上步骤所有的配置工作就剩下最后一步了,设置禁止区域坐标参数.
  首先需要在参数配置文件夹(就是和 global_costmap_params.yaml 以及 local_costmap_params.yaml 相同位置的文件夹)中创建新的文档,命名为 "prohibition_areas.yaml".
  然后在prohibition_areas.yaml文档中输入:

prohibition_areas:
#定义一个禁止点
 - [17.09, -6.388]
# 定义一个禁止通行的线
 - [[8.33, 2.11],
    [8.26, 5.11]]
# 定义一个禁止通行的区域
 - [[-11.15, -15.614],
    [-12.35, -13.89],
    [-10.05, -12.218]]
 
注意事项:
1 一定要严格按照上述格式来设置坐标,我之前遇到的格式错误导致不能识别禁止区域坐标情形有
  (1):坐标前的短横线没对齐
  (2):定义禁止区域或者禁止线,两坐标之间缺少了逗号
2 你可以同时定义多个禁止点/多个禁止线/多个禁止区域,或者混合定义多个点/线/区域.
3 禁止区域的坐标如何设置就需要你根据自己建的图来测量,这里就不赘述了.

5 结语
完成以上所有内容,你再次打开自己的导航就能够在rviz中看到自己的设置的禁止区域了,这里贴出我之前做的结果:

在这里插入图片描述
这是我在实验室里面建立的地图,图中的红色三角形是我设立的禁止区域,矩形框是我画的四条禁止线,小车现在在矩形框内,当我把导航目标设置在矩形框外的时候,结果显示的是无法规划路线的.

以上是关于在Costmap_2d里面插入Prohibition_layer(禁止区域层)的主要内容,如果未能解决你的问题,请参考以下文章

在Costmap_2d里面插入Prohibition_layer(禁止区域层)

12.3 ROS Costmap2D代价地图源码解读_1

ROS 进阶学习笔记(16):ROS导航1:关于Costmap_2d Package (代价地图包)

ROS Melodic中costmap2D详解

关于ros stage与navigation仿真总结5月16号

Navigationglobal_planner源码解析之planner_core