Skip to main content
Summary

지도 없이 길을 찾는 로봇의 딜레마

로봇을 처음 보는 사무실 한가운데 내려놓았다고 상상해 보자. 로봇 앞에는 복도가 있고, 오른쪽에는 회의실 문이 있으며, 왼쪽에는 책장이 길게 놓여 있다. 우리는 이 장면을 보며 자연스럽게 생각한다. "복도는 저쪽으로 이어지고, 나는 지금 입구 근처에 있군."

하지만 로봇에게 이 상황은 훨씬 까다롭다. 로봇은 먼저 자신이 어디 있는지 알아야 지도를 만들 수 있다. 그런데 자신이 어디 있는지 알려면 이미 지도가 있어야 한다. 마치 처음 가는 도시에서 "내 위치를 알려면 지도가 필요하고, 지도를 만들려면 내 위치를 알아야 하는" 상황과 같다.

SLAM은 바로 이 딜레마를 푸는 기술이다. SLAM은 Simultaneous Localization and Mapping의 약자로, 우리말로는 동시적 위치 추정 및 지도 작성이라고 부른다. 이름 그대로 로봇이 움직이면서 자기 위치를 추정하고, 동시에 주변 환경의 지도를 만들어 간다.

여기서 중요한 단어는 '동시에'다. 지도 작성과 위치 추정은 따로 떨어진 작업이 아니다. 로봇의 위치 추정이 틀리면 지도가 휘어진다. 지도가 틀리면 다음 위치 추정도 틀어진다. SLAM은 이 둘을 계속 주고받으며 조금씩 더 그럴듯한 답을 찾아가는 과정이다.

SLAM이란 무엇인가

위치 추정과 지도 작성은 왜 동시에 해야 할까

지도 작성만 생각해 보자. 로봇이 LiDAR로 벽까지의 거리를 측정했다고 하자. 전방 2미터에 벽이 있다는 사실만으로는 충분하지 않다. 그 벽을 지도 어디에 그려야 할지 알아야 한다. 그러려면 로봇의 현재 위치와 방향이 필요하다.

반대로 위치 추정만 생각해 보자. 로봇이 "나는 복도 중앙에 있는 것 같다"고 판단하려면 주변에 어떤 벽과 문, 코너가 있는지 비교할 기준이 필요하다. 그 기준이 바로 지도다.

즉, 로봇은 다음 두 질문에 동시에 답해야 한다.

  • 나는 지금 어디에 있는가?

  • 주변 환경은 어떤 모양인가?

  • 방금 본 벽과 물체는 지도 어디에 놓아야 하는가?

  • 예전에 지나간 장소와 지금 본 장소는 같은 곳인가?

이 질문들은 서로 꼬리를 문다. 로봇은 바퀴가 얼마나 돌았는지 보고 대략 이동량을 추정한다. 이것을 오도메트리라고 한다. 하지만 바퀴는 미끄러질 수 있고, 바닥 재질에 따라 실제 이동 거리와 계산된 이동 거리가 달라질 수 있다. 처음에는 몇 센티미터 차이에 불과하던 오차가 복도 끝까지 가면 수십 센티미터가 되고, 건물 한 바퀴를 돌고 나면 벽 하나가 삐뚤어질 정도로 커질 수 있다.

SLAM은 이 오차를 그냥 방치하지 않는다. LiDAR, 카메라, IMU 같은 센서 관측을 이용해 "내가 생각한 위치와 실제로 보이는 환경이 맞는가?"를 계속 확인한다. 예상과 관측이 다르면 위치 추정을 보정하고, 보정된 위치를 바탕으로 지도를 다시 갱신한다.

이 과정은 사람이 낯선 건물을 걸어 다닐 때와도 비슷하다. 처음에는 "아마 이쪽이 입구 방향이겠지"라고 추측한다. 그러다가 아까 본 자판기나 계단을 다시 만나면 "아, 여기 아까 지나간 곳이구나" 하고 머릿속 지도를 고친다. SLAM도 이런 식으로 추측하고, 관찰하고, 다시 고친다.

