Сгенерируйте код для магистрального планировщика изменения маршрута

В этом примере показано, как спроектировать, протестируйте и сгенерируйте Код С++ для планировщика изменения маршрута для магистрального управления. Этот пример сопровождает Магистральное Планирование Траектории Используя пример Пути к Ссылке Frenet. В этом примере, вас:

  1. Спроектируйте тестовую модель, чтобы проверить, что функциональность магистрального маршрута изменяет планировщика, использующего информацию об основной истине.

  2. Сгенерируйте код для магистрального маршрута, изменяют планировщика, профилируют время выполнения и подтверждают функциональную эквивалентность с симуляцией.

Введение

Магистральная система изменения маршрута позволяет автомобилю, оборудованному датчиком автоматически переместиться от одной полосы до другого маршрута на магистрали. Магистральный маршрут изменяется, планировщик является основным компонентом магистральной системы изменения маршрута. Это, как ожидают, обработает различные ведущие поведения, чтобы безопасно переместиться по автомобилю, оборудованному датчиком от одной точки до другой точки. В этом примере магистральные демонстрационные траектории планировщика изменения маршрута для различных ведущих поведений, таких как круиз-контроль, ведущий автомобиль после (LCF) и маршрут изменяют маневры. Это затем оценивает стоимость, выполнимость и возможность столкновения с другими транспортными средствами и генерирует оптимальную траекторию без коллизий. Этот пример также показывает, как сгенерировать Код С++ и проверить программное обеспечение использования сгенерированного кода в цикле (SIL) выполнение. В этом примере, вас:

  1. Исследуйте тестовую модель — тестовая модель содержит сценарий и среду, параметры конфигурации планировщика, магистрального планировщика изменения маршрута и метрики, чтобы оценить функциональность.

  2. Планировщик изменения маршрута модели — образец модели содержит сэмплер конечного состояния, планировщика движения и модуль предсказания движения. Демонстрационные конечные состояния сэмплера конечного состояния на основе параметров планировщика и текущего состояния и автомобиля, оборудованного датчиком и других транспортных средств в сценарии. Модуль предсказания движения предсказывает будущее движение MIOs. Демонстрационные траектории планировщика движения и выходные параметры оптимальная траектория.

  3. Симулируйте с круиз-контролем, и ведущий автомобиль после — Симулируют систему путем включения только круиз-контроля и ведущего автомобиля после маневров.

  4. Симулируйте с изменением маршрута — Симулируют систему путем добавления маневра изменения маршрута.

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

  6. Оцените время выполнения и выполните анализ покрытия кода — Оценивают эффективность сгенерированного кода при помощи времени выполнения и покрытия.

  7. Исследуйте другие сценарии — Эти сценарии тестируют систему под дополнительными условиями. Можно применить шаблоны моделирования, используемые в этом примере, чтобы протестировать собственный компонент планировщика на магистральную систему изменения маршрута.

Исследуйте тестовую модель

Магистральный маршрут изменяется, система планировщика в этом примере содержит магистральный испытательный стенд планировщика изменения маршрута и образец модели.

  • Тестовая модель — тестовая модель симулирует и тестирует поведение магистрального алгоритма планировщика изменения маршрута в замкнутом цикле.

  • Образец модели — Магистральный образец модели Планировщика Изменения Маршрута реализует магистральный алгоритм планировщика изменения маршрута и генерирует Код С++ алгоритма.

Образец модели может быть интегрирован с Магистральной системой Изменения Маршрута. Чтобы исследовать тестовую модель, откройте рабочую копию файлов проекта в качестве примера. MATLAB копирует файлы в папку в качестве примера так, чтобы можно было отредактировать их.

addpath(fullfile(matlabroot, 'toolbox', 'driving', 'drivingdemos'));
helperDrivingProjectSetup('HLCPlanner.zip', 'workDir', pwd);

Откройте тестовую модель.

 open_system('HighwayLaneChangePlannerTestBench');

