什么是栅格地图
栅格地图:即以机器人出生点为中心,x轴和y轴的分辨率为单个格子大小,当x轴分辨率=y轴分辨率时,则每个格子为一个正方形,分辨率越小则表示地图精度越高,比如一个格子大小为1cm × 1cm,那么机器人定位精度就是1cm。可以想象成一个巨大的网把一个地面罩住,网面碰到东西则认为是障碍物/墙,没有碰到障碍物则可以认为是空地。
那么每个格子如何区分自己的状态是障碍物/墙,还是空地呢?这里可以赋予每个格子不同的值,比如0代表空地,1代表墙。这个值的内容也可以扩展,比如2代表已经走过,3代表未被走过等等。
基于matlab构建栅格地图
% MATLAB 绘制栅格地图的核心函数和思想
% colormap:为栅格地图创建自定义颜色。如黄色栅格代表的起点,红色栅格代表的终点,黑色栅格代表的障碍物
% sub2ind:将行列索引转为线性索引 ind2sub:将线性索引转为行列索引
% image:利用colormap建立的颜色图,将数组信息显示为图像
clc
clear
close all
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 = 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;
这样生成出来的栅格地图是10*20随机障碍物的,满足我们在这个地图上验证路径规划算法
![]()
在C语言中验证算法时,可以用二维数组承接这个field矩阵中的数据
/*
* 1-白色-空地
* 2-黑色-静态障碍
* 3-红色-动态障碍
* 4-黄色-起始点
* 5-品红-目标点
* 6-绿色-到达目标点的规划路径
* 7-青色-动态规划的路径
*/
const int kRows = 10;
const int kCols = 20;
uint8_t mymap[kRows][kCols] = {
{1, 1 ,1, 1, 1 ,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2},
{4, 1 ,1, 2, 1 ,1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 2, 2},
{1, 1 ,1, 2, 1 ,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2},
{1, 1 ,2, 1, 1 ,1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1},
{1, 1 ,1, 2, 2 ,1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2},
{1, 1 ,2, 1, 1 ,2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1},
{2, 1 ,1, 1, 1 ,1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1},
{2, 1 ,1, 2, 1 ,1, 1, 1, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 5},
{1, 1 ,2, 1, 1 ,1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1},
{2, 2 ,1, 1, 1 ,1, 1, 1, 2, 2, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1},
};