Occupancy Grid Mapping: 센서 조합과 실전 매핑 노하우
Mapping을 위한 SLAM 알고리즘에는 GMapping, Hector SLAM, Karto SLAM 등 다양한 선택지가 있습니다. UNICORN Racing 팀은 그중에서도 Google이 개발한 Cartographer 를 메인으로 사용하는데, 다른 알고리즘 대비 안정성과 성능이 뛰어나기 때문입니다.
Mapping에 사용할 수 있는 데이터
Cartographer는 LiDAR 를 기준으로 (Wheel) Odometry, IMU 등 다양한 센서 조합을 유연하게 사용할 수 있도록 지원합니다. 각 센서의 특징은 다음과 같습니다.
- LiDAR (필수) — 직접적인 거리값을 제공합니다.
- 감지 거리 한계: 예를 들어 최대 10m를 감지하는 LiDAR는 20m가 넘는 긴 직선에서 성능이 급격히 저하됩니다.
- 반사율이 낮은 재질이나 색상의 표면에서는 성능이 더 떨어집니다.
- 2D LiDAR 특유의 문제: 마운트 세팅이 틀어지면 땅이나 하늘을 보게 될 수 있고, body 강성이 약하면 정지 상태에서는 괜찮아도 레이스 중 진동으로 땅·하늘을 보게 될 수 있습니다.
- Wheel Odometry (선택) — 추가적인 속도·각속도 정보를 제공합니다.
erpm_gain,servo_gain,wheelbase값이 정확해야 합니다.- 값이 아무리 정확해도, 미끄러운 노면이나 비정상 주행(스핀, 드리프트, 점프)에서는 매우 부정확합니다.
- IMU (선택) — 직접적인 선가속도·각속도 정보를 제공합니다.
- roll·pitch를 정확히 모르는 2D 환경에서는 선가속도를 그대로 사용하기 어렵습니다.
- 노이즈 특성을 잘 고려해야 합니다.
문제 상황: 최대 감지 거리가 부족할 때
실무에서 많이 쓰는 10m급 LiDAR는 20m 직선 구간에서 localization이 불안정해집니다. 이 상황을 재현하기 위해 최대 감지 거리를 3m로 제한했습니다.
1
2
TRAJECTORY_BUILDER_2D.max_range = 3.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
아래 세 영상은 같은 긴 복도 구간 을 센서 조합만 바꿔가며 매핑한 결과입니다.
LiDAR only
차량이 실제로는 전진하고 있지만, 전진을 감지할 수단이 없어 정지해 있다고 판단합니다. 그 결과 정면의 벽이 점점 가까워지는 것처럼 맵이 왜곡됩니다.
LiDAR + IMU
IMU를 더해도 속도 정보가 없어 정면의 벽이 여전히 가까워집니다. 다만 주목할 점이 있습니다.
- LiDAR만 사용할 때보다 흔들림이 줄어듭니다.
- IMU의 선가속도에는 중력이 포함되어 있는데, 3D pose(roll·pitch)를 모르면 중력 성분을 분리할 수 없어, 선가속도를 적분해 속도를 구하는 것이 사실상 불가능합니다.
LiDAR + IMU + Odometry
Odometry의 선속도 정보 덕분에, 정면의 LiDAR 측정값이 (감지 거리 제한으로) 무시되는 상황에서도 전진을 인식합니다. 즉 정면의 벽이 global frame에서 고정되어 있음을 올바르게 파악합니다.
실전 Mapping을 위한 준비
좋은 맵을 만들려면 센서 데이터에 대한 이해뿐 아니라 실전 노하우도 필요합니다.
- 하드웨어 사전 점검: 파라미터를 아무리 잘 튜닝해도 LiDAR가 땅이나 하늘을 보고 있다면 bag을 기록해봐야 의미가 없습니다. 매핑을 시도하기 전에 하드웨어가 올바르게 구성되어 있는지 반드시 먼저 확인하세요. (센서 프레임 설정은 TF Configuration 참고)
- Gain 점검: Odometry를 함께 사용할 계획이라면, odometry가 실제 속도를 제대로 반영하는지 확인해야 합니다. (관련 내용은 Adaptive Wheel Odometry 참고)
- bag 파일 기반 Mapping: 실주행 중 실시간으로 Cartographer를 돌리기보다, bag 파일로 센서 데이터를 기록한 뒤 오프라인으로 재생하며 매핑 파라미터를 반복 조정하는 편이 최적의 맵을 얻기에 좋습니다.
Cartographer의 내부 구조(Local/Global SLAM, Loop Closure, Modified Cartographer)와 실행 명령어가 궁금하다면 Cartographer를 활용한 Mapping 가이드를 함께 참고하세요.
How to use
실차에서 아래 명령으로 매핑을 시작합니다. 센서와 Cartographer SLAM 스택이 함께 실행됩니다.
1
ros2 launch stack_master mapping.launch.xml map:=<map_name>
실행 후 트랙을 주행하면 아래 영상처럼 맵이 실시간으로 만들어집니다.
매핑이 끝났으면 RViz에서 2D Goal Pose를 아무 곳에나 긁어주세요. SLAM이 종료되면서 <map_name>.pbstream, <map_name>.png, <map_name>.yaml 세 파일이 ~/unicorn_ws/src/unicorn-racing-stack/stack_master/maps/ 아래에 자동으로 저장됩니다.
