Генерация кода для управления планированием пути и автомобилем

Этот пример показывает, как изменить модель Simulink® планирования пути и алгоритма управления автомобиля, сгенерировать Код С++ и проверить программное обеспечение использования сгенерированного кода в цикле (SIL) симуляция.

Введение

Разработка планирования пути и алгоритма управления автомобиля часто включает разработку и симуляцию модели алгоритма в Simulink, реализация алгоритма в Коде С++ и интеграции кода алгоритма во внешнюю программную среду для развертывания в автомобиль. Автоматически генерация и проверка кода из модели алгоритма гарантируют функциональную эквивалентность между симуляцией и реализацией.

Автоматизированный Камердинер Парковки в примере Simulink показал, как разработать алгоритм управления автомобиля и планирование пути. Этот пример показывает, как изменить проект для реализации на C++. Это продвигается в этот рабочий процесс:

  1. Разделите проект в алгоритм и тестовые модели.

  2. Измените модель алгоритма, чтобы поддержать генерацию кода.

  3. Сгенерируйте Код С++ из модели алгоритма.

  4. Проверьте поведение сгенерированного кода с помощью 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 симуляции, обратитесь к 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 и обычно применим к разработке и реализовыванию приложений планирования пути.

Похожие темы