В этом примере показано, как проектировать, тестировать и генерировать код C++ для планировщика изменения полосы движения для движения по шоссе. Этот пример полностью соответствует примеру «Планирование траектории шоссе с использованием ссылочной траектории Frenet». В этом примере выполняется следующее:
Разработка модели испытательного стенда для проверки функциональных возможностей планировщика изменения полосы движения с использованием информации об истинности грунта.
Создание кода для плановика изменения полосы движения, профилирование времени выполнения и проверка функциональной эквивалентности с помощью моделирования.
Система изменения полосы движения позволяет эго-транспортному средству автоматически перемещаться с одной полосы движения на другую на шоссе. Планировщик изменения полосы движения является основным компонентом системы изменения полосы движения. Ожидается, что для безопасного перемещения эго-транспортного средства из одной точки в другую требуется различное поведение при вождении. В этом примере планировщик изменения полосы движения по шоссе выполняет выборку траекторий для различных режимов движения, таких как круиз-контроль, следование ведущего автомобиля (LCF) и маневры изменения полосы движения. Затем он оценивает стоимость, осуществимость и возможность столкновения с другими транспортными средствами и создает оптимальную траекторию без столкновения. В этом примере также показано, как сгенерировать код C++ и проверить сгенерированный код с помощью выполнения программного обеспечения в цикле (SIL). В этом примере выполняется следующее:
Изучить модель тестового стенда - модель тестового стенда содержит сценарий и среду, параметры конфигурации планировщика, планировщик изменения полосы движения и метрики для оценки функциональности.
Планировщик изменения полосы движения модели - ссылочная модель содержит выборщик состояния терминала, планировщик движения и модуль прогнозирования движения. Пробоотборник состояния терминала производит выборку состояний терминала на основе параметров планировщика и текущего состояния как эго-транспортного средства, так и других транспортных средств в сценарии. Модуль прогнозирования движения предсказывает будущее движение MIO. Планировщик движения выполняет выборку траекторий и выводит оптимальную траекторию.
Симуляция с круиз-контролем и сопровождением ведущего автомобиля - Симуляция системы путем включения только круиз-контроля и ведущего автомобиля после маневров.
Моделирование с изменением полосы движения - моделирование системы путем добавления маневра изменения полосы движения.
Генерировать код C++ - настройте ссылочную модель планировщика изменения полосы движения для выполнения в режиме SIL и проверьте функциональную эквивалентность с помощью моделирования.
Оценка времени выполнения и выполнение анализа покрытия кода - оценка производительности сгенерированного кода с использованием времени выполнения и покрытия.
Изучение других сценариев - эти сценарии тестируют систему в дополнительных условиях. Образцы моделирования, используемые в этом примере, можно применить для тестирования собственного компонента планировщика для системы изменения полосы движения по шоссе.
В этом примере система планирования изменения полосы движения содержит стенд тестирования планирования изменения полосы движения и ссылочную модель.
Модель испытательного стенда - модель испытательного стенда моделирует и проверяет поведение алгоритма планировщика изменения полосы движения в замкнутом контуре.
Эталонная модель - эталонная модель планировщика изменения полосы движения реализует алгоритм планировщика изменения полосы движения и генерирует код C++ алгоритма.
Эталонная модель может быть интегрирована с системой изменения полосы движения. Откройте модель испытательного стенда.
open_system('HighwayLaneChangePlannerTestBench');

