Main Content

occupancyMap

2차원 점유 맵 생성

R2019b 이후

설명

occupancyMap은 2차원 점유 그리드 map 객체를 생성합니다. 점유 그리드의 각 셀에는 해당 셀의 점유 확률을 나타내는 값이 있습니다. 1에 가까운 값은 셀에 장애물이 있을 확률이 높음을 나타냅니다. 0에 가까운 값은 셀이 점유되지 않았고 장애물이 없을 확률이 높음을 나타냅니다.

점유 맵은 경로 계획과 같은 내비게이션 알고리즘에 사용됩니다(plannerRRT 항목 참조). 또한 충돌 없는 경로 탐색, 충돌 회피 수행, 위치추정 계산을 위해 맵 작성 응용 분야에서도 사용됩니다(monteCarloLocalization 항목 참조). 특정 응용 분야에 맞도록 점유 맵을 수정할 수 있습니다.

occupancyMap 객체는 로컬 좌표, 세계 좌표, 그리드 인덱스를 지원합니다. 인덱스가 (1,1)인 첫 번째 그리드 위치는 그리드의 왼쪽 위 코너에서 시작합니다.

occupancyMap 클래스를 사용하여 세계에 존재하는 여러 장애물을 확률 값으로 표현한 환경의 2차원 맵을 생성합니다. 셀의 확률 값을 정확하게 지정하거나 레이저 스캐너와 같은 센서의 관측값을 포함시킬 수 있습니다.

확률 값은 이진 베이즈 필터를 사용하여 저장되며 각 그리드 셀의 점유를 추정합니다. 로그 오즈 표현이 사용되며, 맵 저장 크기를 줄이고 실시간 애플리케이션에 사용할 수 있도록 int16으로 저장됩니다.

생성

설명

map = occupancyMap(width,height)widthheight(단위: 미터)로 표시된 세계 공간을 나타내는 2차원 occupancy map 객체를 생성합니다. 디폴트 그리드 해상도는 미터당 셀 1개입니다.

예제

map = occupancyMap(width,height,resolution)은 지정된 그리드 해상도(단위: 미터당 셀 개수)를 사용하여 점유 맵을 생성합니다. resolutionResolution 속성을 설정합니다.

map = occupancyMap(rows,cols,resolution,'grid')는 지정된 행과 열의 개수 및 해상도(단위: 미터당 셀 개수)를 사용하여 점유 맵을 생성합니다. rows 값과 cols 값은 GridSize 속성을 설정합니다.

map = occupancyMap(p)는 행렬 p의 값을 바탕으로 점유 맵을 생성합니다. 그리드 크기는 행렬의 크기와 일치하며, 각 셀의 확률 값은 해당 행렬 위치에서 해석됩니다.

예제

map = occupancyMap(p,resolution)은 지정된 행렬 및 해상도(단위: 미터당 셀 개수)로 점유 맵을 생성합니다.

map = occupancyMap(sourcemap)은 또 다른 occupancyMap 객체의 값을 사용하여 객체를 생성합니다.

map = occupancyMap(sourcemap,resolution)은 또 다른 occupancyMap 객체의 값을 사용하여 객체를 생성하지만, 지정된 해상도를 갖도록 행렬을 리샘플링합니다.

입력 인수

모두 확장

맵 너비로, 스칼라로 지정됩니다(단위: 미터).

맵 높이로, 스칼라로 지정됩니다(단위: 미터).

그리드 해상도로, 스칼라로 지정됩니다(단위: 미터당 셀 개수).

그리드의 행 개수로, 양의 정수 스칼라로 지정됩니다.

그리드의 열 개수로, 양의 정수 스칼라로 지정됩니다.

입력 점유 그리드로, 0에서 1 사이의 확률 값으로 구성된 행렬로 지정됩니다. 그리드의 크기는 행렬의 크기와 일치합니다. 각 행렬 요소는 해당 그리드 셀 위치가 점유될 확률에 상응합니다. 1에 가까운 값은 셀에 장애물이 있을 확실성이 높음을 나타냅니다. 0에 가까운 값은 셀이 점유되지 않았고 장애물이 없을 확실성을 나타냅니다.

