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

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

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

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

Введение

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

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

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

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

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

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

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

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

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

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

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

  • Образец модели - образец модели планировщика смены маршрута магистрали реализует алгоритм планировщика смены маршрута магистрали и генерирует код С++ алгоритма.

Образец модели может быть интегрирована с системой Highway Lane Change. Откройте тестовую модель.

 open_system('HighwayLaneChangePlannerTestBench');

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

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

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

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

  • Оценка метрики - Подсистема, которая задает метрики для оценки поведения планировщика изменения маршрута магистрали.

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

  • Pack Actor - Подсистема, которая обновляет шину актёра, используя текущее состояние автомобиля , оборудованного датчиком от планировщика.

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

open_system('HighwayLaneChangePlannerTestBench/Scenario and Environment');

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

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

open_system("HighwayLaneChangePlannerTestBench/Planner Configuration Parameters");

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

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

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

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

  • preferredLane определяет предпочтительную полосу для автомобиля , оборудованного датчиком

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

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

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

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

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

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

  • maxAccel, maxCurvature, maxYawRate, и maxVelocity задайте кинематические ограничения допустимости.

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

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

open_system('HighwayLaneChangePlannerTestBench/Pack Actor');

Функциональный блок Get Actor Info MATLAB ® выводит информацию о актёре в формате, требуемом блоком назначения шины. Блок назначения шины выводит шину актёра с обновленной информацией. Функция Calculate Yaw Rate Блока MATLAB function вычисляет скорость рыскания для автомобиля , оборудованного датчиком.

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

Подсистема Metrics Assessment оценивает поведение планировщика изменения маршрута с помощью метрик, которые включают продольный и боковой рывок, столкновение и время столкновения. Для получения дополнительной информации смотрите Highway Lane Change.

Модель Планировщика Изменений Маршрута Шоссе

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

open_system('HighwayLaneChangePlanner');

Образец модели планировщика смены маршрута содержит следующие блоки:

  • Функциональный блок MATLAB Преобразователя состояний Френе преобразует информацию об эго и целевом актёре в систему координат Френе из мировой системы координат.

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

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

  • Подсистема Sampler конечного состояния производит выборку конечных состояний для круиз-контроля, следования за ведущим автомобилем и изменения маршрута. Это выводит конкатенированные конечные состояния для генератора траектории.

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

  • Образец модели Motion Planner использует предсказанные состояния MIO, параметров Planner и конечных состояний, генерируемых Конечным состоянием Sampler, чтобы выполнить планирование траектории для автомобиля , оборудованного датчиком.

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

open_system('HighwayLaneChangePlanner/Terminal State Sampler')

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

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

  • Cruise Control Sampler выборок конечных состояний для круиз-поведения на основе текущего состояния автомобиля , оборудованного датчиком. Этот блок вызывает cruiseControlSampler функция от HelperTerminalStateSampler.

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

  • Sampler Change Sampler производит измерения конечных состояний для поведения изменения маршрута для автомобиля , оборудованного датчиком. Этот блок вызывает laneChangeSampler функция от HelperTerminalStateSampler.

  • Concatenate States конкатенирует конечные состояния с блоками Cruise Control Sampler, Lead Car Following Sampler и Lane Change Sampler.

Вы можете спроектировать своё собственное Конечное состояние Sampler, чтобы выбрать конечные состояния для других видов поведения, таких как stop and go. Можно также включить или отключить семплеры в Sampler конечного состояния с помощью флагов, определенных в helperSLHighwayLaneChangePlannerSetup скрипт.

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

open_system('MotionPlanner')

Образец модели Motion Planner содержит следующие блоки:

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

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

  • Блок Генератора Траектории генерирует траектории для дискретизированных конечных состояний. Выбранные траектории находятся в мировых координатах.

  • Подсистема Validity Checker проверяет траектории, сгенерированные генератором траектории для допустимости и столкновения. Это выводит оптимальную траекторию, которую может следовать ego-автомобиль.

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

Подсистема Validity Checker проверяет кинематическую осуществимость и столкновение сгенерированных траекторий с предсказанными траекториями MIO. Откройте подсистему Validity Checker.

open_system('MotionPlanner/Validity Checker')

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

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

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

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

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

Сконфигурируйте модели 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 14m 11.538s

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

  • initialize - Вызывать один раз при инициализации.

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

  • terminate - Вызов один раз при расторжении.

Дополнительные методы get и set для интерфейса сигнала объявлены в 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 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);

Постройте график различий между параметрами контура маршрута, вычисленными из режима normal mode и режима SIL.

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 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

Вы можете найти Decision Coverage, покрытие оператора и результаты покрытия функции во время симуляции сгенерированного кода для этого сценария тестирования, scenario_LC_15_StopnGo_Curved. Можно протестировать эту модель с различными сценариями, чтобы получить полное покрытие сгенерированного кода. Для получения дополнительной информации о том, как анализировать результаты покрытия во время SIL симуляции, смотрите Покрытие кода для моделей в режиме Software-in-the-Loop (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 и экспортируются в файл сценария. Изучить комментарии в каждом файле для получения дополнительной информации о дороге и транспортных средствах в каждом сценарии. Можно сконфигурировать испытательный стенд и рабочую область Highway Lane Change Planner, чтобы симулировать эти сценарии с помощью helperSLHighwayLaneChangePlannerSetup функция. Например, можно сконфигурировать симуляцию для сценария кривой дороги.

helperSLHighwayLaneChangePlannerSetup("scenarioFcnName","scenario_LC_14_DoubleLaneChange_Ushape");

Заключение

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

См. также

|

Похожие темы