При открытии этой модели запускается helperSLHighwayLaneChangePlannerSetup сценарий, который инициализирует сценарий дороги с помощью drivingScenario в базовой рабочей области. Он также конфигурирует параметры планировщика, начальную информацию об эго-транспортном средстве, информацию о полосе движения, точки глобального плана, требуемые планировщиком, и сигналы шины Simulink, необходимые для определения входов и выходов для HighwayLaneChangePlannerTestBench модель. Модель испытательного стенда содержит следующие подсистемы:
Сценарий и среда - подсистема, определяющая сцену, транспортные средства и данные карты, используемые для моделирования.
Параметры конфигурации плановика - подсистема, определяющая параметры конфигурации, необходимые для алгоритма плановика.
Планировщик изменения полосы движения - подсистема, реализующая алгоритм планировщика изменения полосы движения для магистрали.
Оценка метрик - подсистема, определяющая метрики для оценки поведения планировщика изменения полосы движения.
Визуализация - подсистема, визуализирующая состояние эго-транспортного средства и других транспортных средств, определенных в сценарии.
Pack Actor - подсистема, которая обновляет шину актера, используя текущее состояние эго-транспортного средства от планировщика.
Подсистема «Сценарий и среда» использует блок «Считыватель сценариев» для определения местоположения дорожной сети и грунта транспортного средства, а также данных карты, необходимых для алгоритма планировщика изменения полосы движения. Эта подсистема выводит данные карты, требуемые плановиком изменения полосы движения. Откройте подсистему «Сценарий и среда».
open_system('HighwayLaneChangePlannerTestBench/Scenario and Environment');

Блок чтения сценариев настроен на чтение drivingScenario из базовой рабочей области. Этот объект используется для считывания данных актера и информации о границах полосы движения. Для моделирования с замкнутым контуром требуется информация об эго-транспортном средстве. Этот блок выводит наземную информацию об истинном транспортном средстве от субъектов в координатах эго-транспортного средства. Блок «Транспортное средство - мир» используется для преобразования положения целевого транспортного средства из координат транспортного средства в координаты мира. Эта подсистема считывает данные карты из базового рабочего пространства и выводит информацию о полосах движения и опорном пути.
Подсистема «Параметры конфигурации планировщика» считывает базовые переменные рабочего пространства с помощью постоянных блоков и создает структуру шины с помощью блока Bus Creator. Шина, созданная этой подсистемой, используется планировщиком изменения полосы движения.
open_system("HighwayLaneChangePlannerTestBench/Planner Configuration Parameters");

Блок «Параметры конфигурации плановика» считывает из базового рабочего пространства следующие параметры:
timeResolution определяет разрешение по времени для выбранных траекторий в секундах.
replanRate определяет скорость повторного планирования для плановика в секундах.
timeHorizon определяет вектор временных горизонтов для выборки траекторий в секундах.
preferredLane определяет предпочтительную полосу движения для эго-транспортного средства
setSpeed определяет заданную водителем скорость, которой может следовать эго-транспортное средство в м/с.
maxPlanningHorizon определяет максимальный продольный горизонт планирования в метрах.
egoFrontExt и targetFrontExt определите переднее расширение для эго и целевого транспортного средства, соответственно, в метрах. Эти параметры используются для раздувания эго и целевых транспортных средств во время проверки на столкновение.
frontSafetyGap и rearSafetyGap определить безопасный зазор между эго-транспортным средством и другими транспортными средствами.
egoTTC и nextTTC определить границы времени до столкновения с другими транспортными средствами в сценарии.
latDevCost, timeCost, и speedCost определите веса для расчета стоимости выборочных состояний терминала.
maxAccel, maxCurvature, maxYawRate, и maxVelocity определить кинематические границы осуществимости.
enableCCBehavior, enableLCFBehavior, и enableLCBehavior используются для обеспечения возможности выборки терминальных состояний для поведения круиз-контроля, поведения следования ведущего автомобиля (LCF) и поведения изменения полосы движения, соответственно.
Подсистема Pack Actor упаковывает информацию, сгенерированную планировщиком, в шину актера. Шина актера используется для обновления информации ego actor для блока считывателя сценариев для выполнения моделирования с замкнутым контуром.
open_system('HighwayLaneChangePlannerTestBench/Pack Actor');

