Этот пример показывает, как изменить модель Simulink® планирования пути и алгоритма управления автомобиля, сгенерировать Код С++ и проверить программное обеспечение использования сгенерированного кода в цикле (SIL) симуляция.
Разработка планирования пути и алгоритма управления автомобиля часто включает разработку и симуляцию модели алгоритма в Simulink, реализация алгоритма в Коде С++ и интеграции кода алгоритма во внешнюю программную среду для развертывания в автомобиль. Автоматически генерация и проверка кода из модели алгоритма гарантируют функциональную эквивалентность между симуляцией и реализацией.
Автоматизированный Камердинер Парковки в примере Simulink показал, как разработать алгоритм управления автомобиля и планирование пути. Этот пример показывает, как изменить проект для реализации на C++. Это продвигается в этот рабочий процесс:
Разделите проект в алгоритм и тестовые модели.
Измените модель алгоритма, чтобы поддержать генерацию кода.
Сгенерируйте Код С++ из модели алгоритма.
Проверьте поведение сгенерированного кода с помощью SIL симуляции.
Можно затем интегрировать сгенерированный код во внешний проект программного обеспечения для дальнейшего тестирования в автомобиле.
Исходная модель от Автоматизированного Камердинера Парковки в примере Simulink была уже разделена в отдельный алгоритм и тестовые модели.
Модель алгоритма: AutomatedParkingValetAlgorithm
задает планирование пути и функциональность управления автомобилем, которая будет реализована на C++.
Тестовая модель: AutomatedParkingValetTestBench
задает стимул и среду, чтобы протестировать модель алгоритма.
Модель AutomatedParkingValetTestBench
задает стимул и среду, чтобы протестировать модель AutomatedParkingValetAlgorithm
. Основные компоненты AutomatedParkingValetTestBench
включают:
Модель - ссылка алгоритма: на блок модели AutomatedParkingValetAlgorithm
ссылается блок Model. Блок Model и поддержки, моделирующие модель, на которую ссылаются, в различных режимах симуляции включая нормальный и режимах SIL. Чтобы узнать больше о блоке Model, обратитесь к Ссылочным Существующим Моделям (Simulink).
Costmap: блок Costmap Creator создает costmap среды и выводит его как сигнал шины.
Планировщик поведения: блок Behavior Planner инициировал последовательность задач навигации на основе глобального плана маршрута путем обеспечения промежуточной цели и настройки.
Модель автомобиля: Чтобы продемонстрировать производительность алгоритма, паркующийся диспетчер камердинера применяется к блоку Model Автомобиля, который содержит блок Vehicle Body 3DOF.
Модель AutomatedParkingValetTestBench
также сконфигурирована, чтобы регистрировать положение (CurrPose
) и продольная скорость (CurrVelocity
) автомобиля и состояние того, была ли цель от поведенческого планировщика достигнута (GoalReached
). Эти сигналы регистрируются к переменной logsout
рабочей области.
Моделируйте тестовую модель с алгоритмом в режиме normal mode.
open_system('AutomatedParkingValetTestBench') set_param('AutomatedParkingValetTestBench/AutomatedParkingValetAlgorithm','SimulationMode','Normal'); sim('AutomatedParkingValetTestBench') helperPlotSimulationSignals(logsout)
Первая фигура отображает путь что автомобиль, пересеченный от входа парковки до итогового парковочного места. Вторая фигура строит скорость и достигнутые целью сигналы. Заметьте, что скорость автомобиля сглаженна и непрерывна при переходе между целями.
Модель AutomatedParkingValetAlgorithm
задает функциональность, которая будет реализована на C++. Основные компоненты модели AutomatedParkingValetAlgorithm
:
Планировщик пути: Планирует выполнимый путь через карту среды с помощью объекта pathPlannerRRT
.
Генератор траектории: Сглаживает ссылочный путь путем подбора кривой сплайнам и преобразовывает сглаживавший путь в траекторию путем генерации профиля скорости.
Контроллер автомобиля: Управляет регулированием и скоростью автомобиля, чтобы следовать за сгенерированным путем и профилем скорости.
Откройте и обновите модель алгоритма.
open_system('AutomatedParkingValetAlgorithm') set_param('AutomatedParkingValetAlgorithm','SimulationCommand','Update');
Модель AutomatedValetParking
включает несколько модификаций от Автоматизированного Камердинера Парковки в примере Simulink, чтобы поддержать генерацию кода. Старшие значащие модификации задают интерфейсы компонента фиксированного размера и явные переходы уровня.
Интерфейсы компонента переменного размера были заменены интерфейсом фиксированного размера, чтобы позволить генерировать и проверить Код С++ с SIL симуляцией.
Переменный размер сигнал Poses
был разделен в выходной порт фиксированного размера (RefPosesArray
) с дополнительным выходным портом, задающим размер (RefPosesSize
).
Шина costmapBus
, сопоставленная с входным портом Costmap
, содержит только элементы фиксированного размера, поскольку costmap не изменяет размер в этом примере.
Модель AutomatedValetParking
содержит несколько уровней. Цвет блоков представляет различные шаги расчета. Генерация планирования пути и траектории выполняется в 0,1 шагах расчета с и окрашена в зеленый. Управление автомобилем выполняется в 0,05 шагах расчета с и окрашено в красный. Чтобы узнать больше об отображении цветов шага расчета, относитесь, чтобы Просмотреть информацию о Шаге расчета (Simulink).
Явные блоки перехода уровня были вставлены в модель, чтобы обработать каждый уровень как отдельную задачу.
Блок Rate Transition был вставлен в фиксированный размер сигнал CurrPose
.
Блок Varsize Rows Rate Transition помощника (названный RT) был вставлен в сигналы переменного размера что блоки подключения различных уровней.
При обработке каждого уровня, когда определенная задача позволяет генерировать класс C++ с точками входа отдельного метода для каждого уровня. Генерация отдельных методов для каждого уровня упрощает интегрирование в многозадачные планировщики программного обеспечения или операционные системы в автомобиле. Чтобы узнать больше об обработке уровней как отдельные задачи, обратитесь к Моделированию для Многозадачного Выполнения (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'
Сгенерируйте код и отчет генерации кода из модели алгоритма.
rtwbuild('AutomatedParkingValetAlgorithm');
### Starting build procedure for model: AutomatedParkingValetAlgorithm ### Successful completion of build procedure for model: AutomatedParkingValetAlgorithm
Используйте Отчет Генерации кода исследовать сгенерированный код. Чтобы узнать больше об Отчете Генерации кода, обратитесь к Отчетам для Генерации кода (Simulink Coder). Используйте ссылку Отчета Интерфейса Кода в Отчете Генерации кода исследовать эти сгенерированные методы:
initialize
: Вызовите однажды на инициализации.
step0
: Вызывайте периодически каждые 0,05 с, чтобы выполнить генерацию траектории и управление автомобилем.
шаг 1:
Вызывайте периодически каждые 0,1 секунды с, чтобы выполнить планирование пути.
terminate
: Вызовите однажды после завершения.
Дополнительный добираются, и методы установки для интерфейса сигнала объявлены в 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 model: 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 model: AutomatedParkingValetAlgorithm ### Preparing to start SIL simulation ... Building with 'Microsoft Visual C++ 2015 (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 и обычно применим к разработке и реализовыванию приложений планирования пути.