Создайте эгоцентрическую карту заполнения из Driving Scenario Designer

В этом примере показано, как создать эгоцентрическую карту заполнения из приложения Driving Scenario Designer. Этот пример использует информацию о препятствии от генератора обнаружения видения, чтобы обновить эгоцентрическую карту заполнения.

Этот пример:

  • Получает информацию препятствия и дорожную геометрию с помощью генератора обнаружения видения.

  • Создает эго центральная карта заполнения с помощью бинарной карты заполнения.

  • Обновляет эго центральная карта заполнения с помощью контуров маршрута и информации о препятствии.

Введение

Автоматизированные системы вождения используют несколько встроенных датчиков на автомобиле, оборудованном датчиком как радар, камеры и лидар. Эти датчики используются, чтобы чувствовать информацию от среды и среды. Важно сопоставить информацию от этих неоднородных датчиков в общую временную систему отсчета. Это обычно делается с помощью эгоцентрической карты заполнения. Эта карта содержит информацию об окружающей среде как дорожная геометрия, свободное пространство и препятствия. Эта эгоцентрическая карта заполнения используется путем планирования алгоритмов навигацию. Автомобиль, оборудованный датчиком может ответить на динамические изменения в среде путем периодического обновления информации в этом эго центральная карта заполнения.

В этом примере показано, как использовать маршрут и информацию о препятствии, полученную из сценария, чтобы создать и обновить эго центральная карта заполнения.

Этот пример также использует прямой дорожный сценарий созданный с использованием Driving Scenario Designer (DSD). Для получения дополнительной информации смотрите Driving Scenario Designer (Automated Driving Toolbox). Можно также создать Ведущий Сценарий программно. Для получения дополнительной информации относитесь, чтобы Создать Ведущий Сценарий Программно (Automated Driving Toolbox).

Получите контуры маршрута и информацию о препятствии от управления сценарием

Сценарий, используемый в этом примере, является прямой дорогой с четырьмя маршрутами. Этот сценарий имеет один автомобиль, оборудованный датчиком и шесть целевых транспортных средств, которые следуют за их соответствующими предопределенными путями. Создайте сценарий с помощью функции помощника, exampleHelperCreateStraightRoadScenario.

Сценарий, используемый в этом примере, показывают в следующем рисунке.

[scenario, egoVehicle] = exampleHelperCreateStraightRoadScenario;                           

Этот пример использует генератор обнаружения видения, который синтезирует датчик камеры, смонтированный впереди автомобиля, оборудованного датчиком в ведущем сценарии. Этот генератор сконфигурирован, чтобы обнаружить контуры маршрута и препятствия.

Для получения дополнительной информации смотрите visionDetectionGenerator (Automated Driving Toolbox).

Интервал обновления генератора обнаружения видения сконфигурирован, чтобы сгенерировать обнаружения в 0,1 вторых интервалах, который сопоставим с частотой обновления типичных автомобильных датчиков видения.

Создайте actorProfiles для сценария, которые содержат физический и радарные профили всех ведущих агентов сценария включая автомобиль, оборудованный датчиком. Задайте тех агентов и другие параметры конфигурации для генератора обнаружения видения.

profiles = actorProfiles(scenario);

% Configure vision detection generator to detect lanes and obstacles
sensor = visionDetectionGenerator('SensorIndex', 1, ...
    'SensorLocation', [1.9 0], ...
    'DetectionProbability', 1, ...
    'MinObjectImageSize', [5 5], ...
    'FalsePositivesPerImage', 0, ...
    'DetectorOutput', 'Lanes and objects', ...
    'Intrinsics', cameraIntrinsics([700 1814],[320 240],[480 640]), ...
    'ActorProfiles', profiles,...
    'UpdateInterval', 0.1);

Получить обнаружения, sensor объект называется для каждого шага симуляции. Этот sensor вызов объектов происходит в функции помощника exampleHelperGetObstacleDataFromSensors.

Создайте эгоцентрическую карту заполнения

Этот пример использует binaryOccupancyMap объект создать эгоцентрическую карту заполнения.

Создайте квадратную карту заполнения с 100 метрами за сторону и разрешение 2 ячеек на метр. Установите все ячейки на занятое состояние по умолчанию.

egoMap = binaryOccupancyMap(100, 100, 2);
setOccupancy(egoMap,ones(200, 200));

По умолчанию источник карты внизу слева. Переместите egoMap источник к центру карты заполнения. Это преобразует карту заполнения в эгоцентрическую карту заполнения.

egoMap.GridOriginInLocal = [-egoMap.XLocalLimits(2)/2, ...
                            -egoMap.YLocalLimits(2)/2];

Обновите эгоцентрическую карту заполнения с информацией о препятствии

Прежде, чем обновить egoMap, инициализируйте окно визуализации. Препятствия в egoMap визуализация представлена как черное (занятое) и свободное место как белая (незанятый).

hAxes = exampleHelperSetupVisualization(scenario);

Setup цикл для выполнения сценария с помощью advance(scenario). Этот цикл должен переместить egoVehicle вдоль дороги обновляя положение, когда это перемещается.

Вызовите move на egoMap использование обновленного положения, чтобы получить обновленные обнаружения. Очистите карту от всех препятствий для каждого обновления.

% Advancing the scenario
while advance(scenario)
    % Ego vehicle position
    egoPose = egoVehicle.Position;
    egoYaw = deg2rad(egoVehicle.Yaw);
    
    % Move the origin of grid to the face of the ego vehicle.
    move(egoMap, [egoPose(1), egoPose(2)]);
    
    %Reset the egoMap before updating with obstacle information
    setOccupancy(egoMap, ones(egoMap.GridSize));

Контуры маршрута и информация о препятствиях, сгенерированная от генератора обнаружения видения, используются, чтобы найти занятое место, которое должно быть обновлено в egoMap.

Этот пример использует дорожную информацию о контурах, извлеченную из контуров маршрута. Область вне дорожных контуров также рассматривается занятой.

exampleHelperGetObstacleDataFromSensor функция помощника извлекает дорожные контуры и информацию о препятствии, сгенерированную от генератора обнаружения видения.

    [obstacleInfo, roadBorders, isValidLaneTime] = ...
      exampleHelperGetObstacleDataFromSensor(scenario, egoMap, ...
                                egoVehicle, sensor);
                            

В зависимости от области значений генератора обнаружения видения обнаружения могут выйти за пределы egoMap границы. Используя egoMap границы, exampleHelperFitlerObstacles функционируйте извлекает препятствия и свободное пространство, которые являются в рамках эгоцентрической карты.

    [obstaclePoints, unoccupiedSpace] = exampleHelperFilterObstacles(...
                                         egoMap, obstacleInfo, ...
                                         roadBorders, ...
                                         isValidLaneTime, egoVehicle);

Используйте отфильтрованные местоположения препятствия и свободного пространства, чтобы обновить эгоцентрическую карту. Обновите визуализацию.

        % Set the occupancy of free space to 0
        if ~isempty(unoccupiedSpace)
            setOccupancy(egoMap, unoccupiedSpace, 0);
        end
        
        % Set the occupancy of occupied space to 1
        if ~isempty(obstaclePoints)
            setOccupancy(egoMap, obstaclePoints, 1);
        end
        
        % Updating the visualization
        exampleHelperUpdateVisualization(hAxes, egoVehicle, egoPose, egoYaw, egoMap);
end

Figure contains 2 axes objects and other objects of type uipanel. Axes object 1 with title Binary Occupancy Grid contains 2 objects of type image, patch. Axes object 2 contains 10 objects of type patch, line.

Figure contains 2 axes objects and other objects of type uipanel. Axes object 1 with title Binary Occupancy Grid contains 2 objects of type image, patch. Axes object 2 contains 10 objects of type patch, line.