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时间左右的停顿,小车就会卡顿,损耗电机。


理想


当然是希望连续行驶,没有卡顿

 微信截图_20201208150906.png

改进

假设我们在下发指令后的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

最新评论

  1. 发布于:2021-04-14 12:28 回复
    对了这个跟你的底盘驱动控制功能相关,你的底盘是发一条指令一直运动直到停止指令呢还是,发一条指令执行几秒钟自动停止呢?
    底盘是发一条指令,它一直执行.
    我的DWA是发一条指令一直执行,直到下一条指令过来切换速度,就是在切换速度过程中发生卡顿.
    1. 发布于:2021-04-14 13:11 回复
      @Maccy_37:上边的算法是下发指令执行一秒钟自动停止,然后继续发指令继续响应这样行驶的过程才会连贯。你的在切换速度的时候是立即切换还是先停止将速度变成0再执行新的速度呢?
      1. 发布于:2021-04-14 13:18 回复
        @小v:是立即切换的
    1. 发布于:2021-04-14 14:23 回复
      @Maccy_37:我不太确定你的是底盘切换造成的还是dwa算法的问题,建议你可以直接测试底盘,直接给它发送切换速度的指令,查看是否卡断问题
      1. 发布于:2021-04-14 17:12 回复
        @小v:我测试过了,连续用ros发布两条速度指令给它也是在速度切换过程存在卡顿问题.这两个速度是左右轮速度(0.216,0.273)和(0.194,0.255)m/s.
        1. 发布于:2021-04-16 09:20 回复
          @Maccy_37:pid的算法在哪做的
          1. 发布于:2021-04-22 15:46 回复
            @小v:已经搞好了,原来是下位机在变速的时候加了个刹车
          1. 发布于:2021-04-22 18:02 回复
            @Maccy_37:祝贺
  2. 发布于:2021-04-13 15:47 回复
    我复现的DWA算法,机器人跑起来还是存在卡顿现象,但是有没你表述的出现t-t3的空挡期,而是在跑的过程中连续发速度出现的卡顿现象.
    1. 发布于:2021-04-14 10:56 回复
      @Maccy_37:卡顿就是因为 走停走停造成的,要么是dwa算法让它停的,要么是指令执行时间到了
  3. 发布于:2021-04-13 15:42 回复
    "机器人底盘响应的时间要比这个dwa时间快才对"你说的这个我不太懂;在我的程序里面是机器人延时运动,计算DWA,下发速度;机器人延时运动,计算DWA,下发速度.......这个循环里面你不是需要先延时,然后再计算出DWA的时间t吗?但是延时又需要知道t:usleep((t2-0.1-t)*1000)这不是相矛盾了吗?还是用上一个周期计算的DWA的时间,还是我理解错了?但是我有觉得我没理解错.
    1. 发布于:2021-04-14 10:54 回复
      @Maccy_37:对了这个跟你的底盘驱动控制功能相关,你的底盘是发一条指令一直运动直到停止指令呢还是,发一条指令执行几秒钟自动停止呢?
  4. 发布于:2021-04-12 16:23 回复
    博主您好,请问dwa计算的时间t是一定的吗?我算出来的采样时间t每次都是不一样的,usleep(延时时长)不是需要先根据dwa计算出多少时间才可以知道延时多少吗?在我的算法里面dwa是后来计算的,这就矛盾了?
    1. 发布于:2021-04-13 10:38 回复
      @Maccy_37:时间t不是一定的。是的先计算出dwa的时间来,然后机器人底盘响应的时间要比这个dwa时间快才对,采样才比较好

sitemap