Matlab航迹规划仿真——OBG栅格详解
本章介绍在Matlab ROS仿真中如何建造**BOG(Binary Occupancy Grid)**地图,之前有用过其他栅格地图,但是直接导入到simulation中总是报错,而simulation中仅仅提供了几个简单的Map:'simpleMap' (default), 'emptyMap', 'borderMap', or 'complexMap'
,由于想自己测试程序在多种地图下的运行情况(纯属闲的蛋疼)。在百度搜了下貌似没有相关的内容,那我就义不容辞的来填坑咯~~~
地图导入使用函数ExampleHelperRobotSimulator
,同时该函数也是开始仿真的开始,一旦调用该函数,记得调用完使用命令‘rosshutdown’来关闭仿真,要不再次运行时会出错,有提示要运行‘rosshutdown’
。该函数可以导入指定的地图**‘simpleMap’ (default), ‘emptyMap’, ‘borderMap’, or ‘complexMap’**,也可以导入自己的BOG地图,先来看下函数的使用方法:
MAPNAME
指导入地图的名字,一定要是字符串,可选则:‘simpleMap’ (default), ‘emptyMap’, ‘borderMap’, or ‘complexMap’MAPNAME
指导入地图的名字,一定要是字符串,可选则:‘simpleMap’ (default), ‘emptyMap’, ‘borderMap’, or ‘complexMap’,MAPRESOLUTION
指地图的分辨率,默认分辨率为2栅格/米,就是一个栅格0.5m。help ExampleHelperRobotSimulator
,自己懒得看的可以继续看我吹水~主要思想就是创建一个空白栅格地图,然后往地图里面填充障碍物。
map = robotics.BinaryOccupancyGrid(10,10,10);`
前两个参数是栅格地图的长和宽,第三个参数是地图的分辨率,即将小栅格又分成多个小格子。感兴趣的可以看下Matlab的官方文档,里面有更详细的解释说明。
填充栅格主要用setOccupancy
函数,为了区分两种填充方式的区别,我将分辨率设置为10,也就是每一个栅格又分为10个小栅格。
setOccupancy(MAP, XY, VAL)
,MAP
是上面生成的地图,XY
是需要填充的栅格位置,需要与方式2中的IJ
区别,IJ
指的是生成地图中的行和列。该方法显示出来的点只占一个栅格的1/100,看起来障碍物就比较“小”
% set point as obstacle
occval = fix(1+9*rand(5,2));
setOccupancy(map occval)
grid = map
show(map)
setOccupancy(MAP, IJ, VAL, 'grid')
借助meshgrid
函数填充栅格,meshgrid
函数的用法就不再说了,想了解的自己去查查。这种方法生成的栅格比较“大”。IJ
指的是生成地图中的行和列,这里的行列指的是按分辨率来算的行列,从左上角开始,I
代表行,J
代表列。
% set block as obstacle ,rows,cols
[x,y] = meshgrid(1:5,1:10)
setOccupancy(map, [x(:) y(:)], 1, "grid")
grid = map
show(map)
%% Robotics BOG map
% Generate map from a photo
% Import Image
image = imread(x);
image = imresize(image,[50,50]);
% Convert to grayscale and then black and white image based on arbitrary
% threshold.
grayimage = rgb2gray(image);
bwimage = grayimage < 0.5;
% Use black and white image as matrix input for binary occupancy grid
grid = robotics.BinaryOccupancyGrid(bwimage);
show(grid)
使用函数getOccupancy
来判断栅格是否被占用
occval = getOccupancy(map,xy)
返回世界坐标输入数组xy
的占用值数组。 xy
的每一行都是地图上的一个点,表示为[x y]
坐标。 occval
与xy
和单列数组的长度相同。 栅格被占用表示为真(1),空闲表示为假(0)。
occval = getOccupancy(map,ij,"grid")
基于行列坐标,输入数组ij
的占用值数组。ij
指的是生成地图中的行和列,这里的行列指的是按分辨率来算的行列,从左上角开始,i
代表行,j
代表列。函数返回值为栅格的占用值。栅格被占用表示为真(1),空闲表示为假(0)。
在这里列出其他可能用到的函数,以及其官方说明文档,需要的朋友可以自己查看
checkOccupancy
occupancyMatrix
world2grid
grid2world
copy
insertRay
occupancyGrid
总链接