Открытие этой модели запускает helperSLHighwayLaneChangePlannerSetup скрипт, который инициализирует дорожный сценарий с помощью drivingScenario объект в базовом рабочем пространстве. Это также конфигурирует параметры планировщика, начальную информацию об автомобиле, оборудованном датчиком, информацию о маршруте, глобальные точки плана, требуемые планировщиком и сигналами шины Simulink, требуемыми для определения вводов и выводов для HighwayLaneChangePlannerTestBench модель. Тестовая модель содержит эти подсистемы:

  • Сценарий и Среда — Подсистема, которая задает сцену, транспортные средства и данные о карте, используемые для симуляции.

  • Параметры конфигурации планировщика — Подсистема, которая задает параметры конфигурации, требуемые для алгоритма планировщика.

  • Магистральный Планировщик Изменения Маршрута — Подсистема, которая реализует маршрут, изменяет алгоритм планировщика для магистрали.

  • Метрическая Оценка — Подсистема, которая задает метрики, чтобы оценить магистральный маршрут, изменяет поведение планировщика.

  • Визуализация — Подсистема, которая визуализирует состояние автомобиля, оборудованного датчиком и других транспортных средств, заданных в сценарии.

  • Упакуйте Агента — Подсистема, которая обновляет шину агента с помощью текущего состояния автомобиля, оборудованного датчиком от планировщика.

Подсистема Сценария и Среды использует блок Scenario Reader, чтобы обеспечить дорожную сеть и положения основной истины транспортного средства, и данные о карте, требуемые для магистрального маршрута, изменяют алгоритм планировщика. Эта подсистема выводит данные о карте, требуемые планировщиком изменения маршрута. Откройте подсистему Сценария и Среды.

open_system('HighwayLaneChangePlannerTestBench/Scenario and Environment');

Блок Scenario Reader сконфигурирован, чтобы считать drivingScenario объект от базового рабочего пространства. Это использует этот объект считать данные об агенте и информацию о контуре маршрута. Это берет в информации об автомобиле, оборудованном датчиком, чтобы выполнить симуляцию замкнутого цикла. Этот блок выходная информация о транспортном средстве основной истины от агентов в координатах автомобиля, оборудованного датчиком. Блок Vehicle To World используется, чтобы преобразовать целевые положения транспортного средства от координат транспортного средства до мировых координат. Эта подсистема считывает данные о карте из базового рабочего пространства и информации о выходных параметрах о маршрутах и ссылочном пути.

Подсистема Параметров конфигурации Планировщика читает переменные базового рабочего пространства с помощью постоянных блоков и создает структуру шины с помощью блока Bus Creator. Шина, созданная этой подсистемой, используется планировщиком изменения маршрута.

open_system("HighwayLaneChangePlannerTestBench/Planner Configuration Parameters");

Блок Planner Configuration Parameters читает следующие параметры из базового рабочего пространства:

  • timeResolution задает разрешение времени произведенных траекторий в секундах.

  • replanRate задает уровень переплана для планировщика в секундах.

  • timeHorizon задает вектор периодов времени для выборки траекторий в секундах.

  • preferredLane задает предпочтительный маршрут для автомобиля, оборудованного датчиком

  • setSpeed задает скорость набора драйверов, за которой автомобиль, оборудованный датчиком может следовать в m/s.

  • maxPlanningHorizon задает максимальный продольный горизонт планирования в метрах.

  • egoFrontExt и targetFrontExt задайте переднее расширение для эго и предназначайтесь для транспортных средств, соответственно, в метрах. Эти параметры используются, чтобы раздуть эго и целевые транспортные средства во время проверки столкновения.

  • frontSafetyGap и rearSafetyGap задайте разрыв безопасности между автомобилем, оборудованным датчиком и другими транспортными средствами.

  • egoTTC и nextTTC задайте границы времени к столкновению с другими транспортными средствами в сценарии.

  • latDevCost, timeCost, и speedCost задайте веса для вычисления стоимости произведенных конечных состояний.

  • maxAccel, maxCurvature, maxYawRate, и maxVelocity задайте кинематические границы выполнимости.

  • enableCCBehavior, enableLCFBehavior, и enableLCBehavior используются для включения выборки конечных состояний для поведения круиз-контроля, ведущего автомобиля после поведения (LCF) и поведения изменения маршрута, соответственно.

Подсистема Агента Пакета упаковывает информацию, сгенерированную планировщиком в шину агента. Шина агента используется, чтобы обновить информацию об агенте эго для блока читателя сценария, чтобы выполнить симуляцию замкнутого цикла.

open_system('HighwayLaneChangePlannerTestBench/Pack Actor');

