SLAM
지도가 없는데, 지도 위의 내 위치는 어떻게 알까?
닭과 달걀
지도와 위치는 서로가 필요합니다
위치를 찾으려면 지도가 있어야 하고, 지도를 그리려면 내가 어디서 봤는지 알아야 합니다. 이 둘을 한꺼번에 푸는 것이 SLAM(Simultaneous Localization and Mapping, 동시적 위치 추정과 지도 작성)입니다.
점유 격자
지도는 칸으로 그립니다
ROS에서 흔히 쓰는 지도는 바닥을 바둑판처럼 나눈 점유 격자(occupancy grid)입니다. 칸마다 빈 곳(0), 벽(100), 모름(-1)을 적고, nav_msgs/msg/OccupancyGrid 메시지로 /map 토픽에 실립니다.
한 칸의 크기를 해상도(resolution)라고 하고, slam_toolbox 기본값은 0.05 m입니다.
칸 채우기
빔이 지나간 칸은 비고, 닿은 칸은 벽
라이다(LiDAR)는 빛을 쏘아 돌아오는 시간으로 거리를 잽니다(/scan, 4강 7편). 빔이 지나간 칸은 비어 있고, 빔이 멈춘 칸에는 무언가 있습니다. 기둥 뒤처럼 빔이 닿지 않은 칸은 모름으로 남습니다.
이어 붙이기
움직이며 지도를 넓힙니다
로봇이 움직이면 새 자리에서 새 스캔을 얻습니다. SLAM은 스캔을 찍은 자리에 맞춰 지도에 이어 붙입니다. 그래서 구석구석 돌수록 모름 칸이 줄어듭니다.
스캔 매칭
새 스캔을 지도에 맞춰 위치를 고칩니다
바퀴로 센 위치에 새 스캔을 그대로 놓으면 벽과 살짝 어긋납니다. SLAM은 스캔이 지금까지 그린 지도와 가장 잘 겹치는 자리를 찾아 위치를 고칩니다. 이것을 스캔 매칭(scan matching)이라고 합니다.
고친 만큼을 map→odom 변환으로 냅니다(1편). 그리는 지도는 /map으로 냅니다.
루프 클로저
처음 자리로 돌아오면 고리를 닫습니다
스캔 매칭으로 고쳐도 오차는 조금씩 남습니다. 한 바퀴 돌아 아는 곳을 다시 보면, SLAM은 "여기는 출발점"임을 알아채고 지나온 길 전체를 다시 맞춥니다. 이것을 루프 클로저(loop closure)라고 합니다.
slam_toolbox는 지나온 자리들을 점과 선의 그래프로 기억해 두었다가 한꺼번에 고칩니다.
다음 편