Симулируйте алгоритм восприятия датчика лидара

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

Введение

Automated Driving Toolbox™ интегрирует 3D среду симуляции в Simulink®. 3D среда симуляции использует Нереальный Engine® Epic Games®. Блоки Simulink, связанные с 3D средой симуляции, могут быть найдены в drivingsim3d библиотека. Эти блоки обеспечивают способность к:

  • Выберите различные сцены в 3D среде симуляции

  • Поместите и переместите транспортные средства в сцену

  • Присоедините и сконфигурируйте датчики на транспортных средствах

  • Симулируйте данные о датчике на основе среды вокруг транспортного средства

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

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

  • Запишите и визуализируйте синтетические данные о датчике лидара из 3D среды симуляции.

  • Разработайте алгоритм восприятия, чтобы создать карту в MATLAB®.

  • Используйте алгоритм восприятия в среде симуляции.

Настройте сценарий в среде симуляции

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

Затем выберите траекторию для транспортного средства, чтобы следовать в сцене. Выбрать Waypoints для 3D примера Симуляции описывает, как в интерактивном режиме выбрать последовательность waypoints от сцены и сгенерировать траекторию транспортного средства. Этот пример использует полученное использование сегмента записанного диска helperSelectSceneWaypoints функция, как описано в waypoint примере выбора.

% Load reference path for recorded drive segment
data = load('sim3d_DriveSegmentUSCityBlock.mat');

% Set up workspace variables used by model
refPosesX = data.driveSegmentUSCityBlock.refPathX;
refPosesY = data.driveSegmentUSCityBlock.refPathY;
refPosesT = data.driveSegmentUSCityBlock.refPathT;

% Display path on scene image
sceneName = 'USCityBlock';
hScene = figure;
helperShowSceneImage(sceneName);
hold on
scatter(refPosesX(:,2), refPosesY(:,2), [], 'filled')

% Adjust axes limits
xlim([-60 30])
ylim([-30 50])

SimulateLidarSensorPerceptionAlgorithm Модель Simulink сконфигурирована со сценой Городского квартала США с помощью Симуляции 3D Блок Configuration Сцены. Модель помещает транспортное средство в сцену с помощью Симуляции 3D Транспортное средство с блоком Ground Following. Датчик лидара присоединен к транспортному средству с помощью блока Simulation 3D Lidar. В диалоговом окне блока используйте вкладку Mounting, чтобы настроить размещение датчика и вкладку Parameters, чтобы сконфигурировать свойства датчика симулировать различные датчики лидара. В этом примере лидар смонтирован на центре крыши. Датчик лидара сконфигурирован, чтобы смоделировать типичный датчик Velodyne® HDL-32E.

close(hScene)

if ~ispc
    error(['3D Simulation is only supported on Microsoft', char(174), ' Windows', char(174), '.']);
end

% Open the model
modelName = 'SimulateLidarSensorPerceptionAlgorithm';
open_system(modelName);
snapnow;

Модель использует активированную подсистему, чтобы иметь два режима на основе состояния recordMode переменная рабочей области.

  • RecordMode: когда recordMode установлен в true, модель записывает и визуализирует синтетические данные о лидаре.

  • Режим алгоритма: когда recordMode установлен в false, модель запускает алгоритм восприятия, описанный позже в разделе Simulate with Perception Algorithm.

Для получения дополнительной информации об активированных подсистемах, смотрите Используя Enabled Подсистемы (Simulink).

Остальная часть примера выполняет эти шаги:

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

  2. Используйте данные о датчике, сохраненные в рабочую область, чтобы разработать алгоритм восприятия в MATLAB. Алгоритм восприятия создает карту среды.

  3. Используйте разработанное восприятие в алгоритме цикла путем симуляции модели в режиме алгоритма.

Запишите и визуализируйте данные о датчике лидара синтетического продукта

Запись и Визуализирует записи подсистемы синтетические данные о лидаре к рабочей области с помощью блока To Workspace. Визуализировать блок MATLAB function Облака точек использует pcplayer объект визуализировать облака точек потоковой передачи.

subsystemName = [modelName, '/', 'Record and Visualize'];
open_system(subsystemName, 'force');
snapnow;

Симулируйте модель в режиме записи и наблюдайте отображение облака точек потоковой передачи, показывая синтетические данные о датчике лидара. Если модель завершила симуляцию, simOut переменная содержит структуру с переменными, записанными в рабочую область. helperGetPointCloud функционируйте извлекает данные о датчике в массив pointCloud объекты. pointCloud объект является основной структурой данных, используемой, чтобы содержать данные о лидаре и выполнить обработку облака точек в MATLAB.

% Close the Record and Visualize subsystem
close_system(subsystemName);

