В этом примере показано, как протестировать дорожку после контроллера и сгенерировать код C++ для приложений реального времени на заранее созданной сцене 3D из среды моделирования вождения Unreal Engine ®.
В этом примере выполняется следующее:
Разработка модели испытательного стенда для проверки работоспособности полосы движения в соответствии с логикой принятия решений и контроллером с информацией о достоверности данных на земле.
Создайте код для полосы, следуя логике принятия решений и контроллеру, и проверьте функциональную эквивалентность с помощью моделирования программного обеспечения в цикле (SIL).
Контроллер, следующий за полосой, является фундаментальным компонентом в последующих приложениях. Контроллер, следующий за полосой, генерирует команды управления углом поворота и ускорением для эго-транспортного средства, используя информацию о полосе и транспортном средстве вместе с установленной скоростью.
Контроллер, следующий за полосой движения, сочетает в себе продольное и боковое управление. Продольный контроллер отвечает за поддержание заданной водителем скорости и сохранение безопасного расстояния от ведущего транспортного средства. Боковой контроллер отвечает за удержание транспортного средства в центре его текущей полосы движения. В этом примере используется информация о дорожке истинности земли и транспортном средстве для тестирования полосы после контроллера. Дополнительные сведения см. в разделе Путь к системе управления (панель инструментов управления с предсказанием модели).
В этом примере показано, как протестировать и проверить функциональность полосы, следующей за контроллером, с использованием среды моделирования 3D. В этом примере выполняется следующее:
Изучите модель испытательного стенда.
Смоделировать модель испытательного стенда.
Создайте код C++ из ссылочной модели.
Оцените функциональность созданного кода с помощью проверки SIL.
Оцените время выполнения и выполните анализ покрытия кода.
Изучите дополнительные сценарии, приведенные в этом примере.
Следующий контроллер полосы движения тестируется в среде моделирования 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
В этом примере используется модель испытательного стенда для моделирования на уровне системы, чтобы изучить поведение контроллера для следующей системы полосы движения. Откройте модель испытательного стенда для моделирования на уровне системы.
open_system('HighwayLaneFollowingControllerTestBench');

При открытии этой модели запускается helperSLHighwayLaneFollowingControllerSetup сценарий, который инициализирует сценарий дороги с помощью drivingScenario в базовой рабочей области. Он также конфигурирует следующие параметры контроллера полосы движения, параметры модели транспортного средства и сигналы шины Simulink, необходимые для определения входов и выходов для HighwayLaneFollowingControllerTestBench модель.
Модель испытательного стенда содержит следующие подсистемы:
Моделирование 3D Сценарий - Эта подсистема определяет дорогу, транспортные средства, используемые для моделирования.
Lane Following Decision Logic - эта подсистема определяет боковую и продольную логику принятия решений.
Контроллер следования по полосам движения - эта подсистема определяет контроллер следования по путям движения, который генерирует управляющие команды для управления эго-транспортным средством.
Динамика транспортного средства - эта подсистема определяет динамическую модель для транспортного средства ego.
Оценка метрик - эта подсистема определяет метрики для оценки поведения на уровне системы.
Подсистема Vehicle Dynamics является той же подсистемой, что и в примере «Полоса движения». В этом примере основное внимание уделяется ссылочным моделям Lane Following Decision Logic и Lane Following Controller.
Подсистема моделирования 3D сценария конфигурирует дорожную сеть, устанавливает местоположение транспортного средства и упаковывает истинные данные, аналогично подсистеме моделирования 3D сценария в поле «Highway Lane Following». Однако подсистема моделирования 3D сценария, используемая в этом примере, не имеет датчиков. Вместо этого наземные данные истинности из блока считывателя сценариев упаковываются в полосы движения и структуру шины транспортного средства, чтобы обеспечить входные данные для полосы движения, следуя логике принятия решения. Откройте подсистему моделирования 3D сценария.
open_system('HighwayLaneFollowingControllerTestBench/Simulation 3D Scenario');