Функциональный блок Get Actor Info MATLAB® выходная информация об агенте в формате требуется блоком присвоения шины. Присвоение шины блокирует выходные параметры шина агента с обновленной информацией. Вычислить блок MATLAB function Уровня Рыскания вычисляет уровень рыскания для автомобиля, оборудованного датчиком.

Блок Visualization создает фигуру MATLAB, которая показывает представление преследования и вид сверху сценария и строит автомобиль, оборудованный датчиком, произведенные траектории, список капсул и другие транспортные средства в сценарии.

Метрическая подсистема Оценки оценивает магистральное поведение планировщика изменения маршрута с помощью метрик, которые включают продольный и боковой толчок, столкновение, и время к столкновению. Для получения дополнительной информации смотрите Магистральное Изменение Маршрута.

Магистральный планировщик изменения маршрута модели

Магистральный образец модели Планировщика Изменения Маршрута реализует основной алгоритм для магистральной системы изменения маршрута. Образец модели считывает данные о карте, положения агента (в мировых координатах), и параметры планировщика от подсистемы Сценария и Среды, чтобы выполнить планирование траектории. Модель использует систему координат Fernet, чтобы найти самые важные объекты (MIOs) окружением автомобиля, оборудованного датчиком. Впоследствии, демонстрационные конечные состояния модели для различных поведений, предсказывает движение целевых агентов и генерирует несколько траекторий. Наконец, модель оценивает затраты на сгенерированные траектории и проверки на возможность столкновения и кинематической выполнимости, чтобы оценить оптимальную траекторию. Откройте Магистральный образец модели Планировщика Изменения Маршрута.

open_system('HighwayLaneChangePlanner');

Магистральный образец модели Планировщика Изменения Маршрута содержит следующие блоки:

  • Блок MATLAB function Конвертера состояния Frenet преобразует эго и целевую информацию об агенте в систему координат Frenet от системы мировой координаты.

  • Находка блок MATLAB function MIOs идентифицирует самые важные объекты (MIOs) использование положений транспортного средства основной истины относительно текущего состояния автомобиля, оборудованного датчиком. Транспортные средства, существующие в передней стороне или задней части автомобиля, оборудованного датчиком, рассматриваются MIOs. MIOs может также присутствовать в смежных маршрутах как показано в следующем рисунке.

Блок Find MIOs информация о выходных параметрах о MIOs, включая ведущее транспортное средство, в системе координат Frenet.

  • Демонстрационные конечные состояния подсистемы Сэмплера Конечного состояния для круиз-контроля, приведите автомобиль после, и поведения изменения маршрута. Это выводит конкатенированные конечные состояния для генератора траектории.

  • Предсказание Движения системный блок MATLAB предсказывает движение MIOs использование постоянной скоростной модели. Предсказанные состояния MIOs используются для проверки столкновения. Этот блок использует HelperMotionPrediction системный объект, который реализует постоянную основанную на скорости модель предсказания движения. Можно реализовать собственный модуль предсказания движения и протестировать тестовую модель.

  • Образец модели Планировщика Движения использует предсказанные состояния MIOs, параметров планировщика и конечных состояний, сгенерированных Сэмплером Конечного состояния, чтобы выполнить траекторию, планирующую автомобиль, оборудованный датчиком.

Подсистема Сэмплера Конечного состояния конфигурирует поведение планировщика путем вычисления конечных состояний с помощью автомобиля, оборудованного датчиком и информации о состоянии MIOs. Откройте подсистему Сэмплера Конечного состояния.

open_system('HighwayLaneChangePlanner/Terminal State Sampler')

Подсистема Сэмплера Конечного состояния содержит следующие блоки:

  • Обновитесь Информация о Среде обновляет текущий маршрут и предпочтительный маршрут для автомобиля, оборудованного датчиком на основе его текущего положения. Этот блок вызывает updateEnvironmentInfo функция реализована в HelperTerminalStateSampler функция, которая присоединена к этому примеру.

  • Демонстрационные конечные состояния Сэмплера Круиз-контроля для поведения круиза на основе текущего состояния автомобиля, оборудованного датчиком. Этот блок вызывает cruiseControlSampler функция от HelperTerminalStateSampler.

  • Ведущий Автомобиль После демонстрационных конечных состояний Сэмплера для того, чтобы адаптивно изменить скорость автомобиля, оборудованного датчиком относительно ведущего транспортного средства в текущем маршруте эго. Этот блок вызывает leadCarFollowingSampler функция от HelperTerminalStateSampler.

  • Демонстрационные конечные состояния Сэмплера Изменения маршрута для маршрута изменяют поведение для автомобиля, оборудованного датчиком. Этот блок вызывает laneChangeSampler функция от HelperTerminalStateSampler.

  • Конкатенация состояний конкатенирует конечные состояния от Сэмплера Круиз-контроля, Ведущего Автомобиля После Сэмплера и блоков Сэмплера Изменения Маршрута.

