(ROI, 추적, 위험도 평가 중심)
대상: 자율주행 시스템의 인식 결과(객체 검출 등)를 실제 주행 의사결정에 활용하고 싶은 개발자
환경: ROS/ROS2, Autoware 또는 커스텀 자율주행 스택 (Camera + LiDAR 기반 인식 사용)
1. 문제/주제 요약
자율주행 Perception(인식) 단계에서 객체(차량, 보행자, 자전거 등)를 검출했다고 해서
바로 주행에 반영할 수 있는 건 아닙니다.
검출 결과는 Planning(경로 계획) 과 Control(제어) 단계로 넘어가기 전에
여러 단계를 거쳐 정제됩니다.
이 글에서는 그 후처리 단계 —
ROI 필터링, 객체 추적(Tracking), 위험도 평가(Risk Assessment) — 가
실제 자율주행 시스템에서 어떻게 사용되는지를 설명합니다.
2. 객체 인식 결과의 기본 형태
객체 인식(Object Detection) 노드의 출력은 보통 다음 형태를 가집니다:
id: 35
type: "car"
position: [x: 32.1, y: -4.5, z: 0.0]
velocity: [vx: 2.5, vy: 0.1, vz: 0.0]
bbox: [width: 2.0, length: 4.5, height: 1.6]
confidence: 0.92
frame_id: "base_link"
이 데이터만으로는 즉시 의사결정을 내리기 어렵습니다.
따라서 이후 단계에서는 다음 세 가지 처리를 수행합니다:
- ROI Filtering (관심 영역 필터링)
- Tracking (객체 추적)
- Risk Assessment (위험도 평가 및 경로 판단)
3. ROI (Region of Interest) 필터링
목적: 차량이 주행 경로와 직접 관련 있는 객체만 남기기
(1) 개념
- 센서 인식 결과에는 도로 밖의 객체(건물, 가로수, 표지판 등)도 포함됩니다.
- 주행 판단에 필요한 것은 현재 또는 미래의 주행 경로 근처 객체뿐입니다.
(2) 처리 방식
1️⃣ 지도 기반 ROI
- HD Map의 차로(road/lane polygon) 영역만 남김
- 예: 차선 안쪽 ±1.5m 범위의 객체만 유지
2️⃣ 경로 기반 ROI (Path ROI)
- Planning 노드에서 받은 “예상 주행 경로(path)”를 중심으로 ROI 생성
- 예:
path_polygon = buffer(predicted_path, 2.0m) keep_objects_inside(path_polygon)
3️⃣ 시야 기반 ROI (Sensor FoV)
- 센서의 시야 범위(Field of View) 밖 객체 제거
결과적으로 /perception/filtered_objects 토픽에는 “실제 주행과 관련 있는 객체”만 남습니다.
4. 객체 추적 (Object Tracking)
목적: 시간적으로 동일한 객체를 식별하고, 이동 궤적과 속도를 추정
(1) 필요성
- 객체 검출은 프레임마다 새로 수행되기 때문에
매 순간 “새로운 ID”를 부여받을 수 있습니다. - 따라서 추적 알고리즘이 같은 객체를 연속 프레임 간 연결해야 합니다.
(2) 대표 알고리즘
| 알고리즘 | 설명 | ROS2 적용 예시 |
|---|---|---|
| Kalman Filter (KF) | 단일 객체의 위치·속도 예측 | /object_tracker |
| Extended/Unscented KF | 비선형 움직임 대응 | Autoware ekf_tracker |
| JPDA / MHT | 복수 객체 연속 추적 | Radar+Camera 통합 |
| DeepSORT | 영상 기반 Re-ID 추적 | Camera 객체 추적 |
| Multi-Object Tracker (MOT) | LiDAR+Camera 결합 추적 | BEVFusion 기반 시스템 |
(3) 예시 (2D Kalman Filter 모델)
# 상태: [x, y, vx, vy]
x_k = F @ x_(k-1) + w
z_k = H @ x_k + v
K = P @ H.T @ inv(H @ P @ H.T + R)
x = x + K @ (z - H @ x)
추적 결과:
object_id: 35
current_pos: [32.1, -4.5]
velocity: [2.5, 0.1]
predicted_pos(t+1s): [34.6, -4.4]
이 데이터는 “예상 충돌 시점”을 계산할 때 사용됩니다.
5. 위험도 평가 (Risk Assessment)
목적: 주변 객체가 나의 경로와 충돌할 가능성을 계산
(1) 주요 지표
| 지표 | 의미 | 계산식 |
|---|---|---|
| TTC (Time To Collision) | 충돌까지 남은 시간 | TTC = distance / relative_speed |
| DRAC (Deceleration Rate to Avoid Collision) | 충돌 방지를 위해 필요한 감속도 | DRAC = (v^2 - 0) / (2 * distance) |
| RSS (Responsibility Sensitive Safety) | 차량 간 안전거리 모델 | Mobileye 제안 방식 |
예시:
object_id: 35
distance: 12.3
relative_speed: 3.5
TTC: 3.5 # seconds
risk_level: HIGH
(2) 판단 로직 예시
1️⃣ TTC < 3.0s → 위험도 높음 (HIGH)
2️⃣ 3.0s ≤ TTC < 6.0s → 주의 (MEDIUM)
3️⃣ TTC ≥ 6.0s → 안전 (LOW)
이 결과는 /planning/behavior_planner 노드로 전달되어
“감속, 차선 변경, 정지” 등의 행동 결정을 트리거합니다.
6. 실제 ROS2 데이터 흐름 예시 (Autoware 기준)
/perception/object_recognition/objects
↓
/perception/object_tracker/tracked_objects
↓
/perception/path_roi_objects
↓
/planning/behavior_path_planner
↓
/planning/motion_planner
- ROI Filter: 주행 경로 주변 객체만 남김
- Tracking Node: 객체 이동 궤적 예측
- Risk Evaluator: TTC 계산 후 위험 레벨 발행
7. 추가 팁 / 자주 하는 실수
- 시간 동기화 실패 → ROI 필터가 오래된 객체를 남겨 오탐 유발
- 잘못된 frame_id (좌표계) → 객체 위치가 지도와 불일치
- 속도 추정 불안정 → TTC 계산 오류 → 잘못된 위험도 판단
- ROI 경로 과도한 확장 → 불필요한 객체까지 Planning에 전달
⚙️ 팁: 실제 주행 테스트 전,
rviz2에서/perception/tracked_objects와/planning/path를 함께 시각화해보면
ROI, 추적, 위험도 계산이 제대로 연동되는지 한눈에 확인할 수 있습니다.
8. 정리
객체 인식 결과는 단순히 “주변에 무엇이 있다”를 넘어서,
주행 의사결정의 핵심 입력으로 활용됩니다.
핵심 단계는 다음과 같습니다:
- ROI Filtering — 주행 경로와 관련된 객체만 선별
- Tracking — 시간적 일관성을 가진 객체 이동 예측
- Risk Assessment — 충돌 가능성(TTC, DRAC, RSS 등) 계산
이 세 단계를 통해 자율주행 시스템은 **“주변 상황을 이해하고, 안전한 행동을 선택”**할 수 있습니다.