【发布时间】:2023-01-22 04:37:46
【问题描述】:
我有以下代码来生成将用于 A* 应用程序的 PRM 映射。代码存在两个问题
- 它保留代表原始 PRM 的蓝线,其中线可以越过障碍物。我不想保留蓝线,但找不到删除它们的方法。
- 绿线正在越过障碍,尽管它们不应该越过障碍
代码如下
clc; clear all; close all; seed = 123512; rng(seed); xaxis = 100; yaxis = 100; obstacles = false(xaxis,yaxis); [X,Y] = meshgrid(1:xaxis,1:yaxis); obstacles(50:75,50:75) = true; obstacles(25:35,30:40) = true; obstacles(25:35,60:80) = true; figure; imshow(~obstacles,"InitialMagnification",1000); axis([0 xaxis 0 yaxis]); axis xy; axis on; %PRM PARAMETERS max_nodes_connect = 4; max_connect_len = 40; segments = 1; max_nodes_grid = 30; skipped = 0; %PRM ALGO nodes = 0; %Counter map = zeros(size(obstacles)); %generate map map(obstacles) = 1; %put the obstacles Graph_connections = Inf(max_nodes_grid,max_nodes_connect + 1); %rows = # nodes cols = ID and neighbors while (nodes < max_nodes_grid) node_x = randi(xaxis); node_y = randi(yaxis); if(map(node_y,node_x)==1 || map(node_y,node_x)==2) continue; end nodes = nodes + 1; %a valid node generated map(node_y,node_x) = 2; %2 means there exists a node at that location hold on scatter(node_x,node_y,"red","filled") %NODES TO CONNECT nodes_to_connect = []; distances = []; for i= 1:numel(Graph_connections(:,1)) if(Graph_connections(i,1)==Inf) break end [row,col] = ind2sub(size(map),Graph_connections(i,1)); %Check if within range if(norm([node_y,node_x]-[row,col])>max_connect_len) continue; end line_on_obstacle = check_obstacle(map,node_x,node_y,row,col); %Check if obstacle thru line HAS TO BE WRITTEN if(line_on_obstacle) disp("Check Obstacle: " + line_on_obstacle); skipped = skipped + 1; continue; end nodes_to_connect = [nodes_to_connect, Graph_connections(i,1)]; distances = [distances; [Graph_connections(i,1),norm([node_y,node_x]-[row,col])]]; end Graph_connections(nodes,1) = sub2ind(size(map),node_y,node_x); if(size(distances)>0) sorted_distances = sortrows(distances,2); for i = 1:min(max_nodes_connect,size(sorted_distances,1)) Graph_connections(nodes,i+1) = sorted_distances(i,1); [row,col] = ind2sub(size(map),sorted_distances(i,1)); if(line_on_obstacle==false) disp("Line is not on obstacle") hold on plot([node_x,col],[node_y,row],"green","LineWidth",1.5); continue; else disp("Line is on obstacle: " + [node_x,col] + " " + [node_y,row]); break; end end disp("==========================") end end function on_line = check_obstacle(map,node_x,node_y,row,col) on_line = 0; my_line = line([node_x,col],[node_y,row]); line_spacing = max(abs(my_line.XData(1) - my_line.XData(2))+1,abs(my_line.XData(1) - my_line.XData(2))+1); x_coordinates_line = round(linspace(my_line.XData(1),my_line.XData(2),line_spacing)); y_coordinates_line = round(linspace(my_line.YData(1),my_line.YData(2),line_spacing)); for i = 1:line_spacing if(map(x_coordinates_line(i),y_coordinates_line(i))==1) disp("ON OBSTACLE: " + x_coordinates_line(i) + " " + y_coordinates_line(i)); on_line = true; break; end end endcheck_obstacle 函数用于检查线上的点是否在障碍物的边界内。我在这里错过了什么?
【问题讨论】:
标签: matlab path motion-planning