Можно спроектировать собственный Сэмплер Конечного состояния к демонстрационным конечным состояниям для других поведений, таких как остановка и пойти. Можно также включить или отключить сэмплеры в Сэмплере Конечного состояния при помощи флагов, заданных в helperSLHighwayLaneChangePlannerSetup скрипт.

Образец модели Планировщика Движения генерирует траектории на основе произведенных конечных состояний и параметров планировщика. Откройте образец модели Планировщика Движения.

open_system('MotionPlanner')

Образец модели Планировщика Движения содержит следующие блоки:

  • Блок Pulse Generator задает период переплана для блока Trajectory Generator. Значением по умолчанию составляет 1 секунду.

  • Блок Cost Evaluator вычисляет стоимость, сопоставленную со всеми произведенными конечными состояниями, и сортирует их в порядке возрастания.

  • Блок Trajectory Generator генерирует траектории для произведенных конечных состояний. Произведенные траектории находятся в мировых координатах.

  • Подсистема Средства проверки Валидности подтверждает траектории, сгенерированные Генератором Траектории для выполнимости и столкновения. Это выводит оптимальную траекторию, за которой может следовать автомобиль эго.

  • Блок State Estimator идентифицирует соответствующую точку на пути, чтобы следовать. Сгенерированный путь должен соответствовать дорожной форме.

Подсистема Средства проверки Валидности проверяет на кинематическую выполнимость и столкновение сгенерированных траекторий с предсказанными траекториями MIOs. Откройте подсистему Средства проверки Валидности.

open_system('MotionPlanner/Validity Checker')

Блок Kinematic Feasibility использует helperKinematicFeasibility функционируйте, чтобы проверять выполнимость уровня рыскания, искривления, ускорения и скоростных границ для сгенерированных траекторий. Можно добавить другие критерии выполнимости проверки траекторий.

Проверки блока Средства проверки Столкновения на столкновение с будущими траекториями MIOs. Это выводит оптимальную траекторию, за которой может следовать автомобиль, оборудованный датчиком. Можно применить этот шаблон моделирования и реализовать собственную логику, чтобы оценить стоимость и выполнимость, чтобы найти оптимальную траекторию.

Магистральный испытательный стенд Планировщика Изменения Маршрута демонстрационными траекториями по умолчанию для круиз-контроля, приведите автомобиль после, и поведения изменения маршрута. Можно включить или отключить эти поведения путем установки флагов в helperSLHighwayLaneChangePlannerSetup скрипт.

Симулируйте с круиз-контролем и ведущим автомобилем после поведений

Настройте Магистральный испытательный стенд Планировщика Изменения Маршрута с круиз-контролем и ведущим автомобилем после поведения и запустите модель, чтобы визуализировать поведение системы. Сконфигурируйте тестовую модель, чтобы использовать 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);

Сгенерируйте код С++

Можно теперь сгенерировать Код С++ для алгоритма, применить общую оптимизацию и сгенерировать отчет упростить исследование сгенерированного кода.

Сконфигурируйте модели Highway Lane Change Planner и Motion Planner, чтобы сгенерировать Код С++ для реализации в реальном времени алгоритма. Установите параметры модели, чтобы включить генерацию кода и отобразить значения настройки.

Теперь установите и просмотрите параметры модели, чтобы включить генерацию Кода С++. Закройте образцы модели, чтобы сохранить модель на корневом уровне прежде, чем сохранить модель.

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 8m 26s

Используйте отчет генерации кода исследовать сгенерированный код. Чтобы узнать больше об отчете генерации кода, см. Отчеты для Генерации кода (Embedded Coder). Используйте ссылку отчета интерфейса кода в генерации кода, сообщают, чтобы исследовать эти сгенерированные методы:

  • initialize — Вызовите однажды на инициализации.

  • step — Вызывайте периодически каждый шаг, чтобы выполнить алгоритм обнаружения маркера маршрута.

  • terminate — Вызовите однажды после завершения.