SLAM이 다루는 기본 재료

SLAM을 거대한 마법처럼 느낄 필요는 없다. 실제로는 몇 가지 재료가 반복해서 들어간다. 로봇은 센서를 읽고, 현재 상태를 예측하고, 주변과 비교하고, 지도를 갱신한다. 그리고 이미 방문한 장소를 다시 알아보면 전체 지도를 크게 한 번 바로잡는다.

SLAM 알고리즘의 핵심 구성 요소는 보통 다음과 같이 정리할 수 있다.

  • 센서 입력: LiDAR의 거리 측정값, 카메라 이미지, IMU의 가속도와 각속도, 바퀴 오도메트리 같은 데이터다.

  • 상태 추정: 로봇의 현재 위치와 방향을 추정하는 과정이다. 2D 이동 로봇에서는 보통 x, y, theta로 표현한다.

  • 지도 갱신: 추정한 위치를 기준으로 벽, 장애물, 빈 공간 같은 정보를 지도에 반영한다.

  • 루프 클로저: 예전에 지나간 장소를 다시 알아보고, 그동안 누적된 오차를 한꺼번에 줄이는 과정이다.

이 네 가지가 SLAM의 큰 뼈대다. 알고리즘마다 수학적 방법은 다르다. 어떤 방식은 확률 필터를 사용하고, 어떤 방식은 그래프 최적화를 사용하며, 어떤 방식은 시각 특징점을 중심으로 동작한다. 하지만 전체 흐름은 비슷하다. 로봇이 움직이고, 센서로 보고, 예측과 관측의 차이를 줄이며, 지도를 조금씩 더 낫게 만든다.

로봇의 상태는 무엇을 뜻할까

SLAM에서 말하는 상태는 로봇이 알고 싶어 하는 중요한 값들의 묶음이다. 가장 단순한 2D 이동 로봇을 생각하면 상태는 로봇의 위치와 방향이다.

pose = (x, y, theta)

여기서 x와 y는 평면 위의 위치이고, theta는 로봇이 바라보는 방향이다. 로봇이 실내 바닥을 돌아다니는 경우에는 이 정도 표현만으로도 많은 일을 할 수 있다. 복도에서 앞으로 이동하고, 코너에서 회전하고, 목표 지점까지 가는 데 필요한 기본 정보가 모두 들어 있기 때문이다.

물론 현실의 로봇은 더 복잡할 수 있다. 드론처럼 3차원 공간을 날아다니면 높이와 자세가 필요하다. 카메라 기반 SLAM에서는 카메라의 자세, 특징점의 위치, 센서 보정값까지 상태에 포함될 수 있다. 하지만 처음 SLAM을 이해할 때는 너무 멀리 갈 필요가 없다. 이 책에서 다루는 이동 로봇의 핵심은 먼저 map, odom, base_link 사이의 관계를 이해하는 것이다.

앞에서 TF를 배웠을 때 map, odom, base_link라는 좌표계를 다루었다. SLAM에서는 이 관계가 매우 중요하다. 바퀴 오도메트리는 보통 odom -> base_link 변환을 만든다. 이 변환은 짧은 시간에는 부드럽고 쓸 만하지만, 시간이 지날수록 오차가 누적된다. SLAM은 센서 관측을 이용해 더 큰 기준 좌표계인 map을 만들고, map -> odom 변환을 조정한다.

이 구조를 간단히 그리면 다음과 같다.

map  ->  odom  ->  base_link  ->  laser

odom -> base_link는 로봇의 바퀴와 구동계가 알려 주는 연속적인 움직임이다. map -> odom은 SLAM이 전체 지도 기준으로 오차를 보정하는 역할을 한다. 그래서 로봇은 순간적으로 부드럽게 움직이면서도, 장기적으로는 지도 위에서 위치가 크게 벗어나지 않도록 유지할 수 있다.

오도메트리는 왜 혼자서는 부족할까

오도메트리는 로봇에게 아주 중요한 감각이다. 바퀴가 얼마나 돌았는지, 로봇이 어느 방향으로 회전했는지 알려 준다. 사람으로 치면 눈을 감고 걸으면서 "세 걸음 앞으로 갔고, 오른쪽으로 조금 돌았다"고 기억하는 감각에 가깝다.

