欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

costmap配置教程和详细理解

程序员文章站 2022-05-28 23:32:23
...

此软件包提供2D成本图的实现,该实现从世界各地接收传感器数据,构建数据的2D或3D占用网格(取决于是否使用基于体素的实现),并基于占用网格和用户指定的膨胀半径在2D成本图中膨胀成本。 此软件包还支持基于map_server的成本图初始化、基于滚动窗口的成本图以及传感器主题的基于参数的订阅和配置。

costmap配置教程和详细理解

在上图中,红色单元格表示成本图中的障碍物,蓝色单元格表示机器人内切半径膨胀的障碍物,红色多边形表示机器人的足迹。 为了使机器人避免碰撞,机器人的足迹不能与红细胞相交,机器人的中心点不能越过蓝细胞。

在Hydro版本后,用于将数据写入成本图的基本方法是完全可配置的。Each bit of functionality exists in a layer.例如,静态地图是一层,障碍物是另一层。默认情况下,障碍层在三个维度上维护信息。(voxel_grid提供了高效3D体素网格的实现。 占用网格可以支持三种状态的单元状态:标记,空闲或未知。 由于底层实现依赖于按位和和或整数运算,因此体素网格每个体素列仅支持16个不同级别。 但是,此限制在网格中产生的射线追踪和单元标记性能可与标准2D结构相比,从而使其与大多数3D结构相比非常快。)

成本图使用静态地图中的传感器数据和信息,costmap_2d::Costmap2DROS对象存储和更新有关世界上障碍物的信息。
使用pluginlib在Costmap2DROS中实例化每个图层,并将其添加到LayeredCostmap中。

标记与清除

成本图通过ROS自动订阅传感器主题,并相应地更新自身。 每个传感器用于标记(将障碍信息插入到成本图中)、清除(从成本图中删除障碍信息)或两者兼而有之。 标记操作只是对数组的索引,用于更改单元格的成本。 然而,对于报告的每个观测,清除操作包括从传感器原点向外通过栅格进行光线追踪。 如果使用三维结构来存储障碍物信息,则每列的障碍物信息在被放入成本图时被投影到二维。

占据 空闲 未知 space

虽然成本图中的每个单元格可以具有255个不同成本值之一。它使用的基础结构只能表示三个。 具体来说,此结构中的每个单元可以是空闲,已占用或未知的。每个状态在投影到成本图中时都会分配一个特殊的成本值,拥有一定数量占用单元格的列被分配为costmap_2d :: LETHAL_OBSTACLE成本,具有一定数量未知单元格的列被分配为costmap_2d :: NO_INFORMATION成本,而其他列为 分配了costmap_2d :: FREE_SPACE成本。这些都可由参数配置。

costmap以update_frequency参数指定的速率执行地图更新周期。

transform_tolerance参数设置这些转换之间允许的最大等待时间。 如果tf树未按此预期速率更新,则导航堆栈将停止机器人。

MAP

初始化costmap_2d :: Costmap2DROS对象的主要方法有两种。 第一种方法是使用用户生成的静态地图为其添加种子(有关构建地图的文档,请参见map_server软件包)。 在这种情况下,初始化成本图以匹配静态图提供的宽度,高度和障碍物信息。 此配置通常与诸如amcl之类的定位系统结合使用,该定位系统使机器人可以在地图框架中注册障碍物,并在其穿越环境时从传感器数据更新其成本图。

初始化costmap_2d :: Costmap2DROS对象的第二种方法是为其设置宽度和高度,并将rolling_window参数设置为true。 当机器人在整个世界范围内移动时,rolling_window参数将其保持在成本图的中心,而当机器人距离给定区域太远时,它会从地图上删除障碍物信息。 这种类型的配置最常用于里程表坐标系中,在该坐标系中,机器人仅关心局部区域内的障碍物。

所以这两种方法就是global costmap 和 local costmap初始化的方法。

ROS API

costmap_2d::Costmap2DROS对象是costmap_2d::Costmap2D对象的包装器,该对象将其功能公开为C++ROS包装器。 它在初始化时指定的ROS命名空间内操作(假设从这里开始命名)。

 tf::TransformListener tf(ros::Duration(10));
 costmap_2d::Costmap2DROS costmap("my_costmap", tf);

如果直接rosrun或roslaunch costmap_2d节点,它将在costmap名称空间中运行。 在这种情况下,以下所有对名称的引用都应替换为costmap。所以要给参数来一个namespace.

更常见的情况是通过启动move_base节点来运行完整的导航堆栈。 这将创建2个成本图,每个成本图都有自己的名称空间:local_costmap和global_costmap。 您可能需要两次设置一些参数,每个成本图一次。

这个才是配置的关键。

这时候就看看怎么配置costmap

costmap 的配置

通过启动move_base节点来运行完整的导航堆栈。 这将创建2个成本图,每个成本图都有自己的名称空间:local_costmap和global_costmap。 您可能需要两次设置一些参数,每个成本图一次

所以要分别对局部和全局的成本地图进行两次配置

讲一下基本的parameter

plugins 插件规范的顺序,每层一个。 每个规范都是带有名称和类型字段的字典。 该名称用于定义插件的参数名称空间。这里解释一下,因为costmap分为好几层,那么这些层的实现都是以插件的形式实现的,那么插件就显得尤为重要。

global_frame 运行costmap的全局框架

robot_base_frame 机器人基本链接的框架的名称。

rolling_window 是否使用成本图的滚动窗口版本。 如果将static_map参数设置为true,则必须将此参数设置为false。就是初始化costmap的两种方式,在global中用static_map, local中用rolling windows

之后的参数可以参考link

layer

一般layer只需要配置三层,其他的层可以自己了解

static map layer

静态地图主要包含来自外部源的不变数据.主要是map_server提供的cartographer建立好的地图

obstacle layer

障碍物和体素层以PointClouds或LaserScans的形式合并了来自传感器的信息。 障碍层沿二维运动,而体素层沿三维运动。costmap会自动订阅传感器主题并相应地进行更新。 每个传感器用于标记(将障碍物信息插入到成本图中),清除(从障碍物图中去除障碍物信息)或两者兼而有之。 对于每个报告的观察,清除操作都会从传感器的原点向外向外穿过网格进行射线跟踪。 使用体素层时,将每列中的障碍物信息放到成本图中时,会向下投影成二维.所以一般二维的obstacle layer使用障碍物层而不是体素层
参数的配置可以看wiki

inflation layer

wiki

这些讲完costmap的配置你就已经没什么问题了

相关标签: navigation ros