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
代码亮点解析:
- 八邻域搜索让路径更丝滑,比四方向少些棱角
- movement_cost函数暗藏玄机------可自定义地形代价(比如沼泽地走更慢)
- 遇到障碍物立即将节点状态重置,触发重新计算
- 使用哈希表管理开放列表,查找效率比普通数组高
动态障碍物处理才是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*全部重算高效得多,特别适合实时性要求高的场景。
