动态窗口算法运动计划
大多数机器人都有一套用于运动计划的导航算法,这些算法以不同的频率执行,全局路径规划器(例如A *,〜0.1 Hz),中级路径变形(例如弹性带,〜5Hz)以及碰撞/避障算法(〜20Hz),这是执行器控制之前的最后一步。
对于MAGIC 2010,我们使用了动态窗口方法。
(请注意,ROS导航堆栈提供了相同的算法配置。局部轨迹规划使用三种常用方法:
- 基于势场,其中每个障碍物都具有用于排斥机器人的障碍物“力场”,而目标具有吸引力场。(类似的方法是“矢量场”和虚拟力场)vfH算法。
- 基于动力学,算法在计算解决方案时会考虑机器人动力学。(例如,速度障碍和动态窗口方法)dwa。
- 基于采样,对各种无冲突状态进行采样,然后进行组合。(例如可达性图,概率路线图)。
动态窗口方法是一种基于速度的局部规划器,可为达到目标所需的机器人计算最佳无碰撞(“允许”)速度。它将笛卡尔目标(x,y)转换为移动机器人的速度(v,w)命令。动态窗口指的是将速度采样出来,得到最大最小值,这个最大最小之间形成一个窗口。
有两个主要目标,计算有效的速度空间,然后选择最佳速度。给定机器人在下一个时间片中可以达到的速度(“动态窗口”),并根据该速度可以产生安全的轨迹(即让机器人在碰撞之前停止),从而构建这个窗口。选择最佳速度,并获得最接近目标的航向。
如果我们先看一下代码,则更容易解释。在伪代码中,DWA为:
BEGIN DWA(robotPose,robotGoal,robotModel)
desiredV = calculateV(robotPose,robotGoal)//计算位姿 目标
laserscan = readScanner()//读取传感器参数可以是超声波或者激光
allowable_v = generateWindow(robotV, robotModel)//在动态窗口中产生允许的速度
allowable_w = generateWindow(robotW, robotModel)//在动态窗口中产生允许的角速度
for each v in allowable_v //开始采样 角速度和线速度
for each w in allowable_w
dist = find_dist(v,w,laserscan,robotModel) //当前的v 和w 距离障碍物的距离
breakDist = calculateBreakingDistance(v)
if (dist > breakDist) //can stop in time
heading = hDiff(robotPose,goalPose, v,w) //航向角
clearance = (dist-breakDist)/(dmax - breakDist) //空隙区
cost = costFunction(heading,clearance, abs(desired_v - v)) //评价函数
if (cost > optimal)
best_v = v
best_w = w
optimal = cost
set robot trajectory to best_v, best_w
END
现在来解释一下:
首先,我们可以根据我们当前的位置和目的地来计算目标的理想速度。(例如,我们离目标很远,则走得快;如果我们离目标很近,则走得慢。请使用运动方程式,请参见移动机器人的圆周运动)。
在给定车辆动力学的情况下,选择允许的速度(线性“ v”和角度“ w”),例如,allowable_v范围从当前速度减去机器人最大减速度*时间t到当前速度加上机器人最大加速度*时间t,或更紧凑:[va.t,v + at],同样用于角速度。
搜索所有允许的速度。
对于每个速度,确定建议的机器人速度的最近障碍物(即沿轨迹的碰撞检测)
确定到最近障碍物的距离是否在机器人的折断距离之内。如果机器人无法及时停止,请忽略该建议的机器人速度。
否则,速度是“允许的”,因此我们现在可以计算目标函数所需的值。在我们的情况下,机器人的前进和后退。
计算建议速度的“成本损耗”。如果目前的成本比其他任何都要好,请将其设置为我们的最佳选择。
最后,将机器人所需的轨迹设置为建议的最佳速度。
如果您已经阅读了所有其他文章,那么您现在应该已经足够了解实现自己的移动机器人导航系统的知识,或者至少对ROS导航堆栈中的算法有更多了解。
参考:
首先,我们可以根据我们当前的位置和目的地来计算目标的理想速度。(例如,我们离目标很远,则走得快;如果我们离目标很近,则走得慢。请使用运动方程式,请参见移动机器人的圆周运动)。
在给定车辆动力学的情况下,选择允许的速度(线性“ v”和角度“ w”),例如,allowable_v范围从当前速度减去机器人最大减速度*时间t到当前速度加上机器人最大加速度*时间t,或更紧凑:[va.t,v + at],同样用于角速度。
搜索所有允许的速度。
对于每个速度,确定建议的机器人速度的最近障碍物(即沿轨迹的碰撞检测)
确定到最近障碍物的距离是否在机器人的折断距离之内。如果机器人无法及时停止,请忽略该建议的机器人速度。
否则,速度是“允许的”,因此我们现在可以计算目标函数所需的值。在我们的情况下,机器人的前进和后退。
计算建议速度的“成本损耗”。如果目前的成本比其他任何都要好,请将其设置为我们的最佳选择。
最后,将机器人所需的轨迹设置为建议的最佳速度。
如果您已经阅读了所有其他文章,那么您现在应该已经足够了解实现自己的移动机器人导航系统的知识,或者至少对ROS导航堆栈中的算法有更多了解。
参考:
http://adrianboeing.blogspot.com/2012/05/dynamic-window-algorithm-motion.html
系统学习可见wiki
https://en.wikipedia.org/wiki/Motion_planning
https://en.wikipedia.org/wiki/Dynamic_window_approach