使用Matlab构建二维栅格地图
常使用的地图一般有以下几种:
- 尺度地图:具有真实的物理尺寸,如栅格地图、特征地图、点云地图、常用于地图构建、定位、SLAM、小规模路径规划
- 拓扑地图:不具备真实的物理尺寸,只表示不同地点的连通关系和举例,如铁路网
- 语义地图:加标签的尺度地图,常用于人机交互
我们在进行一些算法研究的时候通常使用的都是栅格地图:
栅格地图用于路径规划的优势:
- 可以将任意形状轮廓的地图,用足够精细的栅格进行绘制;
- 每一个栅格,可以通过不同颜色表征不同含义,如黑色代表障碍物、黄色代表起点、红色代表终点。
- 基于栅格地图进行路径规划有横、纵、斜三个规划方向,对于室内低速机器人可以完全按照规划路径行走;对于中高速机器人,可以考虑将规划路径进行平滑处理,以适用于非完全约束系统。
使用Matlab绘制栅格地图的几个常用函数及思想:
为了在栅格地图呈现随机障碍物的效果,可以设障碍物出现频率数值,根据该数据在所有栅格中生成随机数,从而确定障碍物栅格。
-
colormap
:为栅格地图创建自定义颜色。如黄色栅格代表起点、红色栅格代表终点、黑色栅格代表障碍物。 -
sub2id
:将行列索引转为线性索引。对于右图栅格地图,10行10列,行从左上角自上而下排序,列从左上角自左而右排序。相反ind2sub
则将线性索引转为行列索引。 -
image
:利用colormap建立的颜色图,将数组信息显示为图像。image(x,y,C) 指定图像位置。使用 x 和 y 可指定与 C(1,1) 和 C(m,n) 对应的边角的位置。要同时指定两个边角,请将 x 和 y 设置为二元素向量。要指定第一个边角并让 image 确定另一个,请将 x 和 y 设为标量值。图像将根据需要进行拉伸和定向。
-
randi
: X = randi([imin,imax],n,m) 生成一个值在imin和imax之间的n行m列的均匀分布的整数矩阵>> randi([1,10], 5,5) ans = 8 10 9 4 4 3 6 3 2 9 6 2 9 3 6 7 2 3 7 6 9 3 10 5 10 >>
源代码:
clc;
clear;
close all;
%% 构建颜色MAP图
% n行3列,3列表示颜色
% 构建地图的过程中需要多少中颜色就定义多少行
cmap = [1 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 = 15; % 列数
% 定义栅格地图全域,并初始化空白区域, 因为数字全部都是1(我们定义了白色表示空地)
field = ones(rows,cols);
% 障碍物
obsRate = 0.3; % 障碍物出现的频率
obsNum = floor(rows*cols*obsRate); % 障碍物的个数
obsIndex = randi([1,rows*cols],obsNum,1); % 生成所有障碍物的索引(注意是一维索引)
field(obsIndex) = 2; % 将生成的位置的值设为2表示静态障碍
% 定义起点和终点(之所以放在生成障碍物后面,是为了防止随机生成的障碍物把起点或者终点覆盖)
startPos = 3;
goalPos = rows*cols - 3;
field(startPos) = 4; % 将起始点设置为4,黄色
field(goalPos) = 5; % 将终点设置为5,品红色
%% 根据cmap和field矩阵绘制栅格图
image(1.5,1.5,field); % 如果我们之前没有构建颜色map图,那么1个数值就直接表示1个像素的颜色值
grid on; % 开启网格线
set(gca,'gridline','-','gridcolor','k','linewidth',2,'GridAlpha',0.5); % 将网格改成实线,颜色改成黑色,线宽为2,透明度为0.5
set(gca,'xtick',1:cols+1,'ytick',1:rows+1); % 设置坐标的刻度
axis image; % 沿每个坐标区使用相同的数据单位长度,并使坐标区框紧密围绕数据。
运行结果:
你只管出发,旅途自有风景~~