改进DWA算法(地图为图片版,随便换地图,非图片版是在另一个链接)。 可以换地图(加载图片为地图,换地图直接换图片) 也能自己输入栅格地图,因为二值图片和栅格地图一样,都是01矩阵 是自己的改进思路。 仅供学习所用 局部路径规划,DWA,动态窗口,自适应动态窗口。 效果:轨迹更优,更光滑,速度更快; 用了一个比较优雅的方法吧:使得机器人能够逃出局部最优解,逃出C型障碍物。

在局部路径规划领域,DWA(Dynamic Window Approach)算法是一个非常经典且应用广泛的方法。最近我在研究这个算法时,做了一些改进,在这里跟大家分享分享,仅供学习交流哈。

地图处理:灵活加载与输入

我们处理的地图分为图片版和非图片版(非图片版在另一个链接先不细说)。图片版地图的处理很有意思,它本质上就是通过加载图片来作为地图。换地图的时候,只需要简单地更换图片就行。代码实现上大致如下:

import cv2
import numpy as np

# 加载图片作为地图,假设图片为二值图,0代表障碍物,1代表可通行区域
map_image = cv2.imread('map.png', 0)  
map_array = np.where(map_image > 127, 1, 0)  # 将灰度值大于127的设为1(可通行),小于等于127的设为0(障碍物)

这里我们利用OpenCV库的imread函数读取图片,然后通过numpy库的where函数将图片转化为01矩阵。因为二值图片和栅格地图本质上都是01矩阵,所以我们也能自己输入栅格地图,这就给了我们很大的灵活性。

改进思路:优雅地逃离局部最优解

我的改进思路核心在于帮助机器人逃出局部最优解,尤其是能够成功逃出C型障碍物。这可不是个容易的事儿,经过一番摸索,我找到了一个自认为比较优雅的方法。

在传统的DWA算法中,机器人很容易陷入局部最优解,比如在面对C型障碍物时,就像走进了死胡同。为了打破这种局面,我们需要对动态窗口的选择做一些调整。

先看看传统DWA算法中动态窗口的计算部分代码(简化示意):

# 假设一些初始参数
v_max = 1.0
w_max = np.pi/2
v_min = 0.1
w_min = -np.pi/2
dt = 0.1

# 计算动态窗口
def calculate_dynamic_window(v, w):
    v_dynamic = [max(v_min, v - v_max * dt), min(v_max, v + v_max * dt)]
    w_dynamic = [max(w_min, w - w_max * dt), min(w_max, w + w_max * dt)]
    return v_dynamic, w_dynamic

这里根据当前速度v和角速度w,以及最大最小速度、角速度和时间间隔dt,计算出动态窗口。但是这样计算出来的动态窗口在面对复杂障碍物时,容易让机器人被困住。

改进DWA算法(地图为图片版,随便换地图,非图片版是在另一个链接)。 可以换地图(加载图片为地图,换地图直接换图片) 也能自己输入栅格地图,因为二值图片和栅格地图一样,都是01矩阵 是自己的改进思路。 仅供学习所用 局部路径规划,DWA,动态窗口,自适应动态窗口。 效果:轨迹更优,更光滑,速度更快; 用了一个比较优雅的方法吧:使得机器人能够逃出局部最优解,逃出C型障碍物。

改进的思路就是在动态窗口选择的时候,引入一些对障碍物形状和全局路径信息的考量。比如,当检测到机器人处于类似C型障碍物的环境中时,适当扩大动态窗口中角速度的范围,让机器人有更大的机会转向,找到逃离的路径。

# 改进后的动态窗口计算(加入对C型障碍物判断后的调整)
def improved_calculate_dynamic_window(v, w, obstacle_info):
    v_dynamic, w_dynamic = calculate_dynamic_window(v, w)
    if is_c_shaped_obstacle(obstacle_info):
        w_dynamic[0] = -np.pi
        w_dynamic[1] = np.pi
    return v_dynamic, w_dynamic

# 简单模拟判断是否为C型障碍物的函数
def is_c_shaped_obstacle(obstacle_info):
    # 这里可以根据实际情况通过分析障碍物分布等信息来判断
    # 简单示例,假设障碍物信息中有个标志位代表是否为C型
    return obstacle_info.get('is_c_shaped', False)

在这个改进的函数中,我们先按照传统方式计算动态窗口,然后根据障碍物信息判断是否为C型障碍物,如果是,就大幅扩大角速度的动态窗口范围,给机器人更多转向选择,从而有可能逃出局部最优解。

改进效果:轨迹、速度与平滑度的提升

经过这样的改进,效果还是很显著的。机器人规划出的轨迹更优了,不再像以前那样在障碍物附近磕磕绊绊,而是能够更智能地绕开障碍物。轨迹更加光滑,这对于实际机器人运动来说,能减少机械磨损和能量消耗。同时,速度也更快了,因为减少了在局部最优解处徘徊的时间。

总之,通过对DWA算法在地图处理和动态窗口选择上的改进,我们成功地让机器人在局部路径规划中有了更好的表现。希望我的这些思路和代码示例能给大家带来一些启发,一起在路径规划的领域里探索更多可能。

以上代码只是简化示意,实际应用中还需要结合更多具体场景和细节进行完善。欢迎大家一起交流讨论,看看有没有更好的改进方向。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