대상: 자율주행 또는 로봇 분야에서 “로봇이 어디 있는가?”를 이해하고 싶은 개발자
환경: Ubuntu 22.04 / ROS2 Humble / LiDAR + IMU + GPS 기반 자율주행 플랫폼
1. 문제/주제 요약
자율주행 시스템의 기본 질문은 단 하나입니다.
“지금 나는 어디에 있는가?”
이 질문에 답하기 위해 로봇공학에서는 세 가지 개념이 등장합니다.
- 맵핑 (Mapping) : 지도를 만든다
- 로컬라이제이션 (Localization) : 지도 안에서 내 위치를 찾는다
- SLAM (Simultaneous Localization and Mapping) : 동시에 지도도 만들고 내 위치도 찾는다
이 세 개념은 서로 연결되어 있지만, 목적과 접근 방식이 다릅니다.
이 글에서는 그 차이와 ROS(특히 ROS2)에서 실제로 어떻게 구현되는지를 정리합니다.
2. 개념 요약
| 구분 | 핵심 질문 | 입력 | 출력 | 대표 알고리즘 |
|---|---|---|---|---|
| 맵핑 (Mapping) | “세상은 어떤 구조인가?” | LiDAR, 카메라 | 지도(Map) | GMapping, Cartographer |
| 로컬라이제이션 (Localization) | “나는 지도에서 어디 있나?” | 지도 + 센서 | 위치/자세(Pose) | AMCL, NDT, EKF |
| SLAM | “지도도 없고 위치도 모름, 동시에 찾아야 함” | 센서 | 지도 + 위치 | Hector SLAM, LIO-SAM |
3. 맵핑 (Mapping)
(1) 개념
로봇이 센서를 이용해 주변 환경의 구조를 모델링(지도화) 하는 과정입니다.
즉, “내가 어디 있는지는 몰라도, 주변이 이렇게 생겼구나”를 그리는 단계입니다.
(2) 입력/출력
- 입력: LiDAR 스캔, IMU, (선택) Odometry
- 출력: Occupancy Grid Map (
nav_msgs/OccupancyGrid)
(3) ROS에서의 대표 예시
🔹 GMapping (2D SLAM 기반 맵핑)
rosrun gmapping slam_gmapping scan:=/scan
🔹 Cartographer (Google 개발 2D/3D SLAM)
- LiDAR + IMU 데이터를 이용해 실시간 2D/3D 맵 생성
- ROS2에서는
cartographer_ros패키지 사용
(4) 결과
맵핑 결과는 .pgm 또는 .yaml 형태로 저장되어ros2 launch nav2_map_server map_saver.launch.py 로 불러 사용할 수 있습니다.
💡 맵핑의 목표: “한 번이라도 주행해본 환경을 지도 데이터로 저장”
4. 로컬라이제이션 (Localization)
(1) 개념
이미 만들어진 지도 위에서, 현재 로봇의 위치(x, y, θ) 를 추정하는 과정입니다.
즉, “이 지도에서 나는 지금 어디쯤 있지?”를 실시간으로 계산합니다.
(2) 입력/출력
- 입력: 맵 데이터 + 센서(LiDAR, IMU, Odometry)
- 출력: 로봇의 위치 추정 값 (
geometry_msgs/PoseWithCovarianceStamped)
(3) ROS 대표 알고리즘
🔹 AMCL (Adaptive Monte Carlo Localization)
- 입자 필터(Particle Filter) 기반의 위치 추정
- 입력:
/map,/scan,/odom - 출력:
/amcl_pose
roslaunch turtlebot3_navigation amcl.launch
🔹 NDT Localization (Normal Distributions Transform)
- LiDAR 점군을 이용한 고정밀 위치 추정
- 자율주행 차량에서 자주 사용됨
- 패키지:
ndt_matching,autoware_localization
💡 로컬라이제이션의 목표: “이미 있는 지도에서, 현재 내 위치를 정확히 찾기”
5. SLAM (Simultaneous Localization and Mapping)
(1) 개념
지도와 위치를 동시에 추정하는 알고리즘입니다.
지도가 없고 위치도 모를 때, 센서 데이터만으로 두 가지를 함께 해결합니다.
“지도도 모르고 내 위치도 모르지만, 움직이면서 둘 다 알아내기.”
(2) 입력/출력
- 입력: LiDAR, IMU, Odometry, (선택) 카메라
- 출력: 맵 + 위치 (Pose + Map)
(3) 주요 알고리즘
| 이름 | 센서 | 특징 |
|---|---|---|
| Hector SLAM | 2D LiDAR | 빠름, IMU 없이도 동작 |
| Karto SLAM | 2D LiDAR | 안정적, 소형 로봇용 |
| LIO-SAM | LiDAR + IMU | 고정밀 3D SLAM (LiDAR-Inertial Odometry) |
| ORB-SLAM3 | Monocular/Stereo/IMU | 카메라 기반 SLAM |
| Cartographer | LiDAR + IMU | 실시간 2D/3D 맵 생성 |
(4) ROS2 예시 – LIO-SAM
ros2 launch lio_sam run.launch.py
입력 토픽:
/velodyne_points
/imu/data
출력 토픽:
/map
/odometry
💡 SLAM의 목표: “지도도 없을 때, 센서 정보만으로 자기 위치를 추정하면서 지도까지 만든다”
6. 세 개념의 관계
┌────────────┐
│ SLAM │ ← 지도도 만들고 위치도 찾음
└────┬───────┘
│
▼
┌──────────────┐
│ Mapping │ ← 지도 생성
└──────────────┘
│
▼
┌──────────────┐
│ Localization │ ← 지도 내 위치 추정
└──────────────┘
즉,
- 처음에는 SLAM으로 지도를 만든다.
- 그 다음부터는 Mapping은 생략하고, Localization만 사용한다.
7. ROS2 기반 워크플로우 예시
| 단계 | 목적 | ROS2 패키지 |
|---|---|---|
| 1. Mapping | 지도 생성 | cartographer_ros, slam_toolbox |
| 2. Localization | 위치 추정 | nav2_amcl, robot_localization |
| 3. Navigation | 자율주행 | nav2_bt_navigator, planner_server |
맵 생성 후, 다음과 같이 localization만 수행:
ros2 launch nav2_bringup bringup_launch.py map:=/maps/office.yaml
8. 추가 팁 / 자주 하는 혼동
- ⚠️ SLAM과 Mapping을 혼용하는 경우가 많지만,
SLAM은 “지도 + 위치 동시 추정”,
**Mapping은 “위치가 주어졌을 때 지도 생성”**입니다. - ⚙️ Localization은 지도 품질에 강하게 의존합니다.
맵이 부정확하면 위치 추정도 흔들립니다. - 🧭 GPS/IMU와 LiDAR를 융합하면, 절대 좌표 기반 Localization이 가능
→robot_localization의ekf_localization_node사용
9. 정리
| 구분 | 맵핑 | 로컬라이제이션 | SLAM |
|---|---|---|---|
| 목표 | 지도 생성 | 지도 위 위치 추정 | 지도 + 위치 동시 추정 |
| 입력 센서 | LiDAR | LiDAR + 맵 | LiDAR + IMU |
| 대표 알고리즘 | GMapping, Cartographer | AMCL, NDT | LIO-SAM, ORB-SLAM3 |
| 출력 데이터 | Map | Pose | Map + Pose |
| ROS2 패키지 | slam_toolbox | nav2_amcl, robot_localization | lio_sam, cartographer_ros |
👉 정리하자면:
- SLAM으로 지도를 만들고,
- 그 지도 위에서 Localization으로 자신의 위치를 추정하며,
- 이 두 단계를 통해 자율주행의 기반인 “나는 어디 있는가”를 해결합니다.