这个包提供了平面中机器人局部导航时的轨迹和动态窗口。已知在代价地图costmap中的一个路径,控制器给移动平台分布速度命令。这个包提供完整和不完整机器人,任何机器人的足迹可以被表示为一个凸多边形或者圆形,并且使参数修改为ROS参数格式,以便可以在launch文件中进行设置。该包中的ROS参数依附于nav_core包中的BaseLocalPlanner接口。
base_local_planner包提供了控制器,来驱动移动平台在平面中移动。该控制器将路径轨迹连接到机器人上。使用一个地图,规划器给机器人生成一个从起点到目标点的运动轨迹。沿途中,规划器生成,至少是机器人周围局部的价值函数,代表为栅格地图。这个价值函数将通过栅格地图的成本进行编码。规划器的工作是利用这个函数来确定dx,dy,dtheta的速度值来发布给机器人,使其运动。
规划推理和动态窗口算法(DWA)的基本思想如下:
1.离散采样机器人控制空间(dx,dy,dtheta)
2.对于每个采样速度,从机器人当前的状态,进行模拟预测,如果采样速度应用于一段时间内,将会出现什么情况
3.用合并一些特征的度量标准来,从模拟预测中,评价每个轨迹结果,如障碍物接近目标,接近全局路径和速度。丢弃不合适的路径(那些有障碍物碰撞的)
4.挑选得分最高的轨迹,并且发布相关的速度给移动平台。
5.清除和重新开始
在机器人的控制空间如何被采样方面,DWA和轨迹推理是不同的。轨迹推理是已知机器人的速度限制,采样整个模拟仿真时期可以完成的速度。而DWA已知机器人的加速度限制,采样一个模拟仿真步骤可完成的速度。着意味着DWA是更有效的算法,因为采样较小的空间。但是因为轨迹推理有小的加速度限制可能超越DWA,更加优越。然而在实践中,我们发现在我们的实验中,DWA比轨迹推理更加具有可比性,因此推荐用DWA来提高效率。
为了使规划有效得分,地图网格被使用。对于每个控制周期,网格在机器人周围生成(局部代价地图的尺寸),并且全局路径被映射到这个区域。这意味着某些网格地图的将被从距离为0开始标记,距离从0到目标距离。传播方法通过他们的距离0点最近距离的曼哈顿距离,来有效的标记所有其他地图信息。
这个网格地图之后被用到轨迹推理中
当对接近目标进行规划推理时,所考虑的是局部目标,全局路径目标可能经常位于map_grid小区域外边。这意味着在区域内的第一路径点是具有在此区域之外的连续点。该区域的尺寸被move_base所确定。
震荡发生在X,Y,theta维度上,正/负值被连续的选择。为了阻止震荡,当机器人在任何方向移动时,与下一个循环相反的方向被标记为无效,直到机器人已经从所设置标记的位置移动而并且超过一定的距离。
groovy版本ROS包括一个新的dwa_local_planner包的执行。通过大量的代码,此执行试图更加模块化,以使更容易创建自定义局部规划。base_local_planner 代码在许多新的头文件和类上进行了扩展。
局部规划的原则是寻找在每个控制周期中合适的局部规划。为此,会产生大量的可能被执行的规划。对于生成的轨迹,检查它们是否会于障碍物相撞。如果不会,会对比几个规划,选择最好的。
很明显,由于机器人形状(执行器形状)和结构域,这个原则可能在不同的方式被实例化。许多特殊的方法来产生轨迹,并且寻找潜在的规划空间中最合适的一个。
下边的通用局部规划原则的接口和类运行许多实例。可以用 dwa_local_planner作为模板,并且增加自己的成本函数或者轨迹生成来创建局部规划。
这个接口描述生成器,它可以产生有限/无限的轨迹,在每次调用nextTrajectory()返回新的轨迹。
该轨迹采样生成的类可以产生概述中所描述的无论是用轨迹还是DWA原则,生成的规划。
该接口包含最重要的 scoreTrajectory(Trajectory &traj),它进行轨迹规划并且返回值。负值意味着轨迹是无效的。正值的意思是与相应的代价函数相关,分数低的轨迹比分数高的是更加合适的。
每一个代价函数也具有一定的规模。相对于其他的代价函数,它的影响是可以被改变的。
这是一个简单的轨迹搜索,采样TrajectorySampleGenerator和一系列的TrajectoryCostFunction。它将会调用nextTrajectory() ,直到生成器产生轨迹。对于每一个轨迹,它将遍历所有的代价函数,加入他们的正值,或者丢弃负值。
使用代价函数的规模的结果是,轨迹是正值成本函数的最佳加权。
这个成本函数基于感知障碍物来评估轨迹。它或者由于轨迹通过障碍物而返回负值,或者0。
这个成本函数类基于轨迹离全局路径或者接近目标点有多近来评估轨迹。这个尝试利用距离预计算地图有相同距离的路径或者目标点的所有的规划,来优惠计算速度。
在 dwa_local_planner中,代价函数因为不同的目的,被多次实例化。保持轨迹接近于路径,使机器人朝局部目标前进,并且使机器人的前段点指向局部目标。代价函数是一个启发,可以带来坏的结果或者不合适的参数的失败。
如果前边的最后一个开关与下边发生的事情有一定的距离,这个成本函数类帮助减少某些震荡,返回运动方向开关的负值。虽然这可以有效的阻止这些震荡,如果使用不合适的参数,但是有可能阻止良好的解。
考虑到好的激光范围只在机器人的前面,这个成本函数类被设计在PR2相应的机器人上。成本函数更喜欢在前方运动,惩罚在后边,扫射动作。在其他机器人上或者其他领域,这可能是非常不可取的行为。
发布/global_plan,/local_plan,/cost_cloud。接收/odom。
里程计信息给局部规划器当前机器人的速度。速度信息在这个消息中被假设为和在代价地图中robot_base_frame在相同的坐标系下。
base_local_planner::TrajectoryPlannerROS