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

В этом примере показано, как изменить модель 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'                                                                           }

Сгенерируйте код и отчет генерации кода из модели алгоритма.

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: Вызовите однажды после завершения.

Дополнительные методы для получения и установки интерфейса сигнала объявляются в 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: 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 и обычно применим к разработке и реализовыванию приложений планирования пути.

Похожие темы