Функциональный блок Pack Actors Truth MATLAB ® упаковывает основную информацию об истинности акторов в структуру шины трекера, которая требуется ссылочной модели Lane Following Decision Logic.
Для получения информации об истинности полосы движения из среды моделирования 3D к эго-транспортному средству присоединен блок генератора моделирования 3D визуального обнаружения.
Функциональный блок Pack Lanes Truth MATLAB упаковывает информацию об истинности на основе полосы в структуру шины полосы, которая требуется ссылочной модели логики принятия решений.
Блок «задний мост - центр транспортного средства» перемещает детекторы полосы движения с заднего моста на центр транспортного средства в соответствии с требованиями бокового контроллера.
Логика принятия решений по дорожке движения - это эталонная модель, которая определяет информацию о ведущем транспортном средстве и центр полосы движения. Эта информация необходима модели контроллера «Lane Following Controller». Открыть модель Lane Following Decision Logic.
open_system('LaneFollowingDecisionLogic');

Функциональный блок Find Lead Car MATLAB находит ведущий автомобиль, который является наиболее важным объектом (MIO), присутствующим перед эго-автомобилем в той же полосе. Он выводит относительное расстояние и относительную скорость между эго-транспортным средством и MIO.
Подсистема «Расчетный центр полосы движения» вычисляет центр полосы движения полосы эго-движения, который требуется для модели «Полоса вслед за контроллером».
Контроллер следования по дорожке принимает в качестве входных данных информацию MIO и информацию о центре дорожки из эталонной модели логики принятия решения, а также заданную скорость и продольную скорость эго-транспортного средства. Затем модель генерирует управляющие команды (угол поворота и ускорение) для эго-транспортного средства. Откройте модель Lane Following Controller.
open_system('LaneFollowingController');