문제는 이 감각이 완벽하지 않다는 데 있다. 바퀴가 헛돌면 로봇은 실제보다 더 많이 이동했다고 착각할 수 있다. 카펫과 타일처럼 바닥 마찰이 다른 곳을 지나면 회전량 계산이 조금씩 어긋날 수 있다. 두 바퀴의 지름이 아주 미세하게 달라도 긴 거리를 이동하면 방향 오차가 커진다.

이런 오차는 한 번 생기면 사라지지 않고 누적된다. 1초에 1밀리미터씩만 틀려도 10분이면 꽤 큰 차이가 된다. 특히 회전 오차는 더 위험하다. 방향이 1도만 틀어져도 멀리 갈수록 위치 오차가 크게 벌어진다. 그래서 오도메트리만 믿고 지도를 만들면 벽이 휘거나, 닫혀야 할 복도가 닫히지 않거나, 같은 방이 두 개처럼 그려질 수 있다.

SLAM은 오도메트리를 버리지 않는다. 오히려 오도메트리를 첫 번째 추측으로 사용한다. "아마 이만큼 움직였을 것이다"라는 예측을 오도메트리로 만들고, LiDAR나 카메라로 "정말 그런가?"를 확인한다. 즉, 오도메트리는 빠르고 부드러운 예측을 담당하고, 외부 센서 관측은 그 예측을 현실에 맞게 잡아 주는 닻 역할을 한다.

LiDAR 관측으로 오차를 바로잡는 방식

2D LiDAR는 로봇 주변을 한 바퀴 훑으며 거리 값을 측정한다. 결과는 /scan 토픽으로 들어오는 부채꼴 또는 원형의 거리 배열이다. 가까운 벽, 열린 문, 튀어나온 책상 다리 같은 구조가 스캔 안에 나타난다.

로봇이 조금 이동한 뒤 새 스캔을 얻었다고 하자. SLAM 알고리즘은 이전 스캔이나 이미 만들어진 지도와 새 스캔을 비교한다. 만약 로봇이 오도메트리상으로는 1미터 전진했다고 했는데, LiDAR 스캔을 지도에 맞춰 보니 0.92미터 전진한 위치가 더 자연스럽다면 위치 추정을 조정할 수 있다. 이처럼 스캔과 스캔, 또는 스캔과 지도를 서로 맞추는 과정을 흔히 스캔 매칭이라고 한다.

스캔 매칭은 퍼즐 조각을 맞추는 일과 비슷하다. 현재 스캔의 벽 모양을 기존 지도 위에 이리저리 조금씩 옮기고 돌려 보면서 가장 잘 겹치는 위치를 찾는다. 잘 맞는 위치를 찾으면 "로봇은 아마 여기 있었을 것이다"라고 추정한다. 그리고 그 위치를 기준으로 지도를 갱신한다.

물론 LiDAR도 만능은 아니다. 유리벽은 제대로 감지되지 않을 수 있고, 긴 직선 복도에서는 앞뒤 위치가 헷갈릴 수 있다. 사람이 지나가거나 의자가 움직이면 지도에 일시적인 잡음이 생길 수도 있다. 그래서 좋은 SLAM은 하나의 센서만 무조건 믿기보다 여러 정보의 신뢰도를 적절히 섞는다.

카메라 관측으로 위치를 추정하는 방식

카메라 기반 SLAM은 LiDAR와 다른 방식으로 세상을 본다. LiDAR가 거리값의 형태로 벽과 물체를 측정한다면, 카메라는 이미지 안에서 눈에 띄는 점과 패턴을 찾는다. 예를 들어 문틀 모서리, 포스터의 구석, 책상 모서리처럼 여러 프레임에서 반복해서 찾을 수 있는 시각적 단서를 특징점이라고 부른다.

