costmap配置教程和详细理解
此软件包提供2D成本图的实现,该实现从世界各地接收传感器数据,构建数据的2D或3D占用网格(取决于是否使用基于体素的实现),并基于占用网格和用户指定的膨胀半径在2D成本图中膨胀成本。 此软件包还支持基于map_server的成本图初始化、基于滚动窗口的成本图以及传感器主题的基于参数的订阅和配置。
在上图中,红色单元格表示成本图中的障碍物,蓝色单元格表示机器人内切半径膨胀的障碍物,红色多边形表示机器人的足迹。 为了使机器人避免碰撞,机器人的足迹不能与红细胞相交,机器人的中心点不能越过蓝细胞。
在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
这些讲完costmap的配置你就已经没什么问题了
上一篇: python3-豆瓣电影数据爬取
下一篇: 面向对象 8-2
推荐阅读
-
CorePlex的安装、配置和使用图文教程
-
JDK1.6的下载、安装与配置图文详细教程 推荐
-
百度编辑器ueditor(v1.3.6)net环境中详细配置教程附bug解决方法
-
Win10下免安装版MySQL8.0.16的安装和配置教程图解
-
java环境变量怎么配置(java安装教程详细)
-
windows版本下mysql的安装启动和基础配置图文教程详解
-
飞鸽传书如何在win7/win8上通过媒体流共享图片和音乐视频的详细教程
-
MySql 5.7.17 winx64的安装配置详细教程
-
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
-
做淘宝直播怎么赚钱(附详细教程和方法)