Функциональный блок Get Actor Info MATLAB ® выводит информацию об акторе в формате, требуемом блоком назначения шины. Блок назначения шины выводит активную шину с обновленной информацией. Функциональный блок Calculate Yaw Rate MATLAB вычисляет скорость yaw для эго-транспортного средства.
Блок визуализации создает рисунок MATLAB, который показывает вид погони и вид сверху сценария и отображает эго-транспортное средство, траектории выборки, список капсул и другие транспортные средства в сценарии.
Подсистема оценки метрик оценивает поведение планировщика изменения полосы движения с использованием метрик, которые включают в себя продольный и боковой толчок, столкновение и время до столкновения. Дополнительные сведения см. в разделе Изменение полосы движения.
Эталонная модель планировщика изменения полосы движения реализует основной алгоритм для системы изменения полосы движения. Ссылочная модель считывает данные карты, позиции актера (в мировых координатах) и параметры планировщика из подсистемы «Сценарий и среда» для выполнения планирования траектории. Модель использует систему координат Ферне для поиска наиболее важных объектов (MIO), окружающих эго-транспортное средство. Впоследствии модель производит выборку терминальных состояний для различных моделей поведения, предсказывает движение целевых субъектов и генерирует несколько траекторий. Наконец, модель оценивает затраты на сгенерированные траектории и проверяет возможность столкновения и кинематическую осуществимость для оценки оптимальной траектории. Откройте ссылочную модель планировщика изменения полосы движения.
open_system('HighwayLaneChangePlanner');

Ссылочная модель планировщика изменения полосы движения содержит следующие блоки:
Функциональный блок MATLAB преобразователя состояния Френета преобразует информацию эго и целевого актера в систему координат Френета из мировой системы координат.
Функциональный блок MATLAB Find MIOs идентифицирует наиболее важные объекты (MIOs), используя позы наземного транспортного средства истинности относительно текущего состояния эго-транспортного средства. Транспортные средства, находящиеся в передней или задней части эго-транспортного средства, считаются MIO. MIO также могут присутствовать в соседних полосах, как показано на следующем рисунке.

Блок поиска MIO выводит информацию о MIO, включая ведущее транспортное средство, в системе координат Френета.
Подсистема Terminal State Sampler выполняет выборку состояний терминала для круиз-контроля, следования за ведущим автомобилем и изменения полосы движения. Она выводит конкатенированные состояния клемм для генератора траектории.
Системный блок MATLAB прогнозирования движения предсказывает движение MIO с использованием модели постоянной скорости. Прогнозируемые состояния MIO используются для проверки столкновений. Этот блок использует HelperMotionPrediction системный объект, реализующий основанную на постоянной скорости модель прогнозирования движения. Можно реализовать собственный модуль прогнозирования движения и протестировать модель испытательного стенда.
Эталонная модель Motion Planner использует прогнозируемые состояния MIO, параметры планировщика и терминальные состояния, сгенерированные с помощью Terminal State Sampler, для выполнения планирования траектории для эго-транспортного средства.
Подсистема Terminal State Sampler настраивает поведение планировщика путем вычисления состояний терминала с использованием информации о состоянии ego-транспортного средства и MIO. Откройте подсистему Terminal State Sampler.
open_system('HighwayLaneChangePlanner/Terminal State Sampler')

Подсистема выборки состояния терминала содержит следующие блоки:
Функция «Обновить сведения об среде» обновляет текущую полосу движения и предпочтительную полосу движения для эго-транспортного средства на основе его текущей позы. Этот блок вызывает updateEnvironmentInfo функция, реализованная в HelperTerminalStateSampler , которая присоединена к этому примеру.
Cruise Control Sampler отбирает терминальные состояния для круиза на основе текущего состояния эго-автомобиля. Этот блок вызывает cruiseControlSampler функция из HelperTerminalStateSampler.
Следящие за ведущим автомобилем Образцы терминальных состояний для адаптивного изменения скорости эго-транспортного средства по отношению к ведущему транспортному средству в текущей эго-полосе. Этот блок вызывает leadCarFollowingSampler функция из HelperTerminalStateSampler.
Пробоотборник изменения полосы движения выполняет выборку терминальных состояний изменения полосы движения для транспортного средства ego. Этот блок вызывает laneChangeSampler функция из HelperTerminalStateSampler.
Состояния конкатенации объединяют терминальные состояния из блоков «Образец круиз-контроля», «Следящий за ведущим автомобилем» и «Образец изменения полосы движения».
Можно спроектировать собственный Sampler состояния терминала для выборки состояний терминала для других вариантов поведения, таких как остановка и переход. Можно также включить или отключить пробоотборники в Sampler Terminal State с помощью флагов, определенных в helperSLHighwayLaneChangePlannerSetup сценарий.
Ссылочная модель планировщика движения генерирует траектории на основе выбранных состояний клемм и параметров планировщика. Откройте ссылочную модель планировщика движения.
open_system('MotionPlanner')

