Main Content

buildMap

라이다 스캔을 이용해 점유 맵 작성하기

설명

map = buildMap(scans,poses,mapResolution,maxRange)는 주어진 poses에 라이다 scans을 삽입하여 occupancyMap을 만듭니다. 결과로 생성될 맵의 해상도, mapResolution, 라이다 센서의 최대 거리 maxRange를 지정합니다.

예제

예제

모두 축소

buildMap 함수는 라이다 스캔 측정값 및 연관된 자세를 사용하여 점유 그리드를 lidarScan 객체 및 연관된 [x y theta] 자세로 구축하고 occupancyMap을 작성합니다.

주차장에 있는 로봇의 센서에서 수집한 스캔 추정값과 자세 추정값을 불러옵니다. 수집한 데이터는 lidarSLAM 알고리즘을 사용하여 상호 연관됩니다. 이 알고리즘은 스캔을 연결하고 로봇의 전체 궤적에 걸쳐 자세를 조정하기 위해 스캔 매칭을 수행합니다. 스캔과 자세의 길이가 동일한지 확인합니다.

load scansAndPoses.mat
length(scans) == length(poses)
ans = logical
   1

맵을 작성합니다. 스캔과 자세를 buildMap 함수에 지정하고 원하는 맵 해상도(미터당 셀 10개)와 라이다의 최대 거리(19.2미터)를 포함시킵니다. 각 스캔이 연관된 자세에 추가되고 점유 그리드의 확률 값이 업데이트됩니다.

occMap = buildMap(scans,poses,10,19.2);
figure
show(occMap)
title('Occupancy Map of Garage')

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

lidarSLAM 객체를 사용하여 라이다 스캔을 반복적으로 추가하고 비교하여 로봇 궤적의 최적화된 자세 그래프를 작성합니다. 연관된 자세와 스캔을 이용해 점유 맵을 얻으려면 buildMap 함수를 사용합니다.

데이터 불러오기 및 SLAM 알고리즘 설정하기

lidarScan 객체로 구성된 셀형 배열을 불러옵니다. 라이다 스캔은 주차장에 있는 ClearPath Robotics®의 Husky® 로봇에서 수집되었습니다. 일반적으로 라이다 스캔은 고주파수로 촬영되며, 촬영된 모든 스캔이 SLAM에 필요한 것은 아닙니다. 따라서 40개 스캔마다 하나씩 선택하여 스캔을 다운샘플링합니다.

load garage_fl1_southend.mat scans
scans = scans(1:40:end);

SLAM 알고리즘을 설정하려면 라이다 거리, 맵 해상도, 루프 폐쇄 임계값, 검색 반경을 지정합니다. 이러한 파라미터를 사용자의 로봇과 환경에 맞게 조정합니다. 이러한 파라미터로 lidarSLAM 객체를 만듭니다.

maxRange = 19.2; % meters
resolution = 10; % cells per meter

slamObj = lidarSLAM(resolution,maxRange);
slamObj.LoopClosureThreshold = 360;
slamObj.LoopClosureSearchRadius = 8;

반복적으로 스캔 추가하기

for 루프를 사용하여 SLAM 객체에 스캔을 추가합니다. 객체는 스캔 매칭을 사용하여, 추가된 각 스캔을 이전에 추가된 스캔과 비교합니다. 맵을 개선하기 위해 객체는 루프 폐쇄를 탐지할 때마다 자세 그래프를 최적화합니다. 10개 스캔마다, 저장된 자세와 스캔을 표시합니다.

for i = 1:numel(scans)

    addScan(slamObj,scans{i});
    
    if rem(i,10) == 0
        show(slamObj);
    end
end
title("Lidar Scans and Poses")
xlabel("X [meters]")
ylabel("Y [meters]")

Figure contains an axes object. The axes object with title Lidar Scans and Poses, xlabel X [meters], ylabel Y [meters] contains 121 objects of type line.

점유 맵 보기

모든 스캔을 SLAM 객체에 추가한 후 스캔과 자세를 사용해 occupancyMap을 호출하여 buildMap 맵을 작성합니다. SLAM 객체에 사용한 것과 동일한 맵 해상도와 최대 거리를 사용합니다.

[scansSLAM,poses] = scansAndPoses(slamObj);
occMap = buildMap(scansSLAM,poses,resolution,maxRange);
figure
show(occMap)
title('Occupancy Map of Garage')

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

입력 인수

모두 축소

맵 작성에 사용되는 라이다 스캔으로, lidarScan 객체로 구성된 셀형 배열로 지정됩니다.

라이다 스캔의 자세로, n×3 행렬로 지정됩니다. 각 행은 [x y theta] 벡터이며, 이는 스캔의 xy 위치와 방향 각도를 나타냅니다.

출력 occupancyMap 맵의 해상도로, 양의 정수로 지정됩니다(단위: 미터당 셀 개수).

라이다 센서의 최대 거리로, 양의 스칼라로 지정됩니다(단위: 미터). 이 거리를 벗어난 scans의 점은 무시됩니다.

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 버전에서는 쉼표를 사용하여 각 이름과 값을 구분하고 따옴표로 Name을 묶으십시오.

예: ['MapWidth',10]

점유 그리드의 너비로, 'MapWidth'와 함께 양의 스칼라가 쉼표로 구분되어 지정됩니다. 이 값이 지정되지 않은 경우 맵은 모든 레이저 스캔에 맞도록 자동으로 스케일링됩니다.

점유 그리드의 높이로, 'MapHeight'와 함께 양의 스칼라가 쉼표로 구분되어 지정됩니다. 이 값이 지정되지 않은 경우 맵은 모든 레이저 스캔에 맞도록 자동으로 스케일링됩니다.

출력 인수

모두 축소

점유 맵으로, occupancyMap 객체로 반환됩니다.

버전 내역

R2019b에 개발됨