В этом примере показано, как изменить модель Simulink ® алгоритма планирования пути и управления транспортным средством, сгенерировать код С++ и проверить сгенерированный код с помощью симуляции ПО в цикле (SIL).
Разработка алгоритма планирования пути и управления транспортным средством часто включает разработку и симуляцию модели алгоритма в Simulink, реализацию алгоритма в коде С++ и интеграцию кода алгоритма во внешнее программное окружение для развертывания в транспортном средстве. Автоматическая генерация и верификация кода из модели алгоритма обеспечивает функциональную эквивалентность между симуляцией и реализацией.
Пример Automated Parking Valet в Simulink показал, как спроектировать алгоритм планирования пути и управления автомобилем. В этом примере показано, как изменить проект для реализации в C++. Следующими шагами в этом рабочем процессе являются:
Разделите проект на алгоритмы и тестовые модели.
Измените модель алгоритма, чтобы поддержать генерацию кода.
Сгенерируйте код С++ из модели алгоритма.
Проверьте поведение сгенерированного кода с помощью SIL симуляции.
Затем можно интегрировать сгенерированный код во внешний программный проект для дальнейшей проверки в транспортном средстве.
Исходная модель из примера Automated Parking Valet в Simulink уже разделена на отдельные алгоритмы и тестовые модели.
Модель алгоритма: AutomatedParkingValetAlgorithm
определяет функциональность планирования пути и управления транспортным средством, которая должна быть реализована на C++.
Тестовая модель: AutomatedParkingValetTestBench
задает стимул и окружение для тестирования модели алгоритма.
The AutomatedParkingValetTestBench
модель задает стимул и окружение для тестирования AutomatedParkingValetAlgorithm
модель. Основные компоненты AutomatedParkingValetTestBench
включают:
Алгоритм Модели-ссылки: AutomatedParkingValetAlgorithm
на блок модели ссылается блок Model. Блок Model и поддержки, симулирующие ссылочную модель в различных режимах симуляции, включая режимы normal и SIL. Чтобы узнать больше о блоке Model, смотрите Ссылку на существующие модели (Simulink).
Costmap: Блок Costmap Creator создает косметику окружения и выводит ее как сигнал шины.
Блок Behavior Planner: The Behavior Planner запускает последовательность навигационных задач, основанную на глобальном плане маршрута, предоставляя промежуточную цель и строение.
Транспортное средство Model: Чтобы продемонстрировать эффективность алгоритма, контроллер парковочного клапана применяется к Транспортному средству Блока Model, которая содержит блок Транспортного средства Body 3DOF.
The AutomatedParkingValetTestBench
модель также сконфигурирована, чтобы записать положение (CurrPose
) и продольная скорость (CurrVelocity
) транспортного средства и состояние, была ли достигнута цель от поведенческого планировщика (GoalReached
). Эти сигналы регистрируются в переменной рабочей области logsout
.
Симулируйте тестовую модель с алгоритмом в режиме normal mode.
open_system('AutomatedParkingValetTestBench') set_param('AutomatedParkingValetTestBench/AutomatedParkingValetAlgorithm','SimulationMode','Normal'); sim('AutomatedParkingValetTestBench') helperPlotSimulationSignals(logsout)
Первый рисунок отображает путь, который транспортное средство прошло от входа парковки до конечного парковочного пространства. Второй рисунок строит графики скорости и сигналов, достигнутых целью. Заметьте, что скорость транспортного средства плавна и непрерывна при переходе между целями.
The AutomatedParkingValetAlgorithm
модель задает функциональность, которая будет реализована в C++. Основные компоненты AutomatedParkingValetAlgorithm
модель являются:
Планировщик пути: Планирует допустимый путь через карту окружения с помощью pathPlannerRRT
объект.
Генератор траектории: сглаживает опорный контур путем аппроксимации сплайнов и преобразует сглаженный контур в траекторию путем формирования профиля скорости.
Контроллер транспортного средства: Управляет рулевым управлением и скоростью транспортного средства, чтобы следовать сгенерированному пути и профилю скорости.
Откройте и обновите модель алгоритма.
open_system('AutomatedParkingValetAlgorithm') set_param('AutomatedParkingValetAlgorithm','SimulationCommand','Update');
The AutomatedValetParking
модель включает несколько модификаций из примера Automated Parking Valet в Simulink для поддержки генерации кода. Наиболее значимыми изменениями являются задание интерфейсов компонентов фиксированного размера и явные переходы скорости.
Интерфейсы компонентов переменного размера были заменены интерфейсом фиксированного размера, чтобы можно было генерировать и проверять Код С++ с SIL симуляцией.
Размер переменной Poses
сигнал был разделен на выходной порт фиксированного размера (RefPosesArray
) с дополнительным выходным портом, определяющим размер (RefPosesSize
).
The costmapBus
шина, сопоставленная с Costmap
входной порт содержит только элементы фиксированного размера, поскольку в этом примере costmap не изменяет размер.
The AutomatedValetParking
модель содержит несколько скоростей. Цвет блоков представляет различные шаги расчета. Планирование пути и генерация траектории выполняются во шаг расчета 0.1 с и окрашены в зеленый цвет. Управление транспортным средством осуществляется во шаг расчета 0,05 с и окрашено в красный цвет. Дополнительные сведения об отображении шага расчета цветов см. в разделе Просмотр Шаге расчета информации (Simulink).
Явные блоки перехода скорости были вставлены в модель, чтобы рассматривать каждую скорость как отдельную задачу.
Блок Rate Transition был вставлен в CurrPose
фиксированного размера сигнал.
Блок helper Varsize Rows Rate Transition (с именем RT) был вставлен в сигналы переменного размера, которые соединяют блоки различной скорости.
Обработка каждой скорости как определенной задачи позволяет сгенерировать класс C++ с отдельными точками входа метода для каждой скорости. Генерация отдельных методов для каждой скорости упрощает интегрирование в многозадачные программные планировщики или операционные системы в транспортном средстве. Чтобы узнать больше о том, как рассматривать скорости как отдельные задачи, смотрите Modeling for Multitasking Execution (Embedded Coder).
Конфигурирование AutomatedParkingValetAlgorithm
модель для генерации кода включает в себя установку параметров на:
Сгенерируйте код С++ с точками входа для каждой скорости.
Примените общие оптимизации.
Сгенерируйте отчет, чтобы облегчить изучение сгенерированного кода.
Установите и просмотрите параметры модели, чтобы включить генерацию кода С++.
helperSetModelParametersForCodeGeneration('AutomatedParkingValetAlgorithm')
Set AutomatedParkingValetAlgorithm 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' } {'GenerateExternalIOAccessMethods'} {'Method' } {'Code Generation>Interface>External I/O access' } {'SupportVariableSizeSignals' } {'on' } {'Code Generation>Interface>Support variable-size signals' } {'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('AutomatedParkingValetAlgorithm');
### Starting build procedure for: AutomatedParkingValetAlgorithm ### Successful completion of build procedure for: AutomatedParkingValetAlgorithm Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================== AutomatedParkingValetAlgorithm 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 26.913s
Используйте Отчет Генерации кода, чтобы исследовать сгенерированный код. Для получения дополнительной информации об отчете о генерации кода см. Отчеты о генерации кода (Simulink Coder). Используйте ссылку Отчет по интерфейсам кода в Отчете о генерации кода, чтобы исследовать следующие сгенерированные методы:
initialize
: Вызывать один раз при инициализации.
step0
: Периодически вызывайте каждые 0,05 с, чтобы выполнить генерацию траектории и управление автомобилем.
step1
: Периодически вызывайте каждые 0.1с секунд, чтобы выполнить планирование пути.
terminate
: Вызов один раз при расторжении.
Дополнительные методы get и set для интерфейса сигнала объявлены в AutomatedParkingValetAlgorithm.h
и определено в AutomatedParkingValetAlgorithm.c
.
Симуляция цикле (SIL) обеспечивает раннее понимание поведения развернутого приложения. Для получения дополнительной информации о SIL симуляции см. SIL и PIL симуляции (Embedded Coder).
SIL симуляция позволяет вам: * Проверьте, что скомпилированный сгенерированный код на хосте функционально эквивалентен режиму normal mode. * Журнал времен выполнения сгенерированного кода на хост-компьютер. Это время может быть ранним показателем эффективности сгенерированного кода. Для точных измерений времени выполнения профилируйте сгенерированный код, когда он интегрирован во внешнее окружение или при использовании с симуляцией «цикл» (PIL). Дополнительные сведения о профилировании SIL см. в разделе Профилирование выполнения кода с SIL и PIL (Embedded Coder).
Сконфигурируйте параметры алгоритма и тестовой модели, чтобы поддержать SIL симуляцию и логгирование информации о выполнении.
helperSetModelParametersForSIL('AutomatedParkingValetAlgorithm'); helperSetModelParametersForSIL('AutomatedParkingValetTestBench');
Set AutomatedParkingValetAlgorithm 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' } Set AutomatedParkingValetTestBench 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 и постройте график результатов.
open_system('AutomatedParkingValetTestBench') set_param('AutomatedParkingValetTestBench/AutomatedParkingValetAlgorithm','SimulationMode','Software-in-the-loop (SIL)'); sim('AutomatedParkingValetTestBench');
### Starting build procedure for: AutomatedParkingValetAlgorithm ### Generated code for 'AutomatedParkingValetAlgorithm' is up to date because no structural, parameter or code replacement library changes were found. ### Successful completion of build procedure for: AutomatedParkingValetAlgorithm Build Summary 0 of 1 models built (1 models already up to date) Build duration: 0h 0m 4.126s ### Preparing to start SIL simulation ... Building with 'MinGW64 Compiler (C)'. MEX completed successfully. ### Updating code generation report with SIL files ... ### Starting SIL simulation for component: AutomatedParkingValetAlgorithm ### Stopping SIL simulation for component: AutomatedParkingValetAlgorithm
helperPlotSimulationSignals(logsout, executionProfile)
Время выполнения для step0
и step1
методы показаны на нижнем графике. Графики указывают, что максимальное время выполнения требуется с более низкой скоростью (step1
) после достижения целевого положения. Эта более низкая скорость ожидается, потому что она соответствует времени, когда планируется новый путь.
Этот пример продемонстрировал рабочий процесс для генерации и проверки кода С++ для планировщика пути и алгоритма управления транспортным средством. Компиляция и верификация кода с SIL симуляцией установленным доверием, что сгенерированный код функционально правильен перед интеграцией во внешнее программное окружение. Рабочий процесс был продемонстрирован как расширение автоматической парковки в примере Simulink и обычно применим к разработке и реализации приложений планирования пути.