로봇이 움직이면 카메라 이미지 속 특징점의 위치가 변한다. SLAM 알고리즘은 이 변화를 이용해 카메라가 어떻게 이동했는지 추정한다. RGB-D 카메라처럼 깊이 정보를 함께 얻을 수 있는 센서를 사용하면 각 픽셀 또는 특징점까지의 거리도 알 수 있어 3차원 구조를 만들기 쉽다. 스테레오 카메라는 두 개의 카메라 차이를 이용해 깊이를 추정한다.

Visual SLAM은 풍부한 정보를 얻을 수 있다는 장점이 있다. LiDAR가 단순한 거리 구조를 본다면, 카메라는 물체의 색과 질감, 장면의 특징을 함께 본다. 하지만 조명 변화, 모션 블러, 반복 무늬, 특징이 거의 없는 흰 벽에는 약해질 수 있다. 카메라 렌즈가 흔들리거나 빠르게 회전하면 이미지가 흐려져 추정이 어려워지기도 한다.

그래서 실내 이동 로봇에서는 2D LiDAR SLAM이 입문과 실전에 모두 많이 쓰인다. 구조가 비교적 단순하고, Nav2 같은 2D 내비게이션 시스템과 연결하기 쉽기 때문이다. 반면 카메라 기반 SLAM은 3D 환경 이해, AR, 드론, 시각 기반 위치 추정처럼 더 풍부한 장면 해석이 필요한 분야에서 강점을 가진다.

지도를 갱신한다는 말의 의미

SLAM에서 지도를 만든다고 할 때, 로봇이 예쁜 평면도를 그린다고 생각하면 조금 다르다. 알고리즘이 다루는 지도는 보통 계산하기 쉬운 자료구조다. 그중 가장 대표적인 형태가 점유 격자 지도다.

점유 격자 지도는 공간을 작은 칸으로 나눈다. 각 칸은 "비어 있음", "장애물이 있음", "아직 모름" 같은 상태를 가진다. LiDAR가 어떤 방향으로 레이저를 쏘아 벽에 닿았다면, 로봇과 벽 사이의 칸들은 비어 있을 가능성이 높고, 레이저가 멈춘 지점의 칸은 장애물일 가능성이 높다. 이런 관측이 쌓이면 점점 지도가 선명해진다.

예를 들어 로봇이 복도를 한 번 지나갈 때는 일부 벽만 보일 수 있다. 반대 방향으로 돌아오면 이전에 보지 못한 벽면이나 문 근처가 추가된다. 여러 번 관측된 벽은 더 확실한 장애물로 남고, 한 번 스쳐 지나간 잡음은 시간이 지나며 덜 중요해질 수 있다.

지도 갱신은 단순히 새 데이터를 덧칠하는 일이 아니다. 로봇의 위치 추정이 바뀌면 과거 관측의 배치도 달라질 수 있다. 특히 루프 클로저가 일어나 전체 경로가 보정되면 지도 모양도 함께 바로잡힌다. 그래서 SLAM에서 지도와 위치는 끝까지 서로 영향을 주고받는다.

루프 클로저: 다시 만난 장소가 지도를 구한다

SLAM에서 가장 극적인 순간은 루프 클로저다. 루프 클로저는 로봇이 예전에 지나간 장소를 다시 인식하는 과정이다. 이름 그대로 이동 경로의 고리가 닫히는 순간이다.

로봇이 사무실 복도를 한 바퀴 돌아 출발점 근처로 돌아왔다고 하자. 오도메트리 오차가 누적되어 로봇은 자신이 출발점에서 50센티미터 떨어진 곳에 있다고 믿을 수 있다. 지도상으로는 복도가 살짝 어긋나 있고, 닫혀야 할 사각형 경로가 닫히지 않을 수도 있다.

그런데 LiDAR 스캔이나 카메라 특징을 비교해 보니 지금 보고 있는 장소가 처음 출발했던 장소와 매우 비슷하다. SLAM은 "아, 여기는 새로운 장소가 아니라 예전에 방문한 곳이구나"라고 판단한다. 그러면 전체 이동 경로를 다시 조정한다. 마치 고무줄로 만든 경로를 양쪽에서 잡아당겨 맞추듯이, 그동안 조금씩 쌓였던 오차를 여러 구간에 나누어 보정한다.

