자율주행에서 자주 마주치는 오류 패턴: 인식은 되는데 차가 안 움직일 때

대상: 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 없음인식 결과가 경로 생성 조건에 맞지 않음
② PlanningGlobal 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) 가 설정되지 않았거나,
    현재 위치와 경로 연결이 끊김

✅ 해결 방법

  1. RViz에서 “2D Goal Pose” 설정 확인
  2. /localization/current_pose 가 정상 출력되는지 확인
  3. 맵 상 현재 위치와 목표가 같은 차선(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)

✅ 해결 방법

  • /system/emergency/state 토픽 확인 ros2 topic echo /system/emergency/stateemergency: 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/statusdbw_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_cmdthrottle > 0
5. 비상 상태ros2 topic echo /system/emergency/statefalse
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

이 다섯 가지를 순서대로 보면 “왜 차가 안 움직이는지” 원인을 빠르게 찾을 수 있습니다.

댓글 남기기