AI-система сприйняття та планування для автономного водіння
Perception + Planning - це зв'язка, яка перетворює потік даних із сенсорів на команди керування автомобілем. Perception відповідає на запитання "що навколо мене", Planning - "куди і як їхати". Розрив між лабораторним демо та дорожніми випробуваннями тут катастрофічний: система з mAP 0.92 на nuScenes може провалитися на першому ж незнайомому перехресті під час дощу.
Стек сенсорів та fusion
Автономні системи рівня L3+ працюють із кількома типами сенсорів одночасно:
import numpy as np
import torch
from mmdet3d.models import build_detector
from mmdet3d.apis import inference_detector
class PerceptionPipeline:
def __init__(self, config: dict):
# 3D детектор: BEVFusion или SECOND
self.detector_3d = build_detector(config['detector_cfg'])
self.detector_3d.load_checkpoint(config['checkpoint'])
# 2D детектор камер: YOLOv8 или DETR
self.cam_detector = torch.hub.load('ultralytics/ultralytics',
'yolov8l', pretrained=True)
# Матрицы проекции LiDAR → камера
self.lidar2cam = np.array(config['lidar2cam_matrix'])
self.camera_intrinsics = np.array(config['cam_intrinsics'])
def fuse_lidar_camera(self, point_cloud: np.ndarray,
images: list[np.ndarray]) -> dict:
"""
LiDAR даёт точные 3D-координаты и дальность,
камера даёт семантику (тип объекта, цвет светофора).
BEVFusion объединяет в единое Bird's Eye View представление.
"""
bev_features = self._to_bev(point_cloud)
cam_features = [self.cam_detector(img) for img in images]
# Проекция LiDAR точек на плоскость камеры
pts_3d_cam = self._project_lidar_to_cam(point_cloud)
return {
'bev_features': bev_features,
'cam_detections': cam_features,
'projected_points': pts_3d_cam
}
Моделі детекції 3D об'єктів
| Модель | mAP nuScenes | Latency (A100) | LiDAR | Camera |
|---|---|---|---|---|
| SECOND | 62.1 | 40ms | Так | Ні |
| CenterPoint | 65.5 | 55ms | Так | Ні |
| BEVFusion (MIT) | 70.2 | 130ms | Так | Так |
| BEVFormer v2 | 72.8 | 180ms | Ні | Так (multi-cam) |
| UniAD | 75.3 | 350ms | Так | Так |
Вибір моделі залежить від бюджету latency: для бортового NVIDIA Drive Orin (128 TOPS) реально тримати BEVFusion за 100ms з TensorRT-оптимізацією.
Planning: від сприйняття до траєкторії
class MotionPlanner:
def __init__(self, config: dict):
self.dt = 0.1 # шаг времени 100ms
self.horizon = 5.0 # горизонт планирования 5 сек
self.safety_margin = 0.8 # метров
def plan_trajectory(self, ego_state: dict,
detected_objects: list[dict],
hd_map: dict) -> np.ndarray:
"""
IDM (Intelligent Driver Model) + potential fields.
Для сложных сценариев: RL или трансформер (PDM-Closed).
"""
# Candidate trajectories из генератора
candidates = self._generate_candidates(ego_state)
# Оценка безопасности каждой траектории
scores = []
for traj in candidates:
collision_risk = self._collision_check(traj, detected_objects)
lane_keep = self._lane_keep_cost(traj, hd_map)
comfort = self._comfort_cost(traj)
total_cost = (3.0 * collision_risk +
1.5 * lane_keep +
0.5 * comfort)
scores.append(total_cost)
best_idx = np.argmin(scores)
return candidates[best_idx]
def _collision_check(self, trajectory: np.ndarray,
objects: list[dict]) -> float:
"""TTC (Time-To-Collision) для каждого объекта"""
min_ttc = float('inf')
for obj in objects:
ttc = self._compute_ttc(trajectory, obj)
min_ttc = min(min_ttc, ttc)
# TTC < 2 сек = высокий риск
return 1.0 / max(min_ttc, 0.1)
Тестування: симуляція vs реальні дані
Розрив між симуляцією (CARLA, SUMO) та реальністю – одна з головних проблем. Модель, навчена лише на CARLA, втрачає 15–25% mAP на реальних даних через domain gap (освітлення, текстури, поведінка агентів).
Стратегія зменшення domain gap:
- Domain randomization: випадкові текстури, освітлення, погода у симуляторі
- Real2Sim: перенесення реальних сцен у CARLA через NeRF або Gaussian Splatting
- Curriculum learning: спочатку прості сцени, потім corner cases
Ключові компоненти системи
- Локалізація: HDMap + LiDAR SLAM (LOAM, LIO-SAM) з точністю 10-20 см
- Prediction: прогноз траєкторій агентів (HiVT, MTR) на 5 сек.
- Карта: HD Map (Lanelet2) з розміткою, знаками, правилами
- Safety monitor: незалежний watchdog, перевіряє фізичну реалізованість команд
| Рівень автономності | Scope | Термін |
|---|---|---|
| L2 асистент (ADAS) | Траса, гарні умови | 4-8 міс |
| L3 pilot | Структуроване середовище | 10-18 міс |
| L4 robo-taxi (геофенс) | Конкретний район | 24+ міс |