루프 클로저가 성공하면 지도 품질이 크게 좋아진다. 벽이 더 곧아지고, 복도가 자연스럽게 닫히며, 같은 장소가 중복으로 그려지는 문제가 줄어든다. 반대로 루프 클로저가 잘못되면 전혀 다른 장소를 같은 장소로 착각해 지도가 심하게 찌그러질 수 있다. 그래서 SLAM 알고리즘은 장소 인식의 확실성을 매우 중요하게 다룬다.

2D 점유 격자 지도와 3D 포인트클라우드 지도

자율주행 로봇에서 지도가 항상 같은 형태인 것은 아니다. 실내 바닥을 돌아다니는 청소 로봇과 창고 로봇은 대개 2D 지도로도 충분하다. 반면 드론, 다층 구조를 보는 로봇, 복잡한 3차원 장애물을 다루는 로봇은 3D 지도가 필요할 수 있다.

2D 지도와 3D 지도는 목적과 비용이 다르다.

구분2D 점유 격자 지도3D 포인트클라우드 지도
표현 방식바닥 평면을 작은 격자로 나누고 점유 여부를 표시공간상의 점들을 3차원 좌표로 저장
주 사용 센서2D LiDAR, 깊이 투영 데이터3D LiDAR, RGB-D 카메라, 스테레오 카메라
장점계산이 가볍고 Nav2 같은 2D 내비게이션과 연결하기 쉽다높이와 입체 구조를 표현할 수 있다
단점책상 상판, 매달린 장애물, 경사 구조 같은 높이 정보를 직접 표현하기 어렵다데이터가 크고 계산 비용이 높다
대표 용도실내 이동 로봇, 창고 로봇, TurtleBot 실습드론, 3D 공간 인식, 복잡한 환경 모델링

2D 점유 격자 지도는 이동 로봇에게 매우 실용적이다. 로봇이 바닥 위를 움직인다면 중요한 질문은 대개 "이 칸을 지나갈 수 있는가?"이다. 벽이 있으면 못 지나가고, 빈 복도면 지나갈 수 있다. Nav2의 전역 경로 계획도 이런 2D 지도와 잘 맞는다.

3D 포인트클라우드 지도는 더 풍부하다. 계단, 경사로, 책상 위 물체, 천장 구조 같은 입체 정보를 담을 수 있다. 하지만 모든 점을 저장하고 처리하려면 메모리와 계산량이 늘어난다. 그래서 실제 시스템에서는 3D 데이터를 그대로 쓰기도 하고, 필요에 따라 2D costmap으로 투영해 내비게이션에 사용하기도 한다.

처음 ROS2로 자율주행 이동 로봇을 배운다면 2D 점유 격자 지도부터 시작하는 것이 좋다. 개념이 명확하고, LiDAR SLAM과 Nav2로 이어지는 흐름이 자연스럽기 때문이다. 이 책의 뒤쪽 프로젝트도 이 흐름을 중심으로 진행한다.

ROS2에서 SLAM은 어디에 놓일까

ROS2 시스템에서 SLAM은 하나의 거대한 단독 프로그램이라기보다 여러 노드와 토픽 사이에 놓인 중요한 처리 모듈이다. SLAM 노드는 센서 데이터를 구독하고, TF를 읽고, 지도를 발행하고, 지도 기준 위치 보정을 TF로 내보낸다.

전형적인 2D LiDAR SLAM 흐름은 다음과 같다.

/scan   ─┐
/odom   ─┼─> SLAM 노드 ──> /map
/tf     ─┘                 map -> odom TF

여기서 /scan은 LiDAR 데이터다. /odom은 바퀴 오도메트리에서 나온 이동 추정이다. /tf는 센서와 로봇 본체 사이의 좌표 관계를 알려 준다. SLAM 노드는 이 정보를 사용해 /map을 만들고, 로봇이 지도 위에서 어디에 있는지 맞추기 위해 map -> odom 변환을 발행한다.