Ссылочная модель планировщика движения содержит следующие блоки:
Блок генератора импульсов определяет период воспроизведения для блока генератора траектории. Значение по умолчанию - 1 секунда.
Блок оценщика затрат вычисляет затраты, связанные со всеми отобранными состояниями терминала, и сортирует их в порядке возрастания.
Блок генератора траекторий генерирует траектории для выбранных состояний клемм. Отобранные траектории находятся в мировых координатах.
Подсистема проверки достоверности проверяет пригодность и столкновение траекторий, созданных генератором траекторий. Он выводит оптимальную траекторию, которой может следовать эго-автомобиль.
Блок оценки состояния идентифицирует соответствующую точку на пути, по которому следует следовать. Созданный контур должен соответствовать форме дороги.
Подсистема проверки достоверности проверяет кинематическую осуществимость и столкновение генерируемых траекторий с прогнозируемыми траекториями МИО. Откройте подсистему проверки достоверности.
open_system('MotionPlanner/Validity Checker')

Блок кинематической осуществимости использует helperKinematicFeasibility функция для проверки выполнимости ограничений скорости рыскания, кривизны, ускорения и скорости для генерируемых траекторий. Можно добавить другие критерии выполнимости для проверки траекторий.
Блок проверки коллизий проверяет наличие коллизий с будущими траекториями MIO. Он выводит оптимальную траекторию, по которой может следовать эго-транспортное средство. Можно применить этот шаблон моделирования и реализовать собственную логику для оценки стоимости и осуществимости для поиска оптимальной траектории.
Испытательный стенд Highway Lane Change Planner по умолчанию отбирает траектории для круиз-контроля, следования ведущего автомобиля и изменения полосы движения. Можно включить или отключить это поведение, установив флаги в helperSLHighwayLaneChangePlannerSetup сценарий.
Настройте тестовый стенд Highway Lane Change Planner с круиз-контролем и ведущим автомобилем, следящим за поведением, и запустите модель, чтобы визуализировать поведение системы. Сконфигурируйте модель испытательного стенда для использования scenario_LC_15_StopnGo_Curved сценарий. Этот сценарий содержит медленно движущееся ведущее транспортное средство перед эго-транспортным средством. Поведение ведущего автомобиля позволяет эго-транспортному средству регулировать скорость, чтобы избежать столкновения с медленно движущимся ведущим транспортным средством. Когда вы включаете только круиз-контроль, эго-транспортное средство движется с заданной скоростью и избежать столкновения с ведущим транспортным средством невозможно.
helperSLHighwayLaneChangePlannerSetup("scenarioFcnName","scenario_LC_15_StopnGo_Curved");
По умолчанию helperSLHighwayLaneChangeSetup сценарий настраивает модель путем включения круиз-контроля, слежения за ведущим автомобилем и изменения полосы движения. Отключите поведение изменения полосы движения и смоделируйте модель для наблюдения за поведением системы.
enableLCBehavior = 0;
sim('HighwayLaneChangePlannerTestBench');

Закройте фигуру.
hLCPlot = findobj( 'Type', 'Figure', 'Name', 'Lane Change Status Plot'); if ~isempty(hLCPlot) close(hLCPlot); end
Постройте график скорости и ориентации эго для анализа поведения эго-транспортного средства во время моделирования.
hPlotSimResults = helperPlotEgoLateralandLongitudinalResults(logsout);

