基于栅格地图的路径规划(一)基于Matlab二维、三维栅格地图的构建

前言

这个系列将会用来记录和分享关于路径规划中基于栅格地图规划的相关算法学习过程,本文主要是基于Matlab的二维、三维栅格地图创建。其中应该声明的是:

  1. 二维栅格地图的创建部分内容为:
  • 古月居~基于栅格地图的机器人路径规划算法指南 • 黎万洪 课程学习的笔记,方便自己日后的巩固与复习,这个教程讲的很好,值得推荐!同时路径规划(一):使用Matlab快速绘制栅格地图这篇文章较为详细的记录了课程中二维栅格图的创建过程,为了避免重复造轮子,本文对此处不做细节描述,大家可以先看这位优秀博主的帖子。
  1. 三维空间栅格的创建部分为个人在二维学习基础上拓展分析而来,以便后续三维空间的路径规划使用。同时,在三维格点的创建函数部分借鉴了知乎:基于MATLAB的三维网格绘制

1、二维栅格地图的创建

1.1、二维栅格地图构建原理

二维栅格地图的构建利用image()函数,矩阵图像实现数字与图像可视化之间的转化,矩阵中每元素的位置代表栅格点的坐标,元素值则对应相关的特征。通过预先设定好的colormap表征路径规划中不同的情况(障碍、起点、终点、规划中的路径以及最终的路径)。为了便于路径规划算法的运行,需要用到线性索引与直角坐标的函数转化,最后通过图像句柄实现可视化的细节调整。

1.2、二维栅格地图构建例程

% 基于栅格地图的机器人路径规划算法
clc
clear
close all

%% 构建颜色MAP图
cmap = [1 1 1; ...       % 1-白色-空地
    0 0 0; ...           % 2-黑色-静态障碍
    1 0 0; ...           % 3-红色-动态障碍
    1 1 0;...            % 4-黄色-起始点 
    1 0 1;...            % 5-品红-目标点
    0 1 0; ...           % 6-绿色-到目标点的规划路径   
    0 1 1];              % 7-青色-动态规划的路径

% 构建颜色MAP图
colormap(cmap);

%% 构建栅格地图场景
% 栅格界面大小:行数和列数
rows = 20;
cols = 20; 

% 定义栅格地图全域,并初始化空白区域
field = ones(rows, cols);

% 障碍物区域
obsRate = 0.3;
obsNum = floor(rows*cols*obsRate);
obsIndex = randi([1,rows*cols],obsNum,1);
field(obsIndex) = 2;

% 起始点和目标点
startPos = 2;
goalPos = rows*cols-2;
field(startPos) = 4;
field(goalPos) = 5;

%% 画栅格图
image(1.5,1.5,field);
grid on;
set(gca,'gridline','-','gridcolor','k','linewidth',2,'GridAlpha',0.5);
set(gca,'xtick',1:cols+1,'ytick',1:rows+1);
axis image;

请添加图片描述

2、三维栅格地图的创建

2.1、三维栅格地图构建原理

在上述二维栅格地图的创建基础上,三维栅格的地图的创建并不利用函数image()进行实现,而是通过Patch函数进行空间体的创建显示,创建pointCreat(x,y,z,color,alphaValue)函数实现此功能mesh()函数实现空间网格的构建。同时,三维直角坐标表示路径规划中点的位置,这里需要说明的一点是每个三维坐标点作为三维空间体的左下顶点实现创建,同样的这里我创建了函数DtranTo1D(xmax,ymax,zmax,x,y,z)、DtranTo3D(xmax,ymax,zmax,b)分别实现三维坐标转线性索引、线性索引转三维坐标。

2.2 三维栅格地图构建例程

% 基于三维栅格地图的机器人路径规划算法
clc
clear
close all

%% 构建栅格地图场景

%构建颜色MAP图
cmap = [1 1 1; ...       % 1-白色-空地
    0 0 0; ...           % 2-黑色-静态障碍
    1 0 0; ...           % 3-红色-动态障碍
    1 1 0;...            % 4-黄色-起始点 
    1 0 1;...            % 5-品红-目标点
    0 1 0; ...           % 6-绿色-到目标点的规划路径   
    0 1 1];              % 7-青色-动态规划的路径

