В этом примере показано, как изменить модель 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 ### 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
Используйте Отчет Генерации кода исследовать сгенерированный код. Чтобы узнать больше об Отчете Генерации кода, обратитесь к Отчетам для Генерации кода (Simulink Coder). Используйте ссылку Отчета Интерфейса Кода в Отчете Генерации кода исследовать эти сгенерированные методы:
initialize
: Вызовите однажды на инициализации.
step0
: Вызывайте периодически каждые 0,05 с, чтобы выполнить генерацию траектории и управление транспортным средством.
step1
: Вызывайте периодически каждые 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 ... ### 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 и обычно применим к разработке и реализовыванию приложений планирования пути.