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')
라이다 스캔을 사용하여 SLAM 수행하기
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]")
점유 맵 보기
모든 스캔을 SLAM 객체에 추가한 후 스캔과 자세를 사용해 occupancyMap
을 호출하여 buildMap
맵을 작성합니다. SLAM 객체에 사용한 것과 동일한 맵 해상도와 최대 거리를 사용합니다.
[scansSLAM,poses] = scansAndPoses(slamObj);
occMap = buildMap(scansSLAM,poses,resolution,maxRange);
figure
show(occMap)
title('Occupancy Map of Garage')
입력 인수
scans
— 라이다 스캔
lidarScan
객체로 구성된 셀형 배열
맵 작성에 사용되는 라이다 스캔으로, lidarScan
객체로 구성된 셀형 배열로 지정됩니다.
poses
— 라이다 스캔의 자세
n×3 행렬
라이다 스캔의 자세로, n×3 행렬로 지정됩니다. 각 행은 [x y theta]
벡터이며, 이는 스캔의 xy 위치와 방향 각도를 나타냅니다.
mapResolution
— 점유 그리드의 해상도
양의 정수
출력 occupancyMap
맵의 해상도로, 양의 정수로 지정됩니다(단위: 미터당 셀 개수).
maxRange
— 라이다 센서의 최대 거리
양의 스칼라
라이다 센서의 최대 거리로, 양의 스칼라로 지정됩니다(단위: 미터). 이 거리를 벗어난 scans
의 점은 무시됩니다.
이름-값 인수
선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN
으로 지정합니다. 여기서 Name
은 인수 이름이고 Value
는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.
R2021a 이전 버전에서는 쉼표를 사용하여 각 이름과 값을 구분하고 따옴표로 Name
을 묶으십시오.
예: ['MapWidth',10]
MapWidth
— 점유 그리드의 너비
양의 스칼라
점유 그리드의 너비로, 'MapWidth'
와 함께 양의 스칼라가 쉼표로 구분되어 지정됩니다. 이 값이 지정되지 않은 경우 맵은 모든 레이저 스캔에 맞도록 자동으로 스케일링됩니다.
MapHeight
— 점유 그리드의 높이
양의 스칼라
점유 그리드의 높이로, 'MapHeight'
와 함께 양의 스칼라가 쉼표로 구분되어 지정됩니다. 이 값이 지정되지 않은 경우 맵은 모든 레이저 스캔에 맞도록 자동으로 스케일링됩니다.
출력 인수
map
— 점유 맵
occupancyMap
객체
점유 맵으로, occupancyMap
객체로 반환됩니다.
버전 내역
R2019b에 개발됨
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)