% 构建颜色MAP图
colormap(cmap);
% 栅格界面大小:行数和列数
rows = 10;
cols = 10; 
heigh=10;

x=1:rows+1;
y=1:cols+1;
z=1:heigh+1;

[X,Y]=meshgrid(x,y);
Z=ones(size(X));
camp1=[0.7 0.7 0.7];
colormap(camp1);
for(i=1:length(z))
    colormap(camp1);
    a=mesh(X,Y,i*ones(size(X)));
    a.FaceAlpha=0;
    hold on;
    b=mesh(i*ones(size(X)),X,Y);
    b.FaceAlpha=0;
end
% 起点信息
[xstar,ystar,zstar]=DtranTo3D(rows,cols,heigh,1);
pointCreat(xstar,ystar,zstar,cmap(4,:),1);
% 终点信息
goalPos=rows*cols*heigh-2;
[xend,yend,zend]=DtranTo3D(rows,cols,heigh,goalPos);
pointCreat(xend,yend,zend,cmap(3,:),1);
% 障碍物区域
obsRate = 0.05;
obsNum = floor(rows*cols*heigh*obsRate);
startPos=1;
obsIndex = randi([2,rows*cols*heigh-3],obsNum,startPos);
for(i=1:length(obsIndex))
    [xobs,yobs,zobs]=DtranTo3D(rows,cols,heigh,obsIndex(i));
    pointCreat(xobs,yobs,zobs,cmap(2,:),1);
end
%显示区域设置
xlim([0,rows+1]);
ylim([0,cols+1]);
zlim([0,heigh+1]);

function [x,y,z]=DtranTo3D(xmax,ymax,zmax,b)

jishu=1;
for(i=1:xmax)
    for(j=1:ymax)
        for(k=1:zmax)
            index(jishu,1)= DtranTo1D(xmax,ymax,zmax,i,j,k);
            index(jishu,2)= i;
            index(jishu,3)= j;
            index(jishu,4)= k;
            jishu=jishu+1;
        end
    end
end

x=index(find(index(:,1)==b),2);
y=index(find(index(:,1)==b),3);
z=index(find(index(:,1)==b),4);
end
function b=DtranTo1D(xmax,ymax,zmax,x,y,z)
a=sub2ind([xmax,ymax],x,y);
b=a+(z-1)*xmax*zmax;
end
  
function pointCreat(x,y,z,color,alphaValue)
z=z+1;

points=[x,y,z;

x+1,y,z;

x+1,y+1,z;

x,y+1,z;

x,y,z-1;

x+1,y,z-1;

x+1,y+1,z-1;

x,y+1,z-1;];%节点信息

mesh=[1,2,3,4,5,6,7,8];%网格信息

for i=1:length(mesh(:,1))%绘图

%六面体单元结点坐标

vertices_matrix = [points(mesh(i,:),1),points(mesh(i,:),2),points(mesh(i,:),3)];

%六面体单元结点顺序

faces_matrix=[1 2 3 4;2 6 7 3;6 5 8 7;5 1 4 8; 4 3 7 8; 5 6 2 1];%给出每个面节点序号,顺时针或者逆时针排列

h=patch('vertices', vertices_matrix,'faces',faces_matrix,'facecolor',color);
h.FaceAlpha=alphaValue;
hold on%绘图

end
axis equal
end

