路径规划的前提是对周围的环境进行了感知,并且建立地图。如何从传感器的数据中构建出地图是环境感知技术的范畴,做自动驾驶轨迹规划只需要假设已经存在这些地图的结构。因此,我们需要了解的是不同的地图里面包含的信息都有什么,地图如何为路径规划服务,本篇文章主要讲述一些基本的地图结构并重点讲述机器人避障最常用的栅格地图,为之后的自动驾驶路径规划打下基础。
1 基础地图结构的分类
1.1 2D地图
1.1.1 栅格地图
主要对平面进行网格化,格子一般为正方形,长度的调整代表地图的分辨率。
1.1.2 拓扑地图
与图论紧密结合,通过抽象的点与边,边的方向与路径长度代表一个地图的信息。
1.1.3 导航网格图
弥补了栅格地图的缺陷,网格由不同的多边形构成,多边形一般根据障碍物顶点的连线构成,将地图划分为不规则的一个个区域,网格数量较少。
1.2 3D地图
1.2.1 栅格地图
类似于2D栅格地图,3D地图相对比较占内存。
1.2.2 八叉树地图
如果某个位置上没有障碍物,那么可以用该位置上的大正方体表示,如果某个位置上是小障碍物,那就把大正方体切分到刚好可以包含这个障碍物的小正方形。这样就可以减少计算量,节约内存。而这刚好是八叉树这种数据结构,寻找障碍物先从最大的正方体开始找,然后再向由这个正方体平均分的八个正方体里去找。
1.2.3 点云地图
通过激光雷达等传感器得到数据再进行三维重建得到点云地图
1.2.4 体素地图
类似于八叉树地图,是由最小的正方体(体素)为单位构成的,每个体素存储一个SDF、颜色和权重。
1.2.5 TSDF地图
TSDF地图是截断符号距离函数场,这里的体素储存的是投影距离(projective distance),就是沿着传感器射线到已测量的表面的距离。
1.2.6 ESDF地图
ESDF地图是欧几里得符号距离场,在这个场里面的每一个体素都包含了距离它最近的障碍物的欧几里得距离。
上面的各种地图的基础结构需要根据我们的自动驾驶的对象与场景去应用,机器人,无人机,无人车,无人艇等各种无人系统的建图都各不相同。
2 利用matlab进行建图(以栅格地图为例)
2.1 随机生成障碍物
matlab代码如下
clc
clear all
a = rand(10)>0.55
while (a(1,10)==0)||(a(10,1)==0) %起点与终点都没有障碍物才退出循环
a = rand(10)>0.30;%代表生成一个10*10的矩阵且障碍物比例为30%
end
n = size(a,1);
b = a;
b(end+1,end+1) = 0;
figure;
colormap([0 0 0;1 1 1])
pcolor(b); % 赋予栅格颜色
set(gca,'XTick',10:10:n,'YTick',10:10:n); % 设置坐标
axis image xy
text(1,n+1.5,'START','Color','red','FontSize',10);%显示start字符
text(n+1,1.5,'GOAL','Color','red','FontSize',10);%显示goal字符
hold on
%画出起点与终点
scatter(1+0.5,n+0.5,'MarkerEdgeColor',[1 0 0],'MarkerFaceColor',[1 0 0], 'LineWidth',1);
scatter(n+0.5,1+0.5,'MarkerEdgeColor',[0 1 0],'MarkerFaceColor',[0 1 0], 'LineWidth',1);
hold on
2.2 根据实际停车场的俯视图
下图为论文《Practical Search Techniques in Path Planning for Autonomous Driving》中的自动泊车的测试停车场
通过图像处理得到如下栅格地图
matlab代码如下
clc
clear all
Img=imread('C:\Autodesk\WI\ceshi.jpg');
Img = flipud(Img);%y坐标调换,由于读入图像时上下会反转
I = rgb2gray(Img);
a=50;b=50;% 设置网格格数 a表示横轴 b表示纵轴
length=1;%网格边长
B = imresize(I,[a/length b/length]);%对图像进行矩阵化
J=floor(B/(255-60));
%不接近白色的都变为黑色,即变成障碍物,这里的50是可以调整的范围,不同的图像有不同的处理方法
hold on;grid on;%添加网格线
axis([0,a,0,b]);
% gca表示当前绘图区域
% xtick表示x轴坐标刻度,刻度为0到a,步进为1
set(gca,'xtick',0:1:a,'ytick',0:1:b);
axis image xy
% 障碍物填充为黑色
for i=1:a/length-1
for j=1:b/length-1
if(J(i,j)==0)
y=[i,i,i+1,i+1]*length;
x=[j,j+1,j+1,j]*length;
h=fill(x,y,'k');
hold on
end
end
end
上述的随机生成障碍与现实停车场两种生成栅格地图的方式能够为我们后续进行路径规划的算法测试时提供场景,并不是实际应用的建图方式,工程领域一般采用视觉与雷达等传感器进行部分环境建图。