Блок «Просмотр кривизны» вычисляет кривизну, боковое отклонение и относительный угол рыскания с использованием информации о центре полосы движения. Контроллер использует предварительно просматриваемую информацию для вычисления угла поворота эго транспортного средства. Боковое отклонение измеряет расстояние между эго-транспортным средством и центром полосы движения. Относительный угол рыскания измеряет разность углов рыскания между эго-транспортным средством и дорогой. Блок ISO 8855 - SAE J670E внутри подсистемы преобразует координаты полосы движения из стандарта ISO 8855 в стандарт SAE J670E, используемый контроллером MPC.
Блок контроллера MPC использует блок «Система управления путем следования» (Model Predictive Control Toolbox) из Toolbox™ управления моделями Predictive Control. Блок контроллера следования пути удерживает транспортное средство, движущееся в пределах обозначенной полосы шоссе, сохраняя при этом заданную водителем скорость. Этот контроллер включает комбинированное продольное и боковое управление эго-транспортным средством:
Продольное управление поддерживает заданную водителем скорость эго-транспортного средства.
Боковое управление удерживает эго-транспортное средство, движущееся вдоль центральной линии его полосы движения, регулируя угол поворота эго-транспортного средства.
Контроллер MPC обеспечивает медленную и устойчивую реакцию на эго-автомобиль. В аварийных условиях требуется более быстрое реагирование, и блок контроллера торможения сторожевого пульта применяет тормоза в таких условиях.
На основании состояния торможения блока контроллера торможения сторожевого пульта подсистема выбора режима контроллера выдает команду ускорения, которая определяет, следует ли ускорять или замедлять.
Сконфигурируйте HighwayLaneFollowingControllerTestBench модель для моделирования scenario_LFACC_03_Curve_StopnGo сценарий. Этот сценарий содержит шесть транспортных средств, включая эго-транспортное средство, и определяет их траектории.
helperSLHighwayLaneFollowingControllerSetup("scenarioFcnName", "scenario_LFACC_03_Curve_StopnGo");
Смоделировать модель испытательного стенда.
sim('HighwayLaneFollowingControllerTestBench');
Assuming no disturbance added to measured output channel #3. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. Assuming no disturbance added to measured output channel #1. -->Assuming output disturbance added to measured output channel #4 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Теперь можно создать код C++ для алгоритма, применить общие оптимизации и создать отчет, чтобы облегчить изучение созданного кода. Сконфигурируйте модели Lane Following Decision Logic и Lane Following Controller для генерации кода C++ для реализации алгоритма в реальном времени. Задайте параметры модели, чтобы включить генерацию кода и отобразить значения конфигурации.
Задайте и просмотрите параметры модели, чтобы включить генерацию кода C++.
helperSetModelParametersForCodeGeneration('LaneFollowingController'); save_system('LaneFollowingController');
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' }
Создайте код и просмотрите отчет о создании кода из ссылочной модели.
rtwbuild('LaneFollowingController');
### Starting build procedure for: LaneFollowingController Assuming no disturbance added to measured output channel #3. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. Assuming no disturbance added to measured output channel #1. -->Assuming output disturbance added to measured output channel #4 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. ### Generated code for 'LaneFollowingController' is up to date because no structural, parameter or code replacement library changes were found. ### Successful completion of build procedure for: LaneFollowingController Build Summary 0 of 1 models built (1 models already up to date) Build duration: 0h 2m 10.889s
После создания кода C++ теперь можно оценить функциональность кода с помощью моделирования SIL. Моделирование обеспечивает раннее понимание поведения развернутого приложения. Дополнительные сведения о моделировании SIL см. в разделе Моделирование SIL и PIL (встроенный кодер).
Моделирование SIL позволяет проверить, что скомпилированный сгенерированный код на хосте функционально эквивалентен обычному режиму.
Настройте параметры ссылочной модели для поддержки моделирования SIL и запишите информацию профилирования выполнения.
helperSetModelParametersForSIL('LaneFollowingController'); helperSetModelParametersForSIL('HighwayLaneFollowingControllerTestBench');
LaneFollowingController 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' }
HighwayLaneFollowingControllerTestBench 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('HighwayLaneFollowingControllerTestBench/Lane Following Controller','SimulationMode','Software-in-the-loop (SIL)'); sim('HighwayLaneFollowingControllerTestBench');
### Starting serial model reference code generation build ### Starting build procedure for: LaneFollowingController Assuming no disturbance added to measured output channel #3. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. Assuming no disturbance added to measured output channel #1. -->Assuming output disturbance added to measured output channel #4 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. ### Successful completion of build procedure for: LaneFollowingController Build Summary Code generation targets built: Model Action Rebuild Reason =============================================================================================== LaneFollowingController Code compiled Model or library LaneFollowingController has changed. 1 of 1 models built (0 models already up to date) Build duration: 0h 2m 29.276s ### Preparing to start SIL simulation ... Building with 'Microsoft Visual C++ 2017 (C)'. MEX completed successfully. ### Starting SIL simulation for component: LaneFollowingController ### Stopping SIL simulation for component: LaneFollowingController
Сравните выходные данные из нормального режима моделирования и режима моделирования SIL. Можно проверить, находятся ли различия между этими прогонами в пределах допуска, с помощью следующего кода. Постройте график различий значений рулевого управления и ускорения между обычным режимом моделирования и режимом моделирования SIL.
runIDs = Simulink.sdi.getAllRunIDs; normalSimRunID = runIDs(end - 1); SilSimRunID = runIDs(end); diffResult = Simulink.sdi.compareRuns(normalSimRunID ,SilSimRunID);
Постройте график различий в выходных параметрах контроллера, вычисленных из нормального режима и режима SIL.
helperPlotLFControllerDiffSignals(diffResult);

Различия между нормальным и SIL режимами моделирования приблизительно равны нулю. Незначительные различия обусловлены различиями в методах округления, используемых различными компиляторами.
Во время моделирования SIL записывайте метрики времени выполнения для сгенерированного кода на хост-компьютере в переменную executionProfile в базовой рабочей области MATLAB. Это время может быть ранним показателем производительности сгенерированного кода. Для точного измерения времени выполнения выполните профилирование сгенерированного кода при его интеграции во внешнюю среду или при использовании моделирования процессора в цикле (PIL). Дополнительные сведения о профилировании PIL см. в разделе Профилирование выполнения кода с использованием SIL и PIL (встроенный кодер).
Постройте график времени выполнения функции _step используя helperPlotExecutionProfile функция.
helperPlotLFControllerExecutionProfile(executionProfile);

