대상: ROS2 기반 자율주행 스택(예: Autoware, Navigation2, 커스텀 스택)에서 “센서 인식은 잘 되지만 차량이 움직이지 않는” 문제를 겪는 개발자
환경: Ubuntu 22.04 + ROS2 Humble/Foxy, LGSVL(CyberCity)/CARLA 시뮬레이터 또는 실제 차량
1. 문제/주제 요약
자율주행 시스템 개발 중 가장 자주 겪는 현상이 있습니다:
🧩 LiDAR, 카메라 인식이 잘 되는데 차량이 꿈쩍도 하지 않는다.
RViz에서는 객체도 잘 뜨고, 경로도 잘 보이는데/vehicle_cmd가 비거나, 차가 제자리에 멈춰 있는 상황이죠.
이 문제는 단순히 “제어가 안 되는” 문제가 아니라,
상위 노드에서 특정 조건이 만족되지 않아 차량 제어 신호가 차단된 경우가 대부분입니다.
2. 큰 흐름 복습: 어디서 막히는가?
자율주행의 전체 흐름은 다음과 같습니다:
[Perception] → [Prediction] → [Planning] → [Control] → [Vehicle Interface]
차가 안 움직일 때는 대부분 다음 중 하나에서 끊어집니다:
| 단계 | 대표 증상 | 원인 |
|---|---|---|
| ① Perception | 객체 인식은 되지만 FreeSpace 없음 | 인식 결과가 경로 생성 조건에 맞지 않음 |
| ② Planning | Global Path 보이나 Local Path 없음 | 목표지점 미설정 / 정지 조건 활성화 |
| ③ Control | /vehicle_cmd 출력 없음 | Safety Stop, E-Stop 활성화 |
| ④ Vehicle Interface | 명령은 오지만 차량 미반응 | DBW (Drive-by-Wire) 비활성화 |
3. 원인 1️⃣ — “경로(trajectory)가 생성되지 않음”
🔍 증상
- RViz에 전역 경로(global path)는 보이는데
지역 경로(local trajectory)가 표시되지 않음 /planning/trajectory토픽 비어 있음
⚙️ 원인
- 목표 위치(goal_pose) 가 설정되지 않았거나,
현재 위치와 경로 연결이 끊김
✅ 해결 방법
- RViz에서 “2D Goal Pose” 설정 확인
/localization/current_pose가 정상 출력되는지 확인- 맵 상 현재 위치와 목표가 같은 차선(lanelet) 위에 있는지 확인
ros2 topic echo /planning/trajectory | head
→ 아무것도 출력되지 않으면 Planner가 경로 생성에 실패한 것입니다.
💡 Autoware에서는
/planning/scenario_planning/trajectory토픽이 비면 차량은 절대 움직이지 않습니다.
4. 원인 2️⃣ — “차량이 Stop 상태로 판단됨 (Behavior Planner 정지 조건)”
🔍 증상
- RViz에서 “STOP” 마커 표시
/behavior_planner/status= STOP- 신호등, 정지선, 보행자 인식 후 계속 대기
⚙️ 원인
- 신호등 감지 또는 정지선(StopLine) 이벤트 유지
- 예측 모듈이 “충돌 위험” 플래그를 계속 유지 중
✅ 해결 방법
/perception/traffic_light_recognition/status확인
→"RED"상태가 지속되면 Planning이 대기 유지/prediction/objects내 객체의risk_level이 HIGH인지 확인- 테스트용으로 일시적 정지 무시 플래그를 활성화할 수 있습니다:
ros2 param set /behavior_path_planner enable_stop_at_red_light false
⚠️ 실제 차량에서는 안전 플래그이므로 무조건 끄면 안 됩니다.
5. 원인 3️⃣ — “Control 명령이 차단됨 (Safety Mechanism)”
🔍 증상
/control/trajectory_follower동작 중인데/vehicle_cmd토픽이 계속 0- “Emergency stop requested” 또는 “Control disabled” 메시지 출력
⚙️ 원인
- Safety Node에서 다음 조건 중 하나가 트리거됨
- Localization 오차 커짐 (
pose_confidence < threshold) - Planner 갱신 중단 (stale trajectory)
- Vehicle 상태 비정상 (DBW not ready)
- Localization 오차 커짐 (
✅ 해결 방법
/system/emergency/state토픽 확인ros2 topic echo /system/emergency/state→emergency: true면 Control이 차단됨/control/trajectory_follower/status확인
→ “waiting for trajectory” 상태면 Planning 출력이 끊긴 것
💡 Autoware에서는 Safety Layer가 /vehicle_cmd 신호를 완전히 막습니다.
6. 원인 4️⃣ — “Drive-by-Wire(DBW) 또는 Vehicle Interface 미동작”
🔍 증상
/vehicle_cmd에 조향·속도 명령은 들어오지만 차량이 미반응- 실제 차량이라면 ECU 로그에 “DBW Not Enabled”
⚙️ 원인
- 차량 인터페이스 노드(
/vehicle_interface)가 DBW 모드를 활성화하지 않음 - 시뮬레이터에서는 브리지 연결 불량
✅ 해결 방법
- LGSVL / CARLA:
ros2 launch lgsvl_bridge lgsvl_bridge.launch.py또는ros2 launch carla_ros_bridge carla_ros_bridge.launch.py - 실제 차량:
- DBW ON 스위치 확인
/vehicle/status→dbw_enabled: true확인
7. 원인 5️⃣ — “좌표계(frame) 불일치”
🔍 증상
- RViz에서는 모든 데이터가 보이지만
경로와 차량 위치가 엇나감 /tf변환 실패 로그 다수
⚙️ 원인
map → base_link,odom → base_link변환 누락- Localization과 Planning이 다른 frame 기준으로 동작
✅ 해결 방법
ros2 run tf2_tools view_frames
→ map → base_link 변환이 없으면localization_pose_publisher 또는 ndt_localizer 노드 점검
8. 디버깅 체크리스트
| 단계 | 확인 명령 | 정상 상태 |
|---|---|---|
| 1. 위치 추정 | ros2 topic echo /localization/current_pose | 지속적으로 갱신 |
| 2. 전역 경로 | ros2 topic echo /planning/global_path | 존재 |
| 3. 지역 궤적 | ros2 topic echo /planning/trajectory | 점 지속 갱신 |
| 4. 제어 명령 | ros2 topic echo /vehicle_cmd | throttle > 0 |
| 5. 비상 상태 | ros2 topic echo /system/emergency/state | false |
| 6. 좌표계 | ros2 run tf2_tools view_frames | 모든 frame 연결 |
9. 실제 예시 (Autoware + LGSVL)
상황: 인식 잘되고 RViz에 궤적도 보이지만, 차량이 정지
로그:
[WARN] behavior_path_planner: Stop reason: obstacle in path
[INFO] emergency_handler: Emergency stop active
조치:
1️⃣ /prediction/objects 확인 → 충돌 위험 객체 제거
2️⃣ /system/emergency/state reset
ros2 service call /system/emergency/clear std_srvs/srv/Trigger {}
3️⃣ 차량 정상 주행 시작 🚗
10. 정리
자율주행 시스템에서 “인식은 되는데 차가 안 움직이는” 이유는
대부분 시스템의 안전 조건이 작동 중이거나, Planning 단계가 끊긴 상태입니다.
핵심 요약:
1️⃣ 경로(trajectory) 가 생성되지 않으면 차량은 움직이지 않는다.
2️⃣ Behavior Planner 가 “정지 조건(Stop, Red light, Obstacle)”을 유지 중일 수 있다.
3️⃣ Safety/Emergency Layer 가 제어 명령을 차단할 수 있다.
4️⃣ Vehicle Interface (DBW, Bridge)가 활성화되지 않았을 수 있다.
5️⃣ 좌표계 불일치 도 Planning–Control 연결을 끊는다.
💡 디버깅 순서 요약
1️⃣/localization/current_pose
2️⃣/planning/trajectory
3️⃣/control/trajectory_follower
4️⃣/vehicle_cmd
5️⃣/system/emergency/state
이 다섯 가지를 순서대로 보면 “왜 차가 안 움직이는지” 원인을 빠르게 찾을 수 있습니다.