ROS Navigation包的理解

分三大块来理解,costmap,globalplanner,baselocalplanner

1.costMap

在costmap这一模块上面,首先就提出了分层
如果是一整张图,那么我们对图的任何修改都会在它上面完成。实际上当信息量太多的时候,很有可能我们并不想总是一次性更新所有的图。具体论文Lu, Hershberger, Smart - 2014 - Layered costmaps for context-sensitive navigation
如果是普通来讲,大致是分为static layer,inflation layer obstacle layer

1.1 static layer

名字上叫做静态层。其实对这一层的理解上,可以叫做initial layer, 这一层所包含的信息,也就是costmap初始化的时候所包含的信息。

1.2inflation layer

可以想象一下,我们的机器人肯定是有一定体积的,也就是说,在空间中运动的时候我们并不能把它看做是一个点。那么它怎么避免去与障碍物相撞呢。这一层就是实现一个反向思考的办法,将障碍物全部膨胀,那么之后我们就可以把有一定体积的机器人看做是一个点的运动了
下图是对costmap代价值的一个解释,下面红色框的是一个五边形的移动小车。那么把所有的障碍物都膨胀它的外切半径(circumscribed radius)那么大,就可以保证小车不会与障碍物相撞了。
ROS Navigation包的理解_第1张图片
整个代价地图中,我们都会给每一个格子分配一个值,取值为下列几个
255 代表 未知区域
254 代表 障碍物
253 代表 小车会和障碍物冲突
128 代表 小车可能会冲突也可能不会,根据朝向决定
0 – 128 代表 不冲突

1.3 obstacle layer

用标记清除的办法,更新障碍物的实时位置


2.globalplanner

这里要明确一点的是,全局规划器globalplanner计算起点终点路径,局部规划器localplanner根据之前生成的路径,计算移动机器人的运动速度。
navigation包里面globalplanner用了dijkstra和A*两种算法,任选一种都可以。这一点ros wiki上面可以看到他们的具体差别。
另外还有一些其他的算法可以使用的,包括D*算法,在网上可以找到其他人的实现。
这里还有一个点直接注意的是,在navigation包里面move_base的实现里面,是添加了动态规划的,也就是在小车的移动过程中,globalplanner也是有个线程一直在计算当前位置到终点的路径。在这里是我觉得奇怪的地方,本来就有D*这样的算法可以实现动态规划,可是navigation并没有采用这种方法,而且启动了一个线程,在移动过程中对路径不断的进行重新规划。不过这种方法有个优点,在不妨碍原有实现上(也就是dijkstra和A* 寻路上) 添加了动态规划

3.localplanner

提供了两种实现,trajectorylocalplanner和DWAlocalplanner
对于全向机器人来说,也就是存在x方向的速度,y方向的速度,和角速度。DWA确实效率高一点。但是如果是非全向机器人,比如说只存在角速度和线速度。trajectorylocalplanner会更适用一点。

最后
用一些仿真的方法把navigation包跑起来也很重要。我比较推荐的是2D的stage这个模拟。github 这个目录下面的navigation_stage是可以直接跑起来的。比起其他一些办法,这个算是很快捷的了。

你可能感兴趣的:(机器人,ROS,globalplanner,localplanner)