В этом примере показано, как изменить модель Simulink ® для алгоритма планирования пути и управления транспортным средством, сгенерировать код C++ и проверить сгенерированный код с помощью моделирования программного обеспечения в цикле (SIL).
Разработка алгоритма планирования пути и управления транспортным средством часто включает в себя разработку и моделирование модели алгоритма в Simulink, реализацию алгоритма в коде C++ и интеграцию кода алгоритма во внешнюю программную среду для развертывания в транспортном средстве. Автоматическое формирование и проверка кода из модели алгоритма обеспечивает функциональную эквивалентность между моделированием и реализацией.
Пример автоматической парковки в Simulink показал, как проектировать планирование пути и алгоритм управления транспортным средством. В этом примере показано, как изменить конструкцию для реализации в C++. В этом рабочем процессе выполняются следующие шаги:
Разбейте конструкцию на модели алгоритма и испытательного стенда.
Измените модель алгоритма для поддержки генерации кода.
Создайте код C++ из модели алгоритма.
Проверьте поведение созданного кода с помощью моделирования SIL.
Затем созданный код можно интегрировать во внешний проект программного обеспечения для дальнейшего тестирования в транспортном средстве.
Исходная модель из примера Automated Parking Valet in Simulink уже разделена на отдельные алгоритмы и модели испытательного стенда.
Модель алгоритма: AutomatedParkingValetAlgorithm определяет функции планирования пути и управления транспортным средством, которые должны быть реализованы в C++.
Модель испытательного стенда: AutomatedParkingValetTestBench задает стимул и среду для проверки модели алгоритма.
AutomatedParkingValetTestBench модель определяет стимул и среду для тестирования AutomatedParkingValetAlgorithm модель. Основные компоненты AutomatedParkingValetTestBench включают:
Ссылка на модель алгоритма: AutomatedParkingValetAlgorithm на блок модели ссылается блок модели. Блок модели и поддержка моделирования ссылочной модели в различных режимах моделирования, включая нормальный режим и режим SIL. Дополнительные сведения о блоке модели см. в разделе Ссылки на существующие модели (Simulink).
Costmap: Блок Costmap Creator создает карту затрат среды и выводит ее как сигнал шины.
Планировщик поведения: Блок планировщика поведения запускает последовательность задач навигации на основе глобального плана маршрута, предоставляя промежуточную цель и конфигурацию.
Модель транспортного средства: Для демонстрации эффективности алгоритма контроллер парковочной камеры применяется к блоку модели транспортного средства, который содержит блок 3DOF кузова транспортного средства.
AutomatedParkingValetTestBench модель также сконфигурирована для регистрации позы (CurrPose) и продольной скорости (CurrVelocity) транспортного средства и статус того, была ли достигнута цель от планировщика поведения (GoalReached). Эти сигналы регистрируются в переменной рабочей области logsout.
Смоделировать модель испытательного стенда с помощью алгоритма в обычном режиме.
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 модель включает несколько модификаций из примера Automated Parking Valet in Simulink для поддержки генерации кода. Наиболее значимыми изменениями являются определение интерфейсов компонентов фиксированного размера и явных переходов скорости.
Интерфейсы компонентов переменного размера были заменены интерфейсом фиксированного размера для создания и проверки кода C++ с помощью моделирования SIL.
Переменный размер Poses сигнал разделен на выход фиксированного размера (RefPosesArrayс дополнительным портом, определяющим размер (RefPosesSize).
costmapBus шины, связанной с Costmap входной порт содержит только элементы фиксированного размера, поскольку в данном примере схема затрат не изменяет размер.
AutomatedValetParking модель содержит несколько скоростей. Цвет блоков соответствует различным временам выборки. Планирование траектории и генерация траектории выполняются за время выборки 0,1 с и окрашиваются в зеленый цвет. Контроль за транспортным средством осуществляют при времени выборки 0,05 с и окрашивают в красный цвет. Дополнительные сведения об отображении цветов времени образца см. в разделе Просмотр информации о времени образца (Simulink).
Явные блоки перехода скорости были вставлены в модель для обработки каждой скорости как отдельной задачи.
Блок изменения скорости вставлен в фиксированный размер CurrPose сигнал.
Вспомогательный блок Varsize Rows Rate Transition (с именем RT) вставлен в сигналы переменного размера, которые соединяют блоки различных скоростей.
Обработка каждой скорости как конкретной задачи позволяет генерировать класс C++ с отдельными точками входа метода для каждой скорости. Создание отдельных методов для каждой скорости упрощает интеграцию в многозадачные программные планировщики или операционные системы в транспортном средстве. Дополнительные сведения о том, как рассматривать ставки как отдельные задачи, см. в разделе Моделирование многозадачности (встроенный кодер).
Конфигурирование AutomatedParkingValetAlgorithm модель для формирования кода включает в себя установку параметров на:
Создайте код C++ с точками входа для каждой скорости.
Применение общих оптимизаций.
Создание отчета для упрощения изучения созданного кода.
Задайте и просмотрите параметры модели, чтобы включить генерацию кода C++.
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). Используйте ссылку Отчет по кодовому интерфейсу (Code Interface Report) в Отчете по созданию кода (Code Generation Report) для изучения следующих методов:
initialize: Однократный вызов при инициализации.
step0Периодически звоните каждые 0,05 с для создания траектории и управления транспортным средством.
step1: Периодически звоните каждые 0,1 с для выполнения планирования пути.
terminate: Звонок один раз при прекращении.
Дополнительные методы получения и установки для сигнального интерфейса объявлены в AutomatedParkingValetAlgorithm.h и определено в AutomatedParkingValetAlgorithm.c.
Моделирование ПО в цикле (SIL) обеспечивает раннее понимание поведения развернутого приложения. Дополнительные сведения о моделировании SIL см. в разделе Моделирование SIL и PIL (встроенный кодер).
Моделирование SIL позволяет: * Проверить, что скомпилированный сгенерированный код на хосте функционально эквивалентен обычному режиму. * Регистрировать время выполнения сгенерированного кода на хост-компьютере. Это время может быть ранним показателем производительности сгенерированного кода. Для точного измерения времени выполнения выполните профилирование сгенерированного кода при его интеграции во внешнюю среду или при использовании моделирования процессора в цикле (PIL). Дополнительные сведения о профилировании SIL см. в разделе Профилирование выполнения кода с SIL и PIL (встроенный кодер).
Сконфигурируйте параметры алгоритма и тестовой модели для поддержки моделирования 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) после достижения поставленной цели. Ожидается более низкая скорость, поскольку она соответствует времени планирования нового пути.
В этом примере продемонстрирован рабочий процесс создания и проверки кода C++ для планировщика пути и алгоритма управления транспортным средством. Компиляция и проверка кода с помощью моделирования SIL установили уверенность в том, что сгенерированный код является функционально правильным перед интеграцией во внешнюю программную среду. Рабочий процесс был продемонстрирован как расширение автоматизированной парковочной камеры в примере Simulink и обычно применим для проектирования и реализации приложений планирования путей.