Дополнительные методы для получения и установки интерфейса сигнала объявляются в HighwayLaneChangePlanner.h и заданный в HighwayLaneChangePlanner.cpp.

Оцените функциональность кода

После генерации Кода С++ для магистрального маршрута изменяют планировщика, можно теперь оценить программное обеспечение использования функциональности кода в цикле (SIL) симуляция. Это обеспечивает раннее понимание поведения развертываемого приложения. Чтобы узнать больше о SIL симуляции, смотрите SIL симуляции и PIL симуляции (Embedded Coder).

SIL симуляция позволяет вам проверить, что скомпилированный сгенерированный код на хосте функционально эквивалентен режиму normal mode.

Сконфигурируйте алгоритм и параметры тестовой модели, чтобы поддержать 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 4m 48.198s
### Preparing to start SIL simulation ...
Building with 'Microsoft Visual C++ 2017 (C)'.
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 и режима normal mode.

hFigDiffResult = helperPlotLCPlannerDiffSignals(diffResult);

Закройте указатель фигуры.

close(hFigDiffResult);

Заметьте, что различиями между режимом normal mode симуляции и режимом SIL симуляции является приблизительно нуль.

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

Во время SIL симуляции регистрируйте метрики времени выполнения для сгенерированного кода на хосте - компьютере к переменной executionProfile в базовом рабочем пространстве MATLAB. Эти времена могут быть ранним индикатором эффективности сгенерированного кода. Для точных измерений времени выполнения профилируйте сгенерированный код, когда он интегрирован во внешнюю среду или когда вы используете процессор в цикле (PIL) симуляция. Чтобы узнать больше о профилировании PIL, обратитесь к Профилированию Выполнения кода с SIL и PIL (Embedded Coder).

Постройте время выполнения, потраченное для step функция HighwayLaneChangePlanner использование helperPlotLCPlannerExecutionProfile функция.

hFigLCExeProfile = helperPlotLCPlannerExecutionProfile(executionProfile);

Можно вывести среднее время, потраченное на систему координат для магистрального планировщика изменения маршрута из этого графика. Для получения дополнительной информации о генерации профилей выполнения и анализе их во время SIL симуляции, смотрите, что Время выполнения Профилирует для SIL и PIL (Embedded Coder).

Закройте фигуру.

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 6m 33.501s
### Preparing to start SIL simulation ...
Building with 'Microsoft Visual C++ 2017 (C)'.
MEX completed successfully.
### Starting SIL simulation for component: HighwayLaneChangePlanner
### Stopping SIL simulation for component: HighwayLaneChangePlanner
### Completed code coverage analysis

Можно найти Decision Coverage, покрытие оператора и функциональные результаты покрытия при симуляции сгенерированного кода для этого сценария тестирования, scenario_LC_15_StopnGo_Curved. Можно протестировать эту модель с различными сценариями, чтобы получить полный охват сгенерированного кода. Для получения дополнительной информации о том, как анализировать результаты покрытия во время SIL симуляции, смотрите Покрытие кода для Моделей в программном обеспечении в цикле (SIL) Режим и Процессор в цикле (PIL) Режим (Embedded Coder).

Исследуйте другие сценарии

Следующие дополнительные сценарии совместимы с Магистральной тестовой моделью Планировщика Изменения Маршрута.

  • 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 [Значение по умолчанию]

Эти сценарии создаются с помощью Driving Scenario Designer и экспортируются в файл сценария. Исследуйте комментарии в каждом файле для получения дополнительной информации на дороге и транспортных средствах в каждом сценарии. Можно сконфигурировать Магистральный испытательный стенд Планировщика Изменения Маршрута и рабочую область, чтобы симулировать эти сценарии с помощью helperSLHighwayLaneChangePlannerSetup функция. Например, можно конфигурировать моделирование для кривого дорожного сценария.

helperSLHighwayLaneChangePlannerSetup("scenarioFcnName","scenario_LC_14_DoubleLaneChange_Ushape");

Заключение

Этот пример показал, как спроектировать, протестировать и сгенерировать код для магистрального планировщика изменения маршрута. После успешного тестирования можно интегрировать этого планировщика в магистральной системе изменения маршрута.

Смотрите также

|

Похожие темы