В этом примере показано, как протестировать детектор маркера маршрута на основе монокулярной камеры и сгенерировать код С++ для приложений реального времени на предварительно созданной сцене 3D из среды симуляции вождения Unreal Engine ®. Этот пример подтверждает алгоритм детектора маркеров маршрута с помощью метрик и проверяет сгенерированный код С++ с помощью симуляции цикл.
Детектор маркера маршрута является основным компонентом восприятия беспилотного привода. Детектор анализирует изображения дорог, захваченных с помощью монокулярного датчика камеры, и возвращает информацию о типах кривизны и разметки каждой полосы. Вы можете проектировать и моделировать алгоритм детектора маркера маршрута с помощью MATLAB ® или Simulink ® и оценить его точность с помощью известной основной истины. Можно сделать генерацию кода С++, чтобы интегрировать детектор во внешнее программное окружение и развернуть на транспортном средстве. Выполнение генерации кода и верификации модели Simulink обеспечивает функциональную эквивалентность между симуляцией и реализацией в реальном времени.
Для получения информации о том, как спроектировать детектор маркера маршрута, смотрите пример Design Lane Marker Detector Using Unreal Engine Simulation Environment. В этом примере показано, как протестировать детектор маркера маршрута в 3D среде симуляции и сгенерировать код С++ для реализации в реальном времени. В этом примере вы будете:
Исследуйте и симулируйте модель детектора маркера маршрута.
Оцените точность алгоритма детектора маркера маршрута путем сравнения с основной истиной.
Сгенерируйте код С++ из модели алгоритма.
Проверьте реализацию с помощью симуляции ПО в цикле (SIL).
Оцените время выполнения и выполните анализ покрытия кода. Для выполнения анализа покрытия кода необходимо использовать Simulink Coverage™.
Этот пример проверяет алгоритм детектора маркеров маршрута на 3D среде симуляции, которая использует Unreal Engine ® из Epic Games ®. Для симуляции движущей среды Unreal Engine требуется 64-разрядная платформа Windows ®.
if ~ispc error(['Unreal driving simulation environment is only supported on Microsoft', char(174), ' Windows', char(174), '.']); end
Чтобы гарантировать воспроизводимость результатов симуляции, установите случайный seed.
rng(0);
Система детектора маркера маршрута в этом примере имеет испытательный стенд детектора маркера маршрута и образец модели.
Тестовая модель: тестовая модель моделирует и проверяет поведение алгоритма датчика маркера переулка в разомкнутом контуре.
Образец модели: Блок Lane Marker Detector в тестовой модели вызывает LaneMarkerDetector
образец модели. Образец модели реализует алгоритм обнаружения маркера маршрута и генерирует код С++ алгоритма. Этот образец модели может быть интегрирована с системами с обратной связью.
Откройте тестовую модель.
open_system('LaneMarkerDetectorTestBench');
Открытие этой модели запускает helperSLLaneMarkerDetectorSetup
скрипт, который инициализирует дорожный сценарий с помощью drivingScenario
объект в базовом рабочем пространстве. Он также конфигурирует параметры детектора маркера маршрута, параметры модели транспортного средства и сигналы шины Simulink, необходимые для определения входов и выходов для LaneMarkerDetectorTestBench
модель. Тестовая модель содержит следующие подсистемы:
Сценарий 3D симуляции: Задает сцену, транспортные средства и датчик камеры, используемый для симуляции.
Детектор маркера маршрута: Реализует алгоритм детектора маркера маршрута.
Оценка метрики: Оценивает поведение алгоритма детектора маркера маршрута с помощью метрик, которые включают истинные срабатывания, ложные срабатывания и ложные срабатывания.
Визуализация: Отображает систему координат, захваченную датчиком камеры, и накладывает обнаружение маршрута во время симуляции.
Подсистема Симуляции 3D Scenario конфигурирует дорожную сеть, устанавливает транспортное средство положения и синтезирует датчики. Это похоже на подсистему Simulation 3D Scenario в примере Highway Lane Following. Однако подсистема Simulation 3D Scenario, используемая в этом примере, не имеет радарного датчика. Откройте подсистему Simulation 3D Scenario.
open_system('LaneMarkerDetectorTestBench/Simulation 3D Scenario');
Детектор маркера маршрута - этот образец модели, которая обнаруживает контуры маршрута в системы координат. Откройте образец модели «Детектор маркера маршрута».
open_system('LaneMarkerDetector');
Блок детектора маркера маршрута использует системную Object™, HelperLaneDetectorWrapper
, который конфигурирует и реализует алгоритм обнаружения маркера маршрута. Блок принимает системы координат, захваченную датчиком камеры, за вход и выводит обнаруженные контуры маршрута при помощи LaneSensor
Шина Simulink.
Подсистема Metrics Assessment оценивает точность результатов обнаружения с помощью основной истины. Откройте подсистему Metrics Assessment.
open_system('LaneMarkerDetectorTestBench/Metrics Assessment');
Подсистема оценки метриков сравнивает обнаруженные контуры маршрута и основной истины контуров маршрута с помощью evaluateLaneBoundaries
функция. Функция вычисляет боковое расстояние между обнаруженными контурами маршрута и достоверных данных. Если вычисленное расстояние находится внутри определенного порога, обнаруженный контур рассматривается как допустимое соответствие (истинное положительное), и соответствующее состояние маршрута устанавливается равным 1. В противном случае функция оценивает, является ли контур ложноотрицательной или ложноположительной, и затем устанавливает статус маршрута равным 0. Подсистема соединяет выходы left_lane_status
и right_lane_status
к лампам на приборной панели. Лампы идут green
когда статус маршрута равен 1, и переходите red
если состояние маршрута 0. Выходные выходы left_lane_metrics
и right_lane_metrics
являются массивами 1 на 3, содержащими совпадения маршрута (истинные срабатывания), промахи (ложные срабатывания) и ложные срабатывания для левого и правого диапазонов соответственно. Средние отклонения в левой и правой полосах, вычисленные по обнаруженным контурам маршрута, возвращаются на выходах left_lane_distance
и right_lane_distance
соответственно. Модель использует эти значения отклонения, чтобы проверить точность алгоритма во время симуляции с помощью блоков Check Static Range (Simulink): Verify Left Lane Deviation и Verify Right Lane Deviation.
Сконфигурируйте LaneMarkerDetectorTestBench
модель для симуляции в scenario_LD_02_SixVehicles
сценарий. Этот сценарий содержит шесть транспортных средств, включая автомобиль , оборудованный датчиком, и определяет их траектории.
helperSLLaneMarkerDetectorSetup("scenario_LD_02_SixVehicles");
Симулируйте тестовую модель. Используйте окно визуализации и индикаторы состояния на инструментальной панели, чтобы просмотреть результаты обнаружения во время симуляции.
sim('LaneMarkerDetectorTestBench');
Можно также визуализировать основную истину контуров маршрута путем включения EnableTruthDisplay
параметр mask в блоке Visualization.
Проанализируйте результаты обнаружения и проверьте общую эффективность алгоритма.
Во время симуляции модель выводит три параметра, которые характеризуют контур маршрута: кривизну, угол рыскания и боковое смещение. Модель регистрирует эти параметры для обнаруженных контуров маршрута и основной истины в переменной базового рабочего пространства logsout
. Можно построить график значений в logsout
при помощи helperLaneBoundaryParams
функция.
helperPlotLaneBoundaryParams(logsout);
Из графиков можно вывести отклонения между основной истиной и обнаруженными контурами маршрута. Большое отклонение между графиками указывает, что обнаруженный контур маршрута значительно удалён от основной истины.
Можно также проверить эффективность алгоритма детектора маркера маршрута путем валидации и построения графиков метрик отдельно для левого и правого маршрутов. Модель также регистрирует результаты обнаружения для левого и правого маршрутов, вычисленных подсистемой Metric Assesment, в переменной базового рабочего пространства logsout
. Подсистема Metric Assesment выводит:
Метрики левой полосы: Возвращается как массив, который содержит количество соответствий (истинных положительных), промахов (ложных отрицательных) и ложных срабатываний, вычисленных из обнаружений для левой полосы дороги.
Статус левой полосы: Возвращается как true или false. Значение true для матчей в левой полосе и false для промахов и ложных срабатываний в левой полосе.
Расстояние в левой полосе: Скаляр, задающий среднее значение расстояний между обнаруженными точками контура в левой полосе и основной истине для левой полосы.
Метрики правого ряда: Возвращается как массив, который содержит количество соответствий (истинных срабатываний), промахов (ложных срабатываний) и ложных срабатываний, вычисленных из обнаружений для правой полосы дороги.
Состояние правой полосы: Возвращается как true или false. Значение true для соответствий в правой полосе и false для промахов и ложных срабатываний в правой полосе.
Расстояние правого маршрута: скаляр, задающий среднее значение расстояний между обнаруженными краевыми точками правого маршрута и основной истиной для правого маршрута.
Постройте график результатов обнаружения для левого и правого маршрутов с помощью helperPlotLaneMetrics
скрипт:
[numLaneMatches, numLaneMisses, numFalsePositives] = helperPlotLaneMetrics(logsout);
Из графиков можно сделать вывод, что все обнаруженные левая полоса и правая полоса контуров совпадать с основной истиной и что нет ложных срабатываний или ложных срабатываний.
Во время симуляции модель записывает выход датчика камеры в forwardFacingCamera.mp4
. Можно наложить результаты отклонений на полосы движения, обнаруженные в системы координат, и запись на видео файла при помощи helperPlotLaneDetectionResults
функция.
hVideoViewer = helperPlotLaneDetectionResults(... logsout, "forwardFacingCamera.mp4" , scenario, camera,scenarioFcnName,... "RecordVideo", true,"RecordVideoFileName", scenarioFcnName,... "OpenRecordedVideoInVideoViewer", true,"VideoViewerJumpToTime", 9.3);
Можно также вычислить общую точность и чувствительность алгоритма обнаружения маркера маршрута, как показано ниже:
Точность: Вычислите как процент истинных срабатываний в общем числе обнаруженных контуров маршрута.
precision = (numLaneMatches./(numLaneMatches+numFalsePositives))*100; disp(precision);
100
Чувствительность: Вычислите как процент истинных срабатываний в общем количестве фактических контуров маршрута.
sensitivity = (numLaneMatches./(numLaneMatches+numLaneMisses))*100; disp(sensitivity);
100
Точность и значения чувствительности устойчивого детектора маркера маршрута должны быть близки к 100 для различных сценариев тестирования и условий тестирования.
Теперь можно сгенерировать код С++ для алгоритма, применить общие оптимизации и сгенерировать отчет, чтобы облегчить исследование сгенерированного кода.
Сконфигурируйте LaneMarkerDetector
модель для генерации кода С++ для реализации алгоритма в реальном времени. Установите параметры модели, чтобы включить генерацию кода и отобразить строение значения.
Установите и просмотрите параметры модели, чтобы включить генерацию кода С++.
helperSetModelParametersForCodeGeneration('LaneMarkerDetector'); save_system('LaneMarkerDetector');
Model configuration parameters: Parameter Value Description ___________________________________ _______________ ______________________________________________________________________________________________________________________ {'SystemTargetFile' } {'ert.tlc' } {'Code Generation>System target file' } {'TargetLang' } {'C++' } {'Code Generation>Language' } {'SolverType' } {'Fixed-step' } {'Solver>Type' } {'FixedStep' } {'auto' } {'Solver>Fixed-step size (fundamental sample time)' } {'EnableMultiTasking' } {'on' } {'Solver>Treat each discrete rate as a separate task' } {'ProdLongLongMode' } {'on' } {'Hardware Implementation>Support long long' } {'BlockReduction' } {'on' } {'Simulation Target>Block reduction' } {'MATLABDynamicMemAlloc' } {'on' } {'Simulation Target>Simulation Target>Dynamic memory allocation in MATLAB functions' } {'OptimizeBlockIOStorage' } {'on' } {'Simulation Target>Signal storage reuse' } {'InlineInvariantSignals' } {'on' } {'Simulation Target>Inline invariant signals' } {'BuildConfiguration' } {'Faster Runs'} {'Code Generation>Build configuration' } {'RTWVerbose' } {'of' } {'Code Generation>Verbose build' } {'CombineSignalStateStructs' } {'on' } {'Code Generation>Interface>Combine signal/state structures' } {'SupportVariableSizeSignals' } {'on' } {'Code Generation>Interface>Support variable-size signals' } {'CodeInterfacePackaging' } {'C++ class' } {'Code Generation>Interface>Code interface packaging' } {'GenerateExternalIOAccessMethods'} {'Method' } {'Code Generation>Interface>Data Member Visibility>External I/O access' } {'EfficientFloat2IntCast' } {'on' } {'Code Generation>Optimization>Remove code from floating-point to integer conversions that wraps out-of-range values'} {'ZeroExternalMemoryAtStartup' } {'off' } {'Code Generation>Optimization>Remove root level I/O zero initialization (inverse logic)' } {'CustomSymbolStrGlobalVar' } {'$N$M' } {'Code Generation>Symbols>Global variables' } {'CustomSymbolStrType' } {'$N$M_T' } {'Code Generation>Symbols>Global types' } {'CustomSymbolStrField' } {'$N$M' } {'Code Generation>Symbols>Field name of global types' } {'CustomSymbolStrFcn' } {'APV_$N$M$F' } {'Code Generation>Symbols>Subsystem methods' } {'CustomSymbolStrTmpVar' } {'$N$M' } {'Code Generation>Symbols>Local temporary variables' } {'CustomSymbolStrMacro' } {'$N$M' } {'Code Generation>Symbols>Constant macros' }
Сгенерируйте код и проверьте отчет генерации кода из образца модели.
slbuild('LaneMarkerDetector');
### Starting build procedure for: LaneMarkerDetector ### Successful completion of build procedure for: LaneMarkerDetector Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================== LaneMarkerDetector Code generated and compiled Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 1m 15.75s
Используйте отчет генерации кода для исследования сгенерированного кода. Дополнительные сведения об отчете о генерации кода см. в разделе Отчеты о генерации кода (Embedded Coder). Используйте ссылку Отчет по интерфейсам кода в Отчете о генерации кода, чтобы исследовать следующие сгенерированные методы:
LaneMarkerDetector_initialize
: Вызывать один раз при инициализации.
LaneMarkerDetector_step
: Периодически вызывайте каждый шаг, чтобы выполнить алгоритм обнаружения маркера маршрута.
LaneMarkerDetector_terminate
: Вызов один раз при расторжении.
Дополнительные методы get и set для интерфейса сигнала объявлены в LaneMarkerDetector.h
и определено в LaneMarkerDetector.cpp
.
После генерации кода С++ для детектора маркера маршрута, теперь можно оценить функциональность кода с помощью симуляции цикл (SIL). Он обеспечивает раннее понимание поведения развернутого приложения. Для получения дополнительной информации о SIL симуляции см. SIL и PIL симуляции (Embedded Coder).
SIL симуляция позволяет вам проверить, что скомпилированный сгенерированный код на хосте функционально эквивалентен режиму normal mode.
Сконфигурируйте параметры алгоритма и тестовой модели, чтобы поддержать SIL симуляцию и логгирование информации о выполнении.
helperSetModelParametersForSIL('LaneMarkerDetector'); helperSetModelParametersForSIL('LaneMarkerDetectorTestBench');
LaneMarkerDetector configuration parameters: Parameter Value Description ________________________________ ____________________ ____________________________________________________________ {'SystemTargetFile' } {'ert.tlc' } {'Code Generation>System target file' } {'TargetLang' } {'C++' } {'Code Generation>Language' } {'CodeExecutionProfiling' } {'on' } {'Code Generation>Verification>Measure task execution time'} {'CodeProfilingSaveOptions' } {'AllData' } {'Code Generation>Verification>Save options' } {'CodeExecutionProfileVariable'} {'executionProfile'} {'Code Generation>Verification>Workspace variable' } LaneMarkerDetectorTestBench configuration parameters: Parameter Value Description ________________________________ ____________________ ____________________________________________________________ {'SystemTargetFile' } {'ert.tlc' } {'Code Generation>System target file' } {'TargetLang' } {'C++' } {'Code Generation>Language' } {'CodeExecutionProfiling' } {'on' } {'Code Generation>Verification>Measure task execution time'} {'CodeProfilingSaveOptions' } {'AllData' } {'Code Generation>Verification>Save options' } {'CodeExecutionProfileVariable'} {'executionProfile'} {'Code Generation>Verification>Workspace variable' }
Сконфигурируйте тестовую модель, чтобы симулировать детектор маркера маршрута в режиме цикл (SIL).
set_param('LaneMarkerDetectorTestBench/Lane Marker Detector','SimulationMode','Software-in-the-loop (SIL)'); sim('LaneMarkerDetectorTestBench');
### Starting build procedure for: LaneMarkerDetector ### Generated code for 'LaneMarkerDetector' is up to date because no structural, parameter or code replacement library changes were found. ### Successful completion of build procedure for: LaneMarkerDetector Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================ LaneMarkerDetector Code compiled Compilation artifacts were out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 22.046s ### Preparing to start SIL simulation ... Building with 'MinGW64 Compiler (C)'. MEX completed successfully. ### Starting SIL simulation for component: LaneMarkerDetector ### Stopping SIL simulation for component: LaneMarkerDetector ### Completed code coverage analysis
Можно сравнить выходы из режима нормальной симуляции и режима симуляции цикл (SIL). Можно проверить, находятся ли различия между этими запусками в пределах допуска, используя следующий код. Постройте график различий обнаруженных параметров контура маршрута между режимом симуляции нормали и режимом SIL симуляции.
runIDs = Simulink.sdi.getAllRunIDs; normalSimRunID = runIDs(end - 1); SilSimRunID = runIDs(end); diffResult = Simulink.sdi.compareRuns(normalSimRunID ,SilSimRunID);
Постройте график различий между параметрами контура маршрута, вычисленными из режима normal mode и режима SIL.
helperPlotDiffSignals(diffResult);
Заметьте, что различия между значениями граничных параметров маршрута между режимом normal mode симуляции и режимом SIL симуляции примерно равны нулю. Однако существуют небольшие различия из-за различных методов округления, используемых различными компиляторами.
Во время симуляции цикла (SIL) логгируйте метрики времени выполнения для сгенерированного кода на хост-компьютер к переменной executionProfile
в базовом рабочем пространстве MATLAB. Это время может быть ранним индикатором для эффективности сгенерированного кода. Для точных измерений времени выполнения профилируйте сгенерированный код, когда он интегрирован во внешнее окружение или при использовании с симуляцией «цикл» (PIL). Дополнительные сведения о профилировании SIL см. в разделе Профилирование выполнения кода с SIL и PIL (Embedded Coder).
Постройте график времени выполнения для LaneMarkerDetector_step
функция, использующая helperPlotExecutionProfile
функция.
helperPlotExecutionProfile(executionProfile);
Заметьте, что вы можете вывести среднее время на систему координат для детектора маркера маршрута из этого графика. Для получения дополнительной информации о генерации профилей выполнения и анализе их во время SIL симуляции, смотрите Профилирование времени выполнения для SIL и PIL (Embedded Coder).
Если у вас есть лицензия Simulink Coverage™, можно также выполнить анализ покрытия кода для сгенерированного кода, чтобы измерить полноту проверки. Можно использовать недостающее покрытие данные, чтобы найти погрешности в проверке, недостающие требования или непредусмотренную функциональность. Сконфигурируйте настройки покрытия и симулируйте тестовую модель, чтобы сгенерировать отчет анализа покрытия. Найдите сгенерированный отчет CoverageResults/LaneMarkerDetector.html
в рабочей директории.
if(license('test','Simulink_Coverage')) helperCoverageSettings('LaneMarkerDetectorTestBench'); cvDataObj = cvsim('LaneMarkerDetectorTestBench'); cvhtml('CoverageResults/LaneMarkerDetector',cvDataObj); end
### Starting build procedure for: LaneMarkerDetector ### Generated code for 'LaneMarkerDetector' is up to date because no structural, parameter or code replacement library changes were found. ### Successful completion of build procedure for: LaneMarkerDetector Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================ LaneMarkerDetector Code compiled Compilation artifacts were out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 17.364s ### Preparing to start SIL simulation ... ### Starting SIL simulation for component: LaneMarkerDetector ### Stopping SIL simulation for component: LaneMarkerDetector ### Completed code coverage analysis
Вы можете найти Decision Coverage, покрытие операторов и результаты покрытия функции во время симуляции сгенерированного кода для этого сценария тестирования, scenario_LD_02_SixVehicles
. Можно протестировать эту модель с различными сценариями, чтобы получить полное покрытие сгенерированного кода. Для получения дополнительной информации о том, как анализировать результаты покрытия во время симуляции ПО в цикле, смотрите Покрытие кода для моделей в режиме ПО в цикле (SIL) и в режиме ПО в цикле (PIL) (Embedded Coder)
Этот пример предоставляет дополнительные сценарии, которые можно использовать с LaneMarkerDetectorTestBench
модель:
scenario_LF_01_Straight_RightLane scenario_LF_02_Straight_LeftLane scenario_LF_03_Curve_LeftLane scenario_LF_04_Curve_RightLane scenario_LD_01_ThreeVehicles scenario_LD_02_SixVehicles [Default]
Используйте сценарии с префиксом scenario_LF
в имени файла для тестирования алгоритма обнаружения маркера маршрута без препятствий для других транспортных средств. Транспортные средства все еще существуют в сценарии, но расположены так, что они не находятся в пределах видимой области значений автомобиля , оборудованного датчиком.
Используйте сценарии с префиксом scenario_LD
в имени файла для тестирования алгоритма обнаружения маркера маршрута, в то время как другие автомобили на дороге находятся в пределах видимой области значений автомобиля , оборудованного датчиком.
При разработке и тестировании алгоритма обнаружения маркеров маршрута в разомкнутом контуре полезно начать со сценария, в котором есть только автомобиль , оборудованный датчиком. Чтобы сконфигурировать модель и рабочую область для такого сценария, используйте следующий код.
helperSLLaneMarkerDetectorSetup("scenario_LF_04_Curve_RightLane");
Можно использовать эту модель, чтобы интегрировать RoadRunner™ сцены в сценарии вождения для симуляции и проверки.