D*算法路径规划 Matlab路径规划 栅格法 可自行更改绘制栅格地图,自定义起始点目标点位置...

D*算法路径规划 Matlab路径规划 栅格法 可自行更改绘制栅格地图,自定义起始点目标点位置、未知障碍物位置 遭遇障碍物,重新搜索路径! matlab实现 详细注释! 仅提供代码!

今天咱们来搞点有意思的------用Matlab手搓一个带动态障碍物处理的D*路径规划器!先上效果:自定义地图尺寸,鼠标点点就能设障碍,规划好的路径遇到新障碍还能自动重算,绝对是摸鱼做算法的快乐源泉(误)

上硬菜!先整地图初始化:

matlab 复制代码
% 上菜姿势:先备好锅底(初始化地图)
map_size = [20,20];                % 地图尺寸任君修改
start_point = [2,2];               % 起点坐标
target_point = [18,18];             % 终点坐标
unknown_obstacles = [5,5;6,6;7,7]; % 初始障碍物位置

% 构建栅格地图(0=可通过,1=障碍物)
grid_map = zeros(map_size);
for k = 1:size(unknown_obstacles,1)
    grid_map(unknown_obstacles(k,1), unknown_obstacles(k,2)) = 1;
end

这里用矩阵直接构建栅格地图,想加障碍物就往矩阵对应位置填1。支持随时修改地图尺寸和障碍物位置,比乐高积木还灵活~

核心算法上硬核代码:

matlab 复制代码
function path = D_star_algorithm(grid_map, start, goal)
    % 节点结构体:坐标+代价值+父节点
    nodes = struct('x',0,'y',0,'cost',inf,'parent',[0,0],'tag','NEW');
    open_list = containers.Map('KeyType','char','ValueType','any');
    
    % 初始化目标节点
    nodes(goal(1),goal(2)).cost = 0;
    open_list(num2str(goal)) = nodes(goal(1),goal(2));
    
    while ~isempty(open_list)
        % 从开放列表取最小代价节点
        current_key = min_key(open_list);
        current = open_list(current_key);
        delete(open_list, current_key);
        
        % 八邻域扩散(比四方向更风骚)
        neighbors = get_neighbors(current.x, current.y, size(grid_map));
        for i = 1:size(neighbors,1)
            nx = neighbors(i,1);
            ny = neighbors(i,2);
            
            % 遭遇新障碍物检测!
            if grid_map(nx, ny) == 1
                if nodes(nx,ny).tag == "CLOSED"
                    nodes(nx,ny).tag = "NEW";  % 标记需要重新计算
                end
                continue;
            end
            
            % 动态更新代价(D*的精髓所在)
            new_cost = current.cost + movement_cost(current, nodes(nx,ny));
            if new_cost < nodes(nx,ny).cost
                nodes(nx,ny).cost = new_cost;
                nodes(nx,ny).parent = [current.x, current.y];
                if ~isKey(open_list, num2str([nx,ny]))
                    open_list(num2str([nx,ny])) = nodes(nx,ny);
                end
            end
        end
        nodes(current.x, current.y).tag = "CLOSED";
    end
    % 路径回溯(经典环节)
    path = reconstruct_path(nodes, start, goal);
end

代码亮点解析:

  1. 八邻域搜索让路径更丝滑,比四方向少些棱角
  2. movement_cost函数暗藏玄机------可自定义地形代价(比如沼泽地走更慢)
  3. 遇到障碍物立即将节点状态重置,触发重新计算
  4. 使用哈希表管理开放列表,查找效率比普通数组高

动态障碍物处理才是D*的看家本领:

matlab 复制代码
% 模拟动态障碍物出现
figure;
imshow(~grid_map,'InitialMagnification',1000); % 反色显示更直观
title('点击地图添加障碍物');
[x,y] = ginput(1);  % 用鼠标搞事情!
new_obstacle = round([y, x]);

% 触发重新规划
if grid_map(new_obstacle(1), new_obstacle(2)) == 0
    grid_map(new_obstacle(1), new_obstacle(2)) = 1;
    disp('检测到新障碍物!重新规划路径...');
    updated_path = D_star_algorithm(grid_map, start_point, target_point);
end

这段实现了交互式障碍物添加,点击地图任意位置就能实时看到路径重新规划的效果。比那些死板的预设障碍物演示更有冲击力~

最后奉上祖传路径显示代码:

matlab 复制代码
% 路径可视化(带起点终点标记)
hold on;
plot(start_point(2), start_point(1), 'go', 'MarkerSize',10, 'LineWidth',3);
plot(target_point(2), target_point(1), 'mo', 'MarkerSize',10, 'LineWidth',3);
if ~isempty(path)
    plot(path(:,2), path(:,1), 'r.-', 'LineWidth',2);
end

红绿紫三色搭配,学术风里带着闷骚,论文插图直接能用(别问我怎么知道的)

整套代码跑起来就像个智能扫地机器人------规划路线时碰到突然出现的拖鞋(障碍物)会立即绕路。算法在动态更新时只重新计算必要节点,比A*全部重算高效得多,特别适合实时性要求高的场景。

相关推荐
ttod_qzstudio5 天前
DriveLerpControllerEditor开发总结:一个3D编辑器插值控制系统的实现
vue.js·typescript·编辑器·tdesign
ttod_qzstudio7 天前
事件冒泡踩坑记:一个TDesign Checkbox引发的思考
前端·javascript·vue.js·tdesign
询问QQ:6882388617 天前
基于MATLAB的三维SD-MTSP:采用蛇优化算法SO求解多旅行商问题的三维单仓库数据处理及...
tdesign
ttod_qzstudio2 个月前
替代 TDesign Dialog:用 div 实现可拖拽、遮罩屏蔽的对话框
前端·tdesign
是大刚啊2 个月前
微信小程序原生车牌输入器
微信小程序·小程序·tdesign·车牌号·车牌输入
小__小__码2 个月前
Python数据可视化用Matplotlib和Seaborn提升你的数据分析效率
tdesign
2401_853406884 个月前
Tdesign-React 组件 Card 实现头部固定,内容区单独可滚动
前端·react.js·tdesign
QC班长9 个月前
微信小程序引入TDesign组件后报错一直提示路径不对(Component is not found in path)的解决方法
微信小程序·小程序·tdesign·引入tdesign组件后报错
杨天天.1 年前
微信小程序原生,tdesign时间选择器,t-date-time-picker封装成组件,开始时间结束时间
微信小程序·小程序·tdesign