Localization vs Mapping vs SLAM: 자율주행에서 위치를 어떻게 아는가

대상: 자율주행 또는 로봇 분야에서 “로봇이 어디 있는가?”를 이해하고 싶은 개발자
환경: 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 SLAM2D LiDAR빠름, IMU 없이도 동작
Karto SLAM2D LiDAR안정적, 소형 로봇용
LIO-SAMLiDAR + IMU고정밀 3D SLAM (LiDAR-Inertial Odometry)
ORB-SLAM3Monocular/Stereo/IMU카메라 기반 SLAM
CartographerLiDAR + 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 │  ← 지도 내 위치 추정
└──────────────┘

즉,

  1. 처음에는 SLAM으로 지도를 만든다.
  2. 그 다음부터는 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_localizationekf_localization_node 사용

9. 정리

구분맵핑로컬라이제이션SLAM
목표지도 생성지도 위 위치 추정지도 + 위치 동시 추정
입력 센서LiDARLiDAR + 맵LiDAR + IMU
대표 알고리즘GMapping, CartographerAMCL, NDTLIO-SAM, ORB-SLAM3
출력 데이터MapPoseMap + Pose
ROS2 패키지slam_toolboxnav2_amcl, robot_localizationlio_sam, cartographer_ros

👉 정리하자면:

  • SLAM으로 지도를 만들고,
  • 그 지도 위에서 Localization으로 자신의 위치를 추정하며,
  • 이 두 단계를 통해 자율주행의 기반인 “나는 어디 있는가”를 해결합니다.

댓글 남기기