이 구조를 이해하면 SLAM 디버깅이 훨씬 쉬워진다. 지도가 아예 나오지 않는다면 /scan이 들어오는지 확인해야 한다. 지도는 나오지만 로봇 위치가 이상하다면 /odom이나 TF가 잘못되었을 수 있다. 스캔이 RViz에서 로봇과 떨어져 보인다면 LiDAR의 frame_id와 TF 연결을 확인해야 한다. 결국 SLAM 문제의 상당수는 센서, 오도메트리, TF, 시간 설정 중 하나에서 출발한다.

이전 장에서 rosbag을 다룬 이유도 여기에 있다. 실제 주행 데이터를 bag으로 기록해 두면 같은 데이터를 여러 SLAM 설정으로 반복 재생해 볼 수 있다. 시뮬레이션이나 bag 재생에서는 시간 기준이 중요하므로, SLAM 노드에는 use_sim_time을 켜고 bag은 /clock을 함께 재생하는 식의 흐름을 사용한다. 이렇게 하면 알고리즘은 기록된 시간에 맞춰 센서 데이터를 처리할 수 있다.

slam_toolbox와 Cartographer 개관

ROS2에서 2D SLAM을 시작할 때 자주 만나는 도구가 slam_toolbox다. slam_toolbox는 2D LiDAR 기반 SLAM에 많이 쓰이며, ROS2와 Nav2 생태계에서 함께 사용하기 좋다. 온라인으로 로봇을 움직이며 지도를 만들 수도 있고, 기록된 bag 데이터를 이용해 나중에 지도를 만들 수도 있다. 이미 만든 지도를 기준으로 위치 추정에 가깝게 사용하는 모드도 제공한다.

slam_toolbox를 사용할 때 핵심은 입력과 출력의 관계를 이해하는 것이다. LiDAR 스캔이 들어오고, 오도메트리와 TF가 맞아야 하며, 결과로 /map과 map -> odom 변환이 나온다. 설정 파일에서는 프레임 이름, 스캔 토픽 이름, 지도 해상도, 스캔 매칭 관련 파라미터 등을 조정한다. 초보자에게 가장 흔한 실수는 알고리즘 자체보다 프레임 이름이 서로 맞지 않거나, 시뮬레이션 시간 설정이 빠지거나, LiDAR 토픽 이름이 다른 경우다.

또 다른 유명한 SLAM 도구로는 Cartographer가 있다. Cartographer는 2D와 3D SLAM을 모두 염두에 둔 그래프 기반 SLAM 시스템으로 알려져 있다. 여러 센서 정보를 조합하고, 부분 지도인 서브맵을 만들며, 루프 클로저를 통해 전체 지도를 최적화하는 구조를 가진다. 다만 ROS2 배포판이나 프로젝트 환경에 따라 설치와 지원 상태가 다를 수 있으므로, 실제 프로젝트에서는 사용하려는 ROS2 버전과 패키지 상태를 먼저 확인해야 한다.

이 외에도 카메라나 RGB-D 센서를 활용하는 Visual SLAM 계열 도구들이 있다. 예를 들어 특징점이나 이미지 매칭, 깊이 정보를 활용해 3D 구조를 추정하는 방식이다. 하지만 이 책의 큰 흐름은 이동 로봇의 실내 자율주행이므로, 먼저 2D LiDAR SLAM으로 안정적인 지도를 만들고 그 지도를 Nav2로 연결하는 데 집중한다.

SLAM 결과가 좋지 않을 때 보이는 증상

SLAM은 센서 데이터가 들어온다고 자동으로 완벽한 지도를 만들어 주는 버튼이 아니다. 로봇의 움직임, 센서 품질, TF, 시간, 환경 구조가 모두 결과에 영향을 준다. 지도가 이상하게 나올 때는 증상을 보고 원인을 좁혀 가야 한다.

