构建栅格地图matlab代码

800 阅读4分钟

1    使用MATLAB实现地图栅格化

效果图如下所示

                                            

                                                                                         图1

                 

                                                                                 图2 

图1中的黑色栅格为障碍物栅格,白色栅格为可行走栅格(非障碍物栅格),黑色栅格 用0来表示,白色栅格用1来表示

2    栅格环境的environment.txt的构建

  1. 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 0 1 1 1
  2. 1 1 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0
  3. 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 1
  4. 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1
  5. 1 0 1 1 1 1 0 1 1 0 1 1 1 0 0 1 1 1 1 1
  6. 0 1 0 1 0 0 0 0 1 1 0 1 1 1 1 1 1 1 1 0
  7. 1 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1
  8. 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0
  9. 1 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 1 1
  10. 1 0 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1
  11. 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 1
  12. 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1
  13. 1 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1
  14. 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 1 1
  15. 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
  16. 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 0
  17. 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
  18. 1 1 1 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 0 1
  19. 1 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 1 1 1
  20. 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 1 0 0 1 1

这是就是图1中的栅格地图环境,1代表白色栅格,0代表黑色栅格。你可以手动编辑这样一个环境文件,也可以使用matlab的随机函数rand实现

a = rand(20)>0.35

其中0.35表示的黑色栅格总数占据全部栅格综述的百分比。即栅格环境中障碍物栅格(黑色栅格数)为35%,你可以自己随意定制。

2    构建栅格环境的代码部分 

  1. a = load('environment.txt');%blacb--barrier occputy 35%.
  2. % a = load('environment6060.mat', 'k');
  3. % a = a.k;
  4. n = size(a,1);
  5. b = a;
  6. b(end+1,end+1) = 0;
  7. figure;
  8. colormap([0 0 0;1 1 1])
  9. pcolor(b); % 赋予栅格颜色
  10. set(gca,'XTick',10:10:n,'YTick',10:10:n); % 设置坐标
  11. axis image xy
  12. % displayNum(n);%显示栅格中的数值.
  13. text(1,n+1.5,'START','Color','red','FontSize',10);%显示start字符
  14. text(n+1,1.5,'GOAL','Color','red','FontSize',10);%显示goal字符
  15. hold on
  16. %pin strat goal positon
  17. scatter(1+0.5,n+0.5,'MarkerEdgeColor',[1 0 0],'MarkerFaceColor',[1 0 0], 'LineWidth',1);%start point
  18. scatter(n+0.5,1+0.5,'MarkerEdgeColor',[0 1 0],'MarkerFaceColor',[0 1 0], 'LineWidth',1);%goal point
  19. hold on

3    如图2所示的,赋予栅格数学意义,即每一位栅格数列化

因为栅格是被坐标化的,所以只需要将数列的值,以坐标(x,y)之间完成转化即可,我通过displayNum函数实现了这个简单的功能,代码如下:

  1. function displayNum(n)
  2. %输入参数
  3. %矩阵维数----n
  4. %无输出
  5. %%
  6. x_text = 1:1:n*n;%产生1-400的数值.
  7. test_num = 32;
  8. %%
  9. %将数值在栅格图上显示出来
  10. for i = 1:1:n*n
  11. [row,col] = ind2sub(n,i);
  12. [array_x,array_y] = arry2orxy(n,row,col);
  13. text(array_x+0.2,array_y+0.5,num2str(x_text(i)));
  14. end
  15. %验证栅格数值与行列值是否对应
  16. [row,col] = ind2sub(n,test_num);
  17. [array_x,array_y] = arry2orxy(n,row,col);
  18. fprintf('the value %d is on array_x = %d,array_y = %d\n',test_num,array_x,array_y);%显示校对信息,供人工检验.
  19. end

主要通过ind2sub函数将数列和栅格的行列值换算,再通过arry2orxy函数完成,数列到栅格的数据化转化。ind2sub函数是matlab自带的通过doc ind2sub查看函数的具体使用方法。arry2orxy函数是自己编写的主要实现的是矩阵行列的坐标的转换,比较简单。

至此,你可以在栅格环境中,验证你自己的算法了,例如人工鱼群算法,蚁群算法等等在路径规划领域的应用了。