exponenta event banner

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

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

Введение

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

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

  1. Разбейте конструкцию на модели алгоритма и испытательного стенда.

  2. Измените модель алгоритма для поддержки генерации кода.

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

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

Связанные темы