На графике можно вывести среднее время, затрачиваемое на временной интервал для полосы, следующей за контроллером. Дополнительные сведения о создании профилей выполнения и их анализе во время моделирования SIL см. в разделе Профилирование времени выполнения для SIL и PIL (встроенный кодер).
При наличии лицензии Simulink Coverage™ можно также выполнить анализ покрытия кода для созданного кода для измерения полноты тестирования. Отсутствующие данные покрытия можно использовать для поиска пробелов в тестировании, отсутствующих требованиях или непреднамеренных функциональных возможностях. Настройте параметры покрытия и смоделируйте модель тестового стенда для создания отчета по анализу покрытия. Поиск созданного отчета CoverageResults/LaneFollowingController_modelrefsil_summary_cov.html в рабочей папке.
if(license('test','Simulink_Coverage')) helperCoverageSettings('HighwayLaneFollowingControllerTestBench'); cvDataGroupObj = cvsim('HighwayLaneFollowingControllerTestBench'); % Get Generated Code coverage of LaneFollowingController. cvDataObj = get(cvDataGroupObj,'LaneFollowingController'); cvhtml('CoverageResults/LaneFollowingController_modelrefsil_summary_cov',cvDataObj); end
### Starting serial model reference code generation build ### Starting build procedure for: LaneFollowingController Assuming no disturbance added to measured output channel #3. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. Assuming no disturbance added to measured output channel #1. -->Assuming output disturbance added to measured output channel #4 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel. ### Successful completion of build procedure for: LaneFollowingController Build Summary Code generation targets built: Model Action Rebuild Reason ===================================================================================== LaneFollowingController Code compiled Code instrumentation settings have changed. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 59.128s ### Preparing to start SIL simulation ... Building with 'Microsoft Visual C++ 2017 (C)'. MEX completed successfully. ### Starting SIL simulation for component: LaneFollowingController ### Stopping SIL simulation for component: LaneFollowingController ### Completed code coverage analysis
При моделировании созданного кода для этого сценария тестирования можно найти результаты покрытия решений, покрытия инструкций и покрытия функций. scenario_LFACC_03_Curve_StopnGo. Можно протестировать эту модель с помощью различных сценариев для получения полного покрытия сгенерированного кода. Дополнительные сведения о том, как анализировать результаты покрытия во время моделирования SIL, см. в разделе Покрытие кода для моделей в режиме программного обеспечения в цикле (SIL) и режиме процессора в цикле (PIL) (встроенный кодер).
Аналогичным образом, можно настроить Lane Following Decision Logic для генерации кода и запуска в SIL для проверки функциональной эквивалентности с моделированием.
В этом примере представлены дополнительные сценарии, которые можно использовать с HighwayLaneFollowingControllerTestBench модель:
scenario_LF_01_Straight_RightLane
scenario_LF_02_Straight_LeftLane
scenario_LF_03_Curve_LeftLane
scenario_LF_04_Curve_RightLane
scenario_LFACC_01_Curve_DecelTarget
scenario_LFACC_02_Curve_AutoRetarget
scenario_LFACC_03_Curve_StopnGo [По умолчанию]
scenario_LFACC_04_Curve_CutInOut
scenario_LFACC_05_Curve_CutInOut_TooClose
scenario_LFACC_06_Straight_StopandGoLeadCar
scenario_ACC_01_ISO_TargetDiscriminationTest
scenario_ACC_02_StopnGo
Изучите комментарии в каждом файле для получения более подробной информации о геометрии дороги и транспортных средств в каждом сценарии. Вы можете настроить HighwayLaneFollowingControllerTestBench модель и рабочая область для моделирования этих сценариев с использованием helperSLHighwayLaneFollowingSetup функционируют следующим образом.
helperSLHighwayLaneFollowingControllerSetup("scenarioFcnName", "scenario_LFACC_04_Curve_CutInOut");
Моделирование Cuboid To 3D | Считыватель сценариев | Моделирование 3D конфигурация сцены | Транспортное средство в мир