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

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка AI-системы автономного вождения Perception Planning Control
Сложная
от 2 недель до 3 месяцев
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    854
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

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