Localization - Cartographer: Particle Filter와의 비교
이제 Cartographer를 localization에 사용하는 방법을 알아보겠습니다. Cartographer Pure Localization의 개념·설정·UNICORN 수정 사항은 Cartographer를 활용한 Pure Localization 가이드에 정리되어 있으니, 이 글에서는 직관적인 동작 방식과 Particle Filter와의 비교에 집중합니다.
현재 pose는 어떻게 추정할까
Cartographer를 활용한 localization은 사실 mapping 알고리즘과 크게 다르지 않습니다. 비유하자면 “기억력 3초 금붕어”가 하는 매핑 입니다. 예전 기억(.pbstream에 저장된 prior map)은 그대로 유지하되, 최근에 만드는 submap은 3개까지만 남기고 잊어가면서 매핑을 이어갑니다.
1
2
3
TRAJECTORY_BUILDER.pure_localization_trimmer = {
max_submaps_to_keep = 3,
}
Particle Filter와의 비교
Case 1. 정지 상태
Particle Filter
Cartographer
정지 상태에서도 Particle Filter는 진동하는 반면, Cartographer는 안정적입니다. LiDAR 포인트의 흔들림과 오른쪽 position.x plot에서 그 차이를 확인할 수 있습니다.
Case 2. 저장된 맵과 실제 맵이 다른 경우
실제 레이스 중에는 여러 이유로 저장된 맵과 실제로 얻어지는 포인트가 달라질 수 있습니다.
- 시간이 지나면서 생기는 미묘한 변화
- 충돌로 인한 변화
Particle Filter
Cartographer
Cartographer는 저장된 맵과 다른 환경에서도 충분히 안정적입니다. Localization 중에도 짧은 매핑을 계속하고 있기 때문입니다. Particle Filter가 “현재 스캔과 주어진 맵”만으로 최선의 pose를 고르는 반면, Cartographer는 현재 스캔과 이전 스캔의 연결, 그리고 저장된 맵과의 연결을 함께 고려합니다.
How to use
실차에서 저장된 맵으로 Cartographer localization을 시작합니다. localization 인자를 생략하면 기본값이 cartographer입니다.
1
ros2 launch stack_master localization.launch.xml map:=<map_name>
stack_master/maps/<map_name>/의 <map_name>.pbstream을 불러와 pure localization을 수행하며, 위치 추정 결과는 /tracked_pose → EKF를 거쳐 /car_state/odom으로 발행됩니다.
초기 위치는 RViz의 2D Pose Estimate로 지정합니다 — 클릭한 자세에서 trajectory가 재시작됩니다.
마무리
사용할 수 있는 환경이라면 Cartographer가 성능의 상한이 더 높습니다. 다만 이 글에서 다루지 않은 파라미터가 매우 많아, 잘 안 되는 순간에 빠르게 대응하기 어려울 수 있습니다. 그래서 제공되는 파라미터 설정 파일을 사용하되, 백업으로 Particle Filter를 함께 준비 해 두는 것이 좋습니다.
Cartographer localization의 상세 설정(PoseWithCovariance publisher, dynamic initial pose, 튜닝 파라미터 등)은 Cartographer를 활용한 Pure Localization 가이드를, Particle Filter 자체는 Motion Model·Measurement Model 글을 참고하세요.
