Розробка AI-системи автономного водіння Perception Planning Control

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка AI-системи автономного водіння Perception Planning Control
Складний
від 2 тижнів до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

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+ міс