자주 만나는 증상은 다음과 같다.

  • 벽이 휘어진다: 오도메트리 오차가 크거나 스캔 매칭이 안정적으로 되지 않을 수 있다.

  • 같은 복도가 두 겹으로 그려진다: 루프 클로저가 실패했거나 로봇 위치 추정이 크게 틀어졌을 수 있다.

  • 스캔이 로봇 모델과 어긋나 보인다: LiDAR의 frame_id와 TF 설정이 맞지 않을 가능성이 크다.

  • 지도는 나오지만 로봇이 순간이동한다: 시간 설정, TF 발행 주기, 루프 클로저 보정이 영향을 줄 수 있다.

  • 일부 장애물이 계속 지도에 남는다: 움직이는 사람이나 임시 장애물을 정적 구조로 잘못 반영했을 수 있다.

이런 문제를 해결할 때는 알고리즘 파라미터부터 만지기보다 기본 신호부터 확인하는 습관이 좋다. /scan이 정상인지, /odom이 부드럽게 증가하는지, TF 트리가 끊기지 않았는지, map, odom, base_link, laser 프레임 이름이 서로 일관되는지 먼저 본다. 좋은 지도는 좋은 입력에서 나온다.

SLAM과 Localization은 다르다

SLAM을 배우다 보면 Localization이라는 단어도 자주 만난다. 둘은 비슷해 보이지만 목적이 다르다.

SLAM은 지도가 없는 상태에서 시작해 지도를 만들면서 위치를 추정한다. 반면 Localization은 이미 있는 지도 위에서 현재 위치만 추정한다. 예를 들어 처음 건물에 들어가 지도를 만드는 과정은 SLAM이다. 다음 날 저장해 둔 지도를 불러와 그 위에서 로봇의 현재 위치를 찾는 과정은 Localization이다.

Nav2를 사용할 때 이 차이는 중요하다. 자율주행을 하려면 로봇은 지도 위에서 자신의 위치를 알고 있어야 한다. 처음에는 SLAM으로 지도를 만들고, 그 지도를 저장한다. 이후 실제 주행에서는 저장된 지도를 불러오고 AMCL 같은 위치 추정 노드를 사용해 현재 위치를 추정한다. 이 흐름이 5부와 6부, 그리고 종합 프로젝트를 잇는 큰 줄기다.

SLAM은 탐험가의 일에 가깝고, Localization은 이미 만든 지도를 들고 길을 찾는 일에 가깝다. 탐험가는 지도를 그리면서 걷고, 길잡이는 지도를 보며 현재 위치를 찾는다. 로봇 시스템에서는 두 역할이 모두 필요하다.

이 장에서 잡아야 할 핵심 그림

SLAM을 처음 배울 때 모든 수식을 이해할 필요는 없다. 먼저 머릿속에 큰 그림을 만들어야 한다. 로봇은 오도메트리로 움직임을 예측한다. LiDAR나 카메라로 주변을 관측한다. 예측과 관측이 어긋나면 위치를 보정한다. 보정된 위치를 기준으로 지도를 갱신한다. 예전에 지나간 장소를 다시 만나면 루프 클로저로 전체 오차를 줄인다.

이 흐름을 한 줄로 정리하면 다음과 같다.

움직임 예측 -> 센서 관측 -> 위치 보정 -> 지도 갱신 -> 루프 클로저

ROS2에서는 이 흐름이 토픽과 TF로 드러난다. /scan, /odom, /tf가 SLAM 노드로 들어가고, /map과 map -> odom 변환이 나온다. RViz에서 지도와 로봇, LiDAR 스캔을 함께 보면 SLAM이 추상적인 수학 문제가 아니라 살아 있는 로봇 시스템의 일부라는 것을 느낄 수 있다.

다음 장에서는 이 중에서 가장 기본이 되는 오도메트리를 더 깊게 살펴본다. 바퀴 회전량으로 이동 거리를 어떻게 추정하는지, 왜 오차가 생기는지, 그 오차가 SLAM과 Nav2 전체에 어떤 영향을 주는지 이해하게 될 것이다. SLAM의 화려한 지도 뒤에는 언제나 조용히 바퀴의 움직임을 세고 있는 오도메트리가 있다.

책 목록

ROS2로 완성하는 자율주행 로봇: 노드·TF·SLAM·Nav2 실전 설계

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기