Обратите внимание, что эго-транспортное средство ведет переговоры с ведущим транспортным средством, снижая его скорость, чтобы избежать столкновения. Изменение ориентации эго-транспортного средства связано с тем, что транспортное средство движется по криволинейной дороге.
Закройте фигуру.
close(hPlotSimResults);
Теперь смоделируйте модель, включив режим изменения полосы движения.
Теперь включите режим изменения полосы движения и смоделируйте модель для наблюдения за поведением системы. Включение режима изменения полосы движения позволяет эго-транспортному средству выполнять изменение полосы движения для поддержания желаемой скорости и во избежание столкновения с медленно движущимся ведущим транспортным средством в сценарии.
enableLCBehavior = 1;
sim('HighwayLaneChangePlannerTestBench');

Закройте фигуру.
hLCPlot = findobj( 'Type', 'Figure', 'Name', 'Lane Change Status Plot'); if ~isempty(hLCPlot) close(hLCPlot); end
Постройте график скорости и ориентации эго для анализа поведения эго-транспортного средства во время моделирования.
hPlotSimResults = helperPlotEgoLateralandLongitudinalResults(logsout);

Обратите внимание, что эго-транспортное средство поддерживает почти постоянную скорость и тем не менее избегает столкновения с медленно движущимся ведущим автомобилем из-за маневра смены полосы движения. График эго-ориентации четко отражает изменение эго-ориентации во время изменения полосы движения.
Закройте фигуру.
close(hPlotSimResults);
Теперь можно создать код C++ для алгоритма, применить общие оптимизации и создать отчет, чтобы облегчить изучение созданного кода.
Настройте модели планировщика изменения полосы движения и планировщика движения для генерации кода C++ для реализации алгоритма в реальном времени. Задайте параметры модели, чтобы включить генерацию кода и отобразить значения конфигурации.
Теперь задайте и просмотрите параметры модели, чтобы включить генерацию кода C++. Закройте ссылочные модели, чтобы сохранить модель на корневом уровне перед сохранением модели.
close_system('MotionPlanner'); helperSetModelParametersForCodeGeneration('MotionPlanner'); save_system('MotionPlanner'); close_system('HighwayLaneChangePlanner'); helperSetModelParametersForCodeGeneration('HighwayLaneChangePlanner'); save_system('HighwayLaneChangePlanner');
Model 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' }
{'SupportVariableSizeSignals' } {'on' } {'Code Generation>Interface>Support variable-size signals' }
{'CodeInterfacePackaging' } {'C++ class' } {'Code Generation>Interface>Code interface packaging' }
{'GenerateExternalIOAccessMethods'} {'Method' } {'Code Generation>Interface>Data Member Visibility>External I/O access' }
{'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' }
Model 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' }
{'SupportVariableSizeSignals' } {'on' } {'Code Generation>Interface>Support variable-size signals' }
{'CodeInterfacePackaging' } {'C++ class' } {'Code Generation>Interface>Code interface packaging' }
{'GenerateExternalIOAccessMethods'} {'Method' } {'Code Generation>Interface>Data Member Visibility>External I/O access' }
{'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('HighwayLaneChangePlanner');
### Starting serial model reference code generation build ### Starting build procedure for: MotionPlanner ### Successful completion of build procedure for: MotionPlanner ### Starting build procedure for: HighwayLaneChangePlanner ### Successful completion of build procedure for: HighwayLaneChangePlanner Build Summary Code generation targets built: Model Action Rebuild Reason =============================================================================== MotionPlanner Code generated and compiled MotionPlanner.cpp does not exist. Top model targets built: Model Action Rebuild Reason ========================================================================================================= HighwayLaneChangePlanner Code generated and compiled Code generation information file does not exist. 2 of 2 models built (0 models already up to date) Build duration: 0h 14m 11.538s
Используйте отчет о создании кода для просмотра созданного кода. Дополнительные сведения о отчете по созданию кода см. в разделе Отчеты по созданию кода (встроенный кодер). Используйте ссылку на отчет по кодовому интерфейсу в отчете по созданию кода для изучения следующих методов:
initialize - Однократный вызов при инициализации.
step - Периодически вызывать каждый шаг для выполнения алгоритма обнаружения маркера полосы движения.
terminate - Однократный вызов при прекращении.
Дополнительные методы получения и установки для сигнального интерфейса объявлены в HighwayLaneChangePlanner.h и определено в HighwayLaneChangePlanner.cpp.
После создания кода C++ для плановика изменения полосы движения можно оценить функциональные возможности кода с помощью моделирования программного обеспечения в цикле (SIL). Он обеспечивает раннее понимание поведения развернутого приложения. Дополнительные сведения о моделировании SIL см. в разделе Моделирование SIL и PIL (встроенный кодер).
Моделирование SIL позволяет проверить, что скомпилированный сгенерированный код на хосте функционально эквивалентен обычному режиму.
Сконфигурируйте алгоритм и параметры модели стенда для поддержки моделирования SIL и профилирования выполнения журнала.
helperSetModelParametersForSIL('HighwayLaneChangePlanner'); helperSetModelParametersForSIL('HighwayLaneChangePlannerTestBench');
HighwayLaneChangePlanner 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' }
HighwayLaneChangePlannerTestBench 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.
set_param('HighwayLaneChangePlannerTestBench/Highway Lane Change Planner','SimulationMode','Software-in-the-loop (SIL)'); sim('HighwayLaneChangePlannerTestBench');
### Starting serial model reference code generation build ### Starting build procedure for: MotionPlanner ### Successful completion of build procedure for: MotionPlanner ### Starting build procedure for: HighwayLaneChangePlanner ### Successful completion of build procedure for: HighwayLaneChangePlanner Build Summary Code generation targets built: Model Action Rebuild Reason ===================================================================================================== MotionPlanner Code compiled Code instrumentation settings have changed. HighwayLaneChangePlanner Code generated and compiled HighwayLaneChangePlanner.cpp does not exist. 2 of 2 models built (0 models already up to date) Build duration: 0h 5m 56.445s ### Preparing to start SIL simulation ... Building with 'gcc'. MEX completed successfully. ### Starting SIL simulation for component: HighwayLaneChangePlanner ### Stopping SIL simulation for component: HighwayLaneChangePlanner

Закройте фигуру.
hLCPlot = findobj( 'Type', 'Figure', 'Name', 'Lane Change Status Plot'); if ~isempty(hLCPlot) close(hLCPlot); end
Можно сравнить выходные данные из обычного режима моделирования и режима моделирования SIL. Можно проверить, находятся ли различия между этими прогонами в пределах допуска, с помощью следующего кода. Постройте график различий обнаруженных параметров границ полосы движения между обычным режимом моделирования и режимом моделирования SIL.
runIDs = Simulink.sdi.getAllRunIDs; normalSimRunID = runIDs(end - 1); SilSimRunID = runIDs(end); diffResult = Simulink.sdi.compareRuns(normalSimRunID ,SilSimRunID);
Постройте график различий между параметрами границ полосы движения, вычисленными из нормального режима и режима SIL.
hFigDiffResult = helperPlotLCPlannerDiffSignals(diffResult);

Закройте ручку фигуры.
close(hFigDiffResult);
Обратите внимание, что различия между нормальным режимом моделирования и режимом SIL моделирования приблизительно равны нулю.
Во время моделирования SIL записывайте метрики времени выполнения для сгенерированного кода на хост-компьютере в переменную executionProfile в базовой рабочей области MATLAB. Это время может быть ранним показателем производительности сгенерированного кода. Для точного измерения времени выполнения выполните профилирование сгенерированного кода при его интеграции во внешнюю среду или при использовании моделирования процессора в цикле (PIL). Дополнительные сведения о профилировании PIL см. в разделе Профилирование выполнения кода с использованием SIL и PIL (встроенный кодер).
Постройте график времени выполнения для step функция HighwayLaneChangePlanner с использованием helperPlotLCPlannerExecutionProfile функция.
hFigLCExeProfile = helperPlotLCPlannerExecutionProfile(executionProfile);

На этом графике можно вывести среднее время для каждого кадра для планировщика изменения полосы движения. Дополнительные сведения о создании профилей выполнения и их анализе во время моделирования SIL см. в разделе Профилирование времени выполнения для SIL и PIL (встроенный кодер).
Закройте фигуру.
close(hFigLCExeProfile);
При наличии лицензии Simulink Coverage™ можно также выполнить анализ покрытия кода для созданного кода для измерения полноты тестирования. Отсутствующие данные покрытия можно использовать для поиска пробелов в тестировании, отсутствующих требованиях или непреднамеренных функциональных возможностях. Настройте параметры покрытия и смоделируйте модель тестового стенда для создания отчета по анализу покрытия. Поиск созданного отчета CoverageResults/HighwayLaneChangePlanner_modelrefsil_summary_cov.html в рабочей папке.
if(license('test','Simulink_Coverage')) helperCoverageSettings('HighwayLaneChangePlannerTestBench'); cvDataGroupObj = cvsim('HighwayLaneChangePlannerTestBench'); % Get Generated Code coverage of HighwayLaneChangePlanner. cvDataObj = get(cvDataGroupObj,'HighwayLaneChangePlanner'); cvhtml('CoverageResults/HighwayLaneChangePlanner_modelrefsil_summary_cov',cvDataObj); end hLCPlot = findobj( 'Type', 'Figure', 'Name', 'Lane Change Status Plot'); if ~isempty(hLCPlot) close(hLCPlot); end
### Starting serial model reference code generation build ### Starting build procedure for: MotionPlanner ### Successful completion of build procedure for: MotionPlanner ### Starting build procedure for: HighwayLaneChangePlanner ### Successful completion of build procedure for: HighwayLaneChangePlanner Build Summary Code generation targets built: Model Action Rebuild Reason ====================================================================================== MotionPlanner Code compiled Code instrumentation settings have changed. HighwayLaneChangePlanner Code compiled Code instrumentation settings have changed. 2 of 2 models built (0 models already up to date) Build duration: 0h 1m 6.6304s ### Preparing to start SIL simulation ... Building with 'gcc'. MEX completed successfully. ### Starting SIL simulation for component: HighwayLaneChangePlanner ### Stopping SIL simulation for component: HighwayLaneChangePlanner ### Completed code coverage analysis
При моделировании созданного кода для этого сценария тестирования можно найти результаты покрытия решений, покрытия инструкций и покрытия функций. scenario_LC_15_StopnGo_Curved. Можно протестировать эту модель с помощью различных сценариев для получения полного покрытия сгенерированного кода. Дополнительные сведения о том, как анализировать результаты покрытия во время моделирования SIL, см. в разделе Покрытие кода для моделей в режиме программного обеспечения в цикле (SIL) и режиме процессора в цикле (PIL) (встроенный кодер).
Следующие дополнительные сценарии совместимы с моделью испытательного стенда планировщика изменения полосы движения.
scenario_LC_01_SlowMoving
scenario_LC_02_SlowMovingWithPassingCar
scenario_LC_03_DisabledCar
scenario_LC_04_CutInWithBrake
scenario_LC_05_SingleLaneChange
scenario_LC_06_DoubleLaneChange
scenario_LC_07_RightLaneChange
scenario_LC_08_SlowmovingCar_Curved
scenario_LC_09_CutInWithBrake_Curved
scenario_LC_10_SingleLaneChange_Curved
scenario_LC_11_MergingCar_HighwayEntry
scenario_LC_12_CutInCar_HighwayEntry
scenario_LC_13_DisabledCar_Ushape
scenario_LC_14_DoubleLaneChange_Ushape
scenario_LC_15_StopnGo_Curved [По умолчанию]
Эти сценарии создаются с помощью конструктора сценариев управления и экспортируются в файл сценариев. Изучите комментарии в каждом файле для получения более подробной информации о дороге и транспортных средствах в каждом сценарии. Можно настроить тестовый стенд и рабочее пространство планировщика изменения полосы движения для моделирования этих сценариев с помощью helperSLHighwayLaneChangePlannerSetup функция. Например, можно настроить моделирование для сценария криволинейной дороги.
helperSLHighwayLaneChangePlannerSetup("scenarioFcnName","scenario_LC_14_DoubleLaneChange_Ushape");
В этом примере показано, как проектировать, тестировать и генерировать код для планировщика изменения полосы движения. После успешного тестирования этот плановик можно интегрировать в систему изменения полосы движения.
Считыватель сценариев | Транспортное средство в мир