근본 원인
시간 동기화 불일치가 핵심 원인입니다. Wi-Fi 통신 환경에서 제어 PC와 Jetson(로봇) 사이의 시계(clock)가 동기화되어 있지 않거나, 특정 노드가 오래된 타임스탬프를 그대로 사용하고 있는 상황입니다.
구체적으로는 goal pose나 센서 데이터가 발행될 때 찍힌 타임스탬프가 현재 TF 버퍼에 없는 과거 시점을 참조하기 때문에 planner가 변환을 못 하고 멈추는 것입니다.
해결 방법 (우선순위 순)
1. PC ↔ Jetson 시간 동기화 확인 (가장 중요)
두 기기 모두에서 아래 명령으로 시간을 확인하세요.
date
timedatectl
차이가 있다면 NTP 동기화를 강제 실행합니다.
sudo systemctl restart systemd-timesyncd
# 또는
sudo chronyc makestep
Wi-Fi 환경에서는 NTP 동기화가 불안정할 수 있으므로 chrony 사용을 권장합니다.
2. TF Buffer 크기 늘리기
nav2_params.yaml 또는 관련 launch 파일에서 TF 버퍼 유지 시간을 늘려줍니다.
bt_navigator:
transform_tolerance: 1.0
# 또는 TF listener 초기화 시
tf_buffer_duration: 30.0 # 기본 10초 → 30초로 확장
3. transform_tolerance 파라미터 완화
nav2_params.yaml에서 아래 항목들을 찾아 값을 높여주세요.
controller_server:
transform_tolerance: 1.0
planner_server:
transform_tolerance: 1.0
bt_navigator:
transform_tolerance: 1.0
4. DDS 유니캐스트 설정 (Wi-Fi 환경)
Wi-Fi에서 ROS2 멀티캐스트가 불안정하면 TF 데이터가 단속적으로 도달합니다. ~/.bashrc에 추가하세요.
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
그리고 CycloneDDS 유니캐스트 설정 파일을 적용하거나, 두 기기를 같은 서브넷에 두고 ROS_DOMAIN_ID를 맞춰주세요.
5. Goal Pose 발행 시 타임스탬프 확인
goal을 발행하는 코드나 RViz에서 stamp가 rclpy.time.Time()(현재 시간)으로 설정되어 있는지 확인하세요. 오래된 bag 파일이나 캐시된 goal이 재사용되고 있다면 383초 과거 타임스탬프 문제가 발생할 수 있습니다.
요약
| 문제 |
원인 |
해결 |
| Extrapolation Error (383초 차이) |
PC ↔ Jetson 시간 불일치 |
chrony로 NTP 동기화 |
| Queue Full (odom2) |
Wi-Fi 지연/패킷 손실 |
DDS 유니캐스트, 토픽 Hz 조정 |
| Navigation 멈춤 |
TF 변환 실패로 planner 중단 |
transform_tolerance 완화 |
가장 먼저 두 기기의 시간 차이를 확인하는 것이 우선입니다. 383초라는 차이는 단순한 지연이 아니라 시계 자체가 맞지 않는 수준이기 때문입니다.