% Set mode to record data
recordMode = true; %#ok<NASGU>

% Update simulation stop time to end when reference path is completed
simStopTime = refPosesX(end,1);
set_param(gcs, 'StopTime', num2str(simStopTime));

% Run the simulation
simOut = sim(modelName);

% Create a pointCloud array from the recorded data
ptCloudArr = helperGetPointCloud(simOut);

Используйте записанные данные, чтобы разработать алгоритм восприятия

Синтетические данные о датчике лидара могут использоваться, чтобы разработать, экспериментировать с и проверить алгоритм восприятия в различных сценариях. Этот пример использует алгоритм, чтобы создать 3D карту среды от потоковой передачи данных о лидаре. Такой алгоритм является базовым блоком для приложений как одновременная локализация и отображение (SLAM). Этот алгоритм может также использоваться, чтобы создать карты высокой четкости (HD) для географических областей, которые могут затем использоваться в онлайновой локализации. Карта, создающая алгоритм, инкапсулируется в helperLidarMapBuilder класс. Этот класс использует облако точек и возможности обработки лидара в MATLAB. Смотрите Лидар и Облако точек, Обрабатывающее (Computer Vision Toolbox).

helperLidarMapBuilder класс берет входящие облака точек из лидара и прогрессивно создает карту с помощью следующих шагов:

  1. Предварительно обработайте каждое входящее облако точек, чтобы удалить землю и автомобиль, оборудованный датчиком.

  2. Укажите входящее облако точек с последним облаком точек с помощью нормального распределения преобразовывает (NDT). pcregisterndt функция выполняет регистрацию. Улучшить точность и КПД регистрации, pcdownsample используется, чтобы проредить облако точек до регистрации.

  3. Используйте предполагаемое преобразование, полученное из регистрации, чтобы преобразовать входящее облако точек к системе отсчета карты.

Для простоты этот пример использует алгоритм отображения только для лидара без внешних сигналов от других датчиков. Такой алгоритм восприимчив к дрейфу при накоплении карты по длинным последовательностям. Кроме того, ОСНОВАННАЯ НА NDT регистрация чувствительна к инициализации. Это типично, чтобы использовать внешние сигналы как точный расчет или IMU, чтобы инициализировать регистрацию.

% Create a lidar map builder
mapBuilder = helperLidarMapBuilder();

% Loop through the point cloud array and progressively build a map
skipFrames = 5;
numFrames  = numel(ptCloudArr);
exitLoop   = false;

for n = 1 : skipFrames : numFrames-skipFrames

    % Update map with new lidar frame
    updateMap(mapBuilder, ptCloudArr(n));

    % Update top-view display
    isDisplayOpen = updateDisplay(mapBuilder, exitLoop);

    % Check and exit if needed
    exitLoop = ~isDisplayOpen;
end

snapnow;

% Close display
closeDisplay = true;
updateDisplay(mapBuilder, closeDisplay);

Визуализируйте вычисленное использование накопленной карты записанных данных.

hFigRecorded = figure;
pcshow(mapBuilder.Map)
title('Point Cloud Map - Recorded Data')

% Customize axes labels
xlabel('X (m)')
ylabel('Y (m)')
zlabel('Z (m)')

Симулируйте с алгоритмом восприятия

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

Чтобы обновить модель к режиму алгоритма, установите recordMode переменная к false. Этот режим включает Карту Сборки из подсистемы Лидара, которая использует блок MATLAB function, чтобы запустить алгоритм восприятия в процессе моделирования.

close(hFigRecorded)

subsystemName = [modelName, '/', 'Build Map from Lidar'];
open_system(subsystemName, 'force');
snapnow;

% Set record mode to false to enable perception in the loop
recordMode = false; %#ok<NASGU>

% Simulate with perception
sim(modelName);
snapnow;

Заключение

В этом примере вы использовали интерфейс Simulink для 3D среды симуляции к:

  1. Запишите синтетические данные о датчике для датчика лидара.

  2. Разработайте алгоритм восприятия с помощью зарегистрированных данных.

  3. Протестируйте алгоритм восприятия в процессе моделирования.

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

% Close windows
close_system(subsystemName)
close_system(modelName)

% Reset record mode
recordMode = true;

Вспомогательные Функции

Извлечение helperGetPointCloud массив pointCloud объекты.

function ptCloudArr = helperGetPointCloud(simOut)

% Extract signal
ptCloudData = simOut.ptCloudData.signals.values;

% Create a pointCloud array
ptCloudArr = pointCloud(ptCloudData(:,:,:,1));

for n = 2 : size(ptCloudData,4)
    ptCloudArr(end+1) = pointCloud(ptCloudData(:,:,:,n));  %#ok<AGROW>
end
end

Смотрите также

| |

Похожие темы