Occupancy map 객체로, occupancyMap 객체로 지정됩니다.

속성

모두 확장

셀에 장애물이 없는 것으로 간주되는 임계값으로, 0에서 1 사이(구간의 끝점 포함)의 스칼라로 지정됩니다. 이 임계값보다 낮은 확률 값을 갖는 셀은 장애물이 없는 것으로 간주됩니다. 이 속성은 또한 plannerRRT와 같은 객체를 사용한 경로 계획에서 비어 있는 위치를 정의합니다.

데이터형: double

셀이 점유된 것으로 간주되는 임계값으로, 스칼라로 지정됩니다. 이 임계값보다 높은 확률 값을 갖는 셀은 점유된 것으로 간주됩니다.

데이터형: double

확률의 포화 한도로, [min max] 형식의 1×2 실수 값 벡터로 지정됩니다. min 값보다 작은 확률 값은 min으로 포화되고 max 값보다 큰 확률 값은 max로 포화됩니다. 이 속성은 다수의 관측값을 사용할 때 셀의 과포화를 줄입니다.

데이터형: double

읽기 전용 속성입니다.

그리드의 행과 열의 개수로, 순서대로 행 개수와 열 개수를 나타내는 1×2 실수 값 벡터로 저장됩니다.

데이터형: double

읽기 전용 속성입니다.

그리드 해상도로, 그리드 위치의 개수와 크기를 나타내는 스칼라로 저장됩니다(단위: 미터당 셀 개수).

데이터형: double

읽기 전용 속성입니다.

로컬 프레임에서 x 좌표의 최솟값과 최댓값으로, [min max] 형식의, 요소를 2개 가진 가로 벡터로 저장됩니다. 로컬 프레임은 LocalOriginInWorld 속성에 의해 정의됩니다.

데이터형: double

읽기 전용 속성입니다.

로컬 프레임에서 y 좌표의 최솟값과 최댓값으로, [min max] 형식의, 요소를 2개 가진 가로 벡터로 저장됩니다. 로컬 프레임은 LocalOriginInWorld 속성에 의해 정의됩니다.

데이터형: double

읽기 전용 속성입니다.

x 좌표의 세계 범위 최솟값과 최댓값으로, 순서대로 최솟값과 최댓값을 나타내는 1×2 벡터로 저장됩니다.

데이터형: double

읽기 전용 속성입니다.

y 좌표의 세계 범위 최솟값과 최댓값으로, 순서대로 최솟값과 최댓값을 나타내는 1×2 벡터로 저장됩니다.

데이터형: double

그리드 왼쪽 아래 코너의 [x,y] 세계 좌표로, 1×2 벡터로 지정됩니다.

데이터형: double

세계 좌표에서 로컬 프레임의 원점 위치로, 요소를 2개 가진 벡터 [xLocal yLocal]로 지정됩니다. 이동체가 움직일 때 로컬 프레임을 이동하려면 move 함수를 사용하십시오.

데이터형: double

로컬 좌표에서 그리드의 왼쪽 아래 코너 위치로, 요소를 2개 요소를 가진 벡터 [xLocal yLocal]로 지정됩니다.

데이터형: double

맵 밖에 있는 영역을 포함해 지정되지 않은 맵 위치의 디폴트 값으로, 0에서 1 사이(구간의 끝점 포함)의 스칼라로 지정됩니다.

데이터형: double

객체 함수