请添加图片描述

  • 31
    点赞
  • 274
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
### 回答1: A*算法是一种常见的路径规划算法,通过估计当前节点到目标节点的代价,并结合已经前往的路径,选择代价最小的节点作为下一个前往的节点,从而找到最优路径。在无人机三维栅格地图路径规划问题中,可以采用以下步骤实现A*算法的求解。 1. 定义无人机三维栅格地图: - 将地图划分为二维栅格,并为每个栅格定义一个状态,如空闲、障碍等。 - 在每个栅格中,引入高度信息,以表示三维地图。 - 使用矩阵表示地图,其中每个元素表示对应栅格的状态和高度信息。 2. 初始化A*算法参数: - 定义起始节点和目标节点。 - 初始化起始节点的代价为0,将其添加到开放集合中。 - 初始化估计代价函数,例如使用曼哈顿距离作为启发函数。 3. 实现A*算法主循环: - 当开放集合为空时,表示无解,算法结束。 - 从开放集合中选择代价最小的节点作为当前节点,并将其从开放集合中移除。 - 判断当前节点是否为目标节点,如果是,则找到了最优路径,算法结束。 - 如果当前节点不是目标节点,则遍历当前节点的相邻节点,更新它们的代价,并将它们添加到开放集合中。 4. 实现路径回溯: - 从目标节点开始,按照每个节点的父节点一直回溯到起始节点,得到最优路径。 5. 实现路径可视化: - 使用图形界面或绘图函数,将路径在地图上进行可视化展示。 该问题的Matlab代码实现较为复杂,主要包括地图的初始化、节点代价的更新、启发函数的定义、开放集合的管理等。限于字数,无法提供完整代码,建议参考相关路径规划算法Matlab实现,并根据无人机三维栅格地图路径规划问题的特点进行相应的修改和调试。 ### 回答2: A*算法是一种经典的启发式搜索算法,用于在图形表示的地图中寻找从起点到终点的最短路径。对于无人机三维栅格地图路径规划问题,我们可以将地图抽象成一个三维网格,其中每个网格表示一个空间位置,包括X轴、Y轴和Z轴的坐标。 以下是基于A*算法求解无人机三维栅格地图路径规划MATLAB代码示例: ```MATLAB % 定义地图,0表示可通过的空间,1表示障碍物 map = zeros(100, 100, 100); map(20:40, 30:50, 30:70) = 1; % 定义起点和终点坐标 start = [10, 10, 10]; goal = [90, 90, 90]; % 定义每个网格中的代价 cost = ones(100, 100, 100); cost(map == 1) = Inf; % 障碍物的代价设为无穷大 % 定义起点的启发式代价 h = sqrt(sum((goal - start).^2)); % 初始化起点信息 node.start = start; node.cost = 0; node.parent = 0; node.h = h; % 将起点加入开放列表 openList = [node]; while ~isempty(openList) % 从开放列表中选择启发式代价最小的节点作为当前节点 [~, index] = min([openList.cost]); current = openList(index); % 如果当前节点为目标节点,则路径规划完成 if isequal(current.start, goal) break; end % 从开放列表中移除当前节点 openList(index) = []; % 获取当前节点周围的邻居节点 neighbors = getNeighbors(current.start, map); for i = 1:numel(neighbors) neighbor = neighbors(i); % 计算邻居节点的代价 neighbor.cost = current.cost + cost(neighbor.start(1), neighbor.start(2), neighbor.start(3)); neighbor.h = sqrt(sum((goal - neighbor.start).^2)); neighbor.parent = current; % 如果邻居节点已经在开放列表中,更新其代价和父节点 [isInOpenList, index] = ismember(neighbor.start, [openList.start], 'rows'); if isInOpenList if neighbor.cost < openList(index).cost openList(index).cost = neighbor.cost; openList(index).parent = neighbor.parent; end % 如果邻居节点不在开放列表中,则将其加入开放列表 else openList = [openList, neighbor]; end end end % 从终点回溯得到最短路径 path = []; while ~isequal(current.start, start) path = [current.start; path]; current = current.parent; end path = [start; path]; % 可视化路径规划结果 figure; plot3(path(:,1), path(:,2), path(:,3), 'b', 'LineWidth', 2); hold on; plot3(start(1), start(2), start(3), 'ro', 'MarkerSize', 10); plot3(goal(1), goal(2), goal(3), 'go', 'MarkerSize', 10); xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴'); title('无人机三维栅格地图路径规划'); grid on; ``` 以上代码使用A*算法实现了从起点到终点的无人机三维栅格地图路径规划。首先定义了地图、起点和终点的坐标,并初始化起点节点的代价和启发式代价,然后通过循环从开放列表中选择代价最小的节点进行搜索,直到找到目标节点。在搜索过程中,计算邻居节点的代价和启发式代价,并更新其在开放列表中的状态。最后,从终点回溯得到最短路径,并进行可视化展示。 注意:上述代码仅供参考,实际应用中可能需要根据具体情况进行调整和优化。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值