dwa 避障算法的若干理解
前言
根据ros中 base_local_planner 和dwa_local_planner代码的理解。
https://github.com/ros-planning/navigation
dwa 在计算 cost损失成本的时候会耗费一定的时间。算法的时间复杂度基本有v*w 决定。
所以v ,w和递增分辨率的选值可以加大算法速度。
预测时间和单步执行时间也可以加大计算速度。
这里单步执行时间和底盘在执行时间应该保持一致,否则会出错误。
再不使用ros的 navigation class类的时候,我们想自己移植dwa 的算法,应该注意到
单步执行时间和底盘通信的严格时间帧控制。
ros做的很好。应该实现了这步。
根据下面的草图对算法和控制之间的严格时间做一定的
说明
首先假设dwa的时间为t,也就是从开始执行到计算出最佳的路径和(v,w)。期间要经过v*w条路径,以及预测时间个航点计算。
dwa算法开始时认为v,w都为0,结束后开始向底盘发送指令。假设这里思路很单一,我们让程序顺序执行,单步预测的时间为
t2,所以底盘在运行t2时间将结束的时候,算法又开始采集v,和w ,底盘在单步行驶过程中,速度保持不变。图很丑,见谅。
这样,在经过很小的一段时间t3后底盘必须要停止,否则,底盘会在之前的指令下继续执行,导致超出错误。
dwa算法在经过t-t3 时间后完成算法输出指令,底盘在停止t-t3时间后收到指令又开始运行。
现像就是会有t-t3时间左右的停顿,小车就会卡顿,损耗电机。
理想
当然是希望连续行驶,没有卡顿。
改进
假设我们在下发指令后的1/2处时间进行采样,获得v,w。这样的话就必须保证算法在指令结束之前就得计算出结果,并下发
给底盘。下发指令给底盘后,PID调节速度达到稳定需要一定的时间,所以不能立即采集。
得到 t3 <≈ (1/2 *t)。
当然,假设100ms后,底盘速度达到稳定,可以采集v,w 。
dwa算法可以早早的计算处并等待,指令完成。
那么算法的时间 t<=t2-0.1 s
算法延时的时间为 usleep((t2-0.1-t)*1000);单位为us