checkOccupancyCheck if locations are free or occupied
copyCreate copy of 2-D occupancy map
getOccupancyGet occupancy probability of locations
grid2localConvert grid indices to local coordinates
grid2worldConvert grid indices to world coordinates
inflateInflate each occupied location
insertRayInsert ray from laser scan observation
local2gridConvert local coordinates to grid indices
local2worldConvert local coordinates to world coordinates
moveMove map in world frame
occupancyMatrix점유 맵을 행렬로 변환
raycastCompute cell indices along a ray
rayIntersectionFind intersection points of rays and occupied map cells
setOccupancySet occupancy probability of locations
showDisplay 2-D occupancy map
syncWithSync map with overlapping map
updateOccupancyUpdate occupancy probability at locations
world2gridConvert world coordinates to grid indices
world2localConvert world coordinates to local coordinates

예제

모두 축소

비어 있는 점유 그리드 맵을 생성합니다.

map = occupancyMap(10,10,20);

이동체의 자세, 거리, 각도 그리고 레이저 스캔의 최대 거리를 지정합니다.

pose = [5,5,0];
ranges = 3*ones(100,1);
angles = linspace(-pi/2,pi/2,100);
maxrange = 20;

지정된 거리와 각도로 lidarScan 객체를 생성합니다.

scan = lidarScan(ranges,angles);

점유 맵에 레이저 스캔 데이터를 삽입합니다.

insertRay(map,pose,scan,maxrange);

맵을 표시하여 레이저 스캔을 삽입한 결과를 확인합니다.

show(map)

Figure contains an axes object. The axes object with title Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains an object of type image.

이동체 바로 앞 지점의 점유 상태를 확인합니다.

getOccupancy(map,[8 5])
ans = 0.7000

두 번째 측정값을 추가하고 점유 값의 업데이트를 확인합니다. 추가 측정값은 측정값의 신뢰도를 높입니다. 장애물이 없는 지점의 값과 점유된 지점의 값이 더욱 뚜렷하게 구분됩니다.

insertRay(map,pose,scan,maxrange);
show(map)

Figure contains an axes object. The axes object with title Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains an object of type image.

getOccupancy(map,[8 5])
ans = 0.8448

ROS 맵이 담겨 있는 PGM(portable graymap) 파일을 MATLAB에서 사용할 수 있는 occupancyMap으로 변환합니다.

imread를 사용하여 이미지를 가져옵니다. 이미지를 탐색 영역에 맞게 잘라냅니다.

image = imread('playpen_map.pgm');
imageCropped = image(750:1250,750:1250);
imshow(imageCropped)

Figure contains an axes object. The axes object contains an object of type image.

PGM 값은 0에서 255 사이의 uint8형으로 표현됩니다. 자른 이미지를 double형으로 변환하고 각 셀을 255로 나누어 그 값을 정규화합니다. 이 이미지는 장애물을 0에 가까운 값으로 표시합니다. 1에서 정규화된 이미지를 빼서 1이 점유된 공간을 나타내는 점유 값을 얻습니다.

imageNorm = double(imageCropped)/255;
imageOccupancy = 1 - imageNorm;

수정된 맵 이미지를 사용하여 occupancyMap 객체를 생성합니다. 가져온 맵 해상도는 미터당 셀 20개입니다.

map = occupancyMap(imageOccupancy,20);
show(map)

Figure contains an axes object. The axes object with title Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains an object of type image.

제한 사항

점유 값의 해상도 제한은 ±0.001입니다. 점유 값은 로그 오즈 표현을 사용하여 int16형으로 저장됩니다. 이 데이터형은 해상도를 제한하지만 MATLAB®에 대형 맵을 저장할 때 메모리를 절약할 수 있습니다. setOccupancy를 호출한 다음 getOccupancy를 호출하면 반환된 값이 설정한 값과 다를 수 있습니다. 자세한 내용은 Occupancy Grids 항목의 로그 오즈 표현 섹션을 참조하십시오.

메모리 크기가 제한적이라면 대신 binaryOccupancyMap을 사용해 보십시오. 이진 점유 맵은 이진 값으로 사용하므로 메모리를 더 적게 사용하지만 Navigation Toolbox™ 알고리즘 및 다른 애플리케이션에서도 여전히 작동합니다.

확장 기능

버전 내역

R2019b에 개발됨