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

В этом примере показано, как изменить модель Simulink ® алгоритма планирования пути и управления транспортным средством, сгенерировать код С++ и проверить сгенерированный код с помощью симуляции ПО в цикле (SIL).

Введение

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

Пример Automated Parking Valet в Simulink показал, как спроектировать алгоритм планирования пути и управления автомобилем. В этом примере показано, как изменить проект для реализации в C++. Следующими шагами в этом рабочем процессе являются:

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

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

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

  4. Проверьте поведение сгенерированного кода с помощью SIL симуляции.

Затем можно интегрировать сгенерированный код во внешний программный проект для дальнейшей проверки в транспортном средстве.

Разбиение алгоритма и испытательный стенд

Исходная модель из примера Automated Parking Valet в Simulink уже разделена на отдельные алгоритмы и тестовые модели.

  • Модель алгоритма: AutomatedParkingValetAlgorithm определяет функциональность планирования пути и управления транспортным средством, которая должна быть реализована на C++.

  • Тестовая модель: AutomatedParkingValetTestBench задает стимул и окружение для тестирования модели алгоритма.

Симулируйте тестовую модель

The AutomatedParkingValetTestBench модель задает стимул и окружение для тестирования AutomatedParkingValetAlgorithm модель. Основные компоненты AutomatedParkingValetTestBench включают:

  • Алгоритм Модели-ссылки: AutomatedParkingValetAlgorithm на блок модели ссылается блок Model. Блок Model и поддержки, симулирующие ссылочную модель в различных режимах симуляции, включая режимы normal и SIL. Чтобы узнать больше о блоке Model, смотрите Ссылку на существующие модели (Simulink).

  • Costmap: Блок Costmap Creator создает косметику окружения и выводит ее как сигнал шины.

  • Блок Behavior Planner: The Behavior Planner запускает последовательность навигационных задач, основанную на глобальном плане маршрута, предоставляя промежуточную цель и строение.

  • Транспортное средство Model: Чтобы продемонстрировать эффективность алгоритма, контроллер парковочного клапана применяется к Транспортному средству Блока Model, которая содержит блок Транспортного средства Body 3DOF.

The AutomatedParkingValetTestBench модель также сконфигурирована, чтобы записать положение (CurrPose) и продольная скорость (CurrVelocity) транспортного средства и состояние, была ли достигнута цель от поведенческого планировщика (GoalReached). Эти сигналы регистрируются в переменной рабочей области logsout.

Симулируйте тестовую модель с алгоритмом в режиме normal mode.

open_system('AutomatedParkingValetTestBench')
set_param('AutomatedParkingValetTestBench/AutomatedParkingValetAlgorithm','SimulationMode','Normal');
sim('AutomatedParkingValetTestBench')
helperPlotSimulationSignals(logsout)

Первый рисунок отображает путь, который транспортное средство прошло от входа парковки до конечного парковочного пространства. Второй рисунок строит графики скорости и сигналов, достигнутых целью. Заметьте, что скорость транспортного средства плавна и непрерывна при переходе между целями.

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

The AutomatedParkingValetAlgorithm модель задает функциональность, которая будет реализована в C++. Основные компоненты AutomatedParkingValetAlgorithm модель являются:

  • Планировщик пути: Планирует допустимый путь через карту окружения с помощью pathPlannerRRT объект.

  • Генератор траектории: сглаживает опорный контур путем аппроксимации сплайнов и преобразует сглаженный контур в траекторию путем формирования профиля скорости.

  • Контроллер транспортного средства: Управляет рулевым управлением и скоростью транспортного средства, чтобы следовать сгенерированному пути и профилю скорости.

Откройте и обновите модель алгоритма.

open_system('AutomatedParkingValetAlgorithm')
set_param('AutomatedParkingValetAlgorithm','SimulationCommand','Update');

The AutomatedValetParking модель включает несколько модификаций из примера Automated Parking Valet в Simulink для поддержки генерации кода. Наиболее значимыми изменениями являются задание интерфейсов компонентов фиксированного размера и явные переходы скорости.

Интерфейсы компонентов переменного размера были заменены интерфейсом фиксированного размера, чтобы можно было генерировать и проверять Код С++ с SIL симуляцией.

  • Размер переменной Poses сигнал был разделен на выходной порт фиксированного размера (RefPosesArray) с дополнительным выходным портом, определяющим размер (RefPosesSize).

  • The costmapBus шина, сопоставленная с Costmap входной порт содержит только элементы фиксированного размера, поскольку в этом примере costmap не изменяет размер.

The AutomatedValetParking модель содержит несколько скоростей. Цвет блоков представляет различные шаги расчета. Планирование пути и генерация траектории выполняются во шаг расчета 0.1 с и окрашены в зеленый цвет. Управление транспортным средством осуществляется во шаг расчета 0,05 с и окрашено в красный цвет. Дополнительные сведения об отображении шага расчета цветов см. в разделе Просмотр Шаге расчета информации (Simulink).

Явные блоки перехода скорости были вставлены в модель, чтобы рассматривать каждую скорость как отдельную задачу.

  • Блок Rate Transition был вставлен в CurrPose фиксированного размера сигнал.

  • Блок helper Varsize Rows Rate Transition (с именем RT) был вставлен в сигналы переменного размера, которые соединяют блоки различной скорости.

Обработка каждой скорости как определенной задачи позволяет сгенерировать класс C++ с отдельными точками входа метода для каждой скорости. Генерация отдельных методов для каждой скорости упрощает интегрирование в многозадачные программные планировщики или операционные системы в транспортном средстве. Чтобы узнать больше о том, как рассматривать скорости как отдельные задачи, смотрите Modeling for Multitasking Execution (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: Вызов один раз при расторжении.

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

Похожие темы