Создайте Egocentric карту заполнения из Driving Scenario Designer

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

Этот пример:

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

  • Создает ego-ориентированную карту заполнения с помощью двоичной карты заполнения.

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

Введение

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

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

В этом примере также используется сценарий прямой дороги, разработанный с использованием 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];

Обновление карты заполнения Egocentric с информацией о препятствиях

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

hAxes = exampleHelperSetupVisualization(scenario);

Установите цикл для выполнения сценария с помощью 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.

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

The 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 and other objects of type uipanel. Axes 1 with title Binary Occupancy Grid contains 2 objects of type image, patch. Axes 2 contains 10 objects of type patch, line.

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