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

В этом примере показано, как протестировать дорожную полосу после контроллера и сгенерировать код С++ для приложений реального времени на предварительно построенной 3D сцене из среды симуляции вождения Unreal Engine ®.

В этом примере вы:

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

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

Введение

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

Следующий контроллер маршрута объединяет продольные и боковые элементы управления. Продольный контроллер отвечает за поддержание заданной водителем скорости и соблюдение безопасного расстояния от ведущего транспортного средства. Боковой контроллер отвечает за поддержание транспортного средства в центре его текущей полосы. В этом примере вы используете информацию о основной истине полосе и транспортном средстве, чтобы протестировать полосу движения, следующую за контроллером. Для получения дополнительной информации смотрите Path Following Control System (Model Predictive Control Toolbox).

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

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

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

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

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

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

  6. Исследуйте дополнительные сценарии, приведенные в этом примере.

Вы тестируете следующий за контроллером канал на 3D среде симуляции, которая использует Unreal Engine из Epic Games ®. Для симуляции движущей среды Unreal Engine требуется 64-разрядная платформа Windows ®.

if ~ispc
    error(['Unreal driving simulation environment is only supported on Microsoft', char(174), ' Windows', char(174), '.']);
end

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

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

open_system('HighwayLaneFollowingControllerTestBench');

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

Тестовая модель содержит следующие подсистемы:

  1. Симуляция 3D Сценарий - Эта подсистема задает дорогу, транспортные средства, используемые для симуляции.

  2. Lane Following Decision Logic - Эта подсистема задает боковую и продольную логику принятия решений.

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

  4. Динамика аппарата - Эта подсистема задает динамическую модель для автомобиля , оборудованного датчиком.

  5. Оценка метриков - Эта подсистема задает метрики для оценки поведения уровня системы.

Подсистема Динамики аппарата является той же подсистемой, которая используется в примере Highway Lane Following. Этот пример фокусируется на образцах модели Lane Following Decision Logic и Lane Following Controller.

Подсистема Симуляции 3D Scenario конфигурирует дорожную сеть, устанавливает положения транспортных средств и упаковывает истинные данные, подобно подсистеме Симуляции 3D Scenario в Highway Lane Following. Однако подсистема Simulation 3D Scenario, используемая в этом примере, не имеет никаких датчиков. Вместо этих достоверных данных из блока Scenario Reader упаковываются в полосы и структуру транспортного средства шины, чтобы предоставить входы в полосу, следующую логике принятия решений. Откройте подсистему Simulation 3D Scenario.

open_system('HighwayLaneFollowingControllerTestBench/Simulation 3D Scenario');

  • Функциональный блок Pack Actors Truth MATLAB ® упаковывает информацию основной истины актёров в структуру шины трекера, которую требует образец модели Lane Following Decision Logic.

  • Блок Simulation 3D-видения Detection Generator присоединен к автомобилю , оборудованному датчиком, чтобы получить информацию о истинности маршрута из среды симуляции 3D.

  • Функция Pack Lanes Truth Блока MATLAB function упаковывает информацию о основной истине маршрута в структуру шины маршрута, которую требует образец модели Lane Following Decision Logic.

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

Логика следования за решением маршрута является образцом модели, которая обнаруживает информацию о ведущем транспортном средстве и центр маршрута. Модель Lane Following Controller нуждается в этой информации. Откройте модель Lane Following Decision Logic.

open_system('LaneFollowingDecisionLogic');

Функциональный блок Find Lead Car MATLAB находит ведущий автомобиль, который является наиболее важным объектом (MIO), присутствующим перед автомобилем , оборудованным датчиком в той же полосе. Это выводит относительное расстояние и относительную скорость между автомобиль , оборудованный датчиком и MIO.

Подсистема Estimate Lane Center вычисляет центр маршрута ego lane, который требуется для модели Lane Following Controller.

Контроллер следования маршрута принимает за вход информацию MIO и информацию о центре маршрута от маршрута после логического образца модели принятия решения вместе с установленными скоростью и продольной скоростью автомобиля , оборудованного датчиком. Затем модель генерирует команды управления (угол поворота и ускорение) для автомобиля , оборудованного датчиком. Откройте модель Lane Following Controller.

open_system('LaneFollowingController');

Блок «Предварительный просмотр кривизны» вычисляет кривизну, боковое отклонение и относительный угол рыскания с помощью информации о центре маршрута. Контроллер использует предварительно просматриваемую информацию для вычисления автомобиля , оборудованного датчиком угла поворота руля. Боковое отклонение измеряет расстояние между автомобиль , оборудованный датчиком и центром маршрута. Относительный угол рыскания измеряет угол рыскания, различия между автомобилем , оборудованным датчиком и дорогой. Блок ISO 8855 в J670E SAE внутри подсистемы преобразует координаты маршрута из стандарта ISO 8855 в стандарт SAE J670E используемый контроллером MPC.

Блок MPC Controller использует блок Path Following Control System (Model Predictive Control Toolbox) из Toolbox™ Model Predictive Control. Блок Path Following Controller сохраняет транспортное средство, перемещающееся по отмеченной полосе автомагистрали, сохраняя при этом заданную водителем скорость. Этот контроллер включает в себя комбинированное продольное и боковое управление автомобиля , оборудованного датчиком:

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

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

Контроллер MPC обеспечивает медленную и устойчивую реакцию на автомобиль , оборудованный датчиком. Во время аварийных условий требуется более быстрый ответ, и блок Watchdog Braking Controller применяет тормоза в таких условиях.

Основываясь на состоянии торможения блока Watchdog Braking Controller, подсистема Controller Mode Selector выводит команду ускорения, которая определяет, ускоряться или замедляться.

Моделируйте модель

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

helperSLHighwayLaneFollowingControllerSetup("scenarioFcnName", "scenario_LFACC_03_Curve_StopnGo");

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

sim('HighwayLaneFollowingControllerTestBench');
   Assuming no disturbance added to measured output channel #3.
-->Assuming output disturbance added to measured output channel #2 is integrated white noise.
   Assuming no disturbance added to measured output channel #1.
-->Assuming output disturbance added to measured output channel #4 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.

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

Теперь можно сгенерировать код С++ для алгоритма, применить общие оптимизации и сгенерировать отчет, чтобы облегчить исследование сгенерированного кода. Сконфигурируйте модели Lane Following Decision Logic и Lane Following Controller, чтобы сгенерировать код С++ для реализации алгоритма в реальном времени. Установите параметры модели, чтобы включить генерацию кода и отобразить строение значения.

Установите и просмотрите параметры модели, чтобы включить генерацию кода С++.

helperSetModelParametersForCodeGeneration('LaneFollowingController');
save_system('LaneFollowingController');
 
 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('LaneFollowingController');
### Starting build procedure for: LaneFollowingController
   Assuming no disturbance added to measured output channel #3.
-->Assuming output disturbance added to measured output channel #2 is integrated white noise.
   Assuming no disturbance added to measured output channel #1.
-->Assuming output disturbance added to measured output channel #4 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
### Generated code for 'LaneFollowingController' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of build procedure for: LaneFollowingController

Build Summary

0 of 1 models built (1 models already up to date)
Build duration: 0h 2m 10.889s

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

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

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

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

helperSetModelParametersForSIL('LaneFollowingController');
helperSetModelParametersForSIL('HighwayLaneFollowingControllerTestBench');
 
LaneFollowingController 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'         }

 
HighwayLaneFollowingControllerTestBench 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('HighwayLaneFollowingControllerTestBench/Lane Following Controller','SimulationMode','Software-in-the-loop (SIL)');

sim('HighwayLaneFollowingControllerTestBench');
### Starting serial model reference code generation build
### Starting build procedure for: LaneFollowingController
   Assuming no disturbance added to measured output channel #3.
-->Assuming output disturbance added to measured output channel #2 is integrated white noise.
   Assuming no disturbance added to measured output channel #1.
-->Assuming output disturbance added to measured output channel #4 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
### Successful completion of build procedure for: LaneFollowingController

Build Summary

Code generation targets built:

Model                    Action         Rebuild Reason                                         
===============================================================================================
LaneFollowingController  Code compiled  Model or library LaneFollowingController has changed.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 2m 29.276s
### Preparing to start SIL simulation ...
Building with 'Microsoft Visual C++ 2017 (C)'.
MEX completed successfully.
### Starting SIL simulation for component: LaneFollowingController
### Stopping SIL simulation for component: LaneFollowingController

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

runIDs = Simulink.sdi.getAllRunIDs;
normalSimRunID = runIDs(end - 1);
SilSimRunID = runIDs(end);
diffResult = Simulink.sdi.compareRuns(normalSimRunID ,SilSimRunID);

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

helperPlotLFControllerDiffSignals(diffResult);

Различия между режимами normal и SIL симуляции приблизительно равны нулю. Небольшие различия связаны с различиями в методах округления, используемых различными компиляторами.

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

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

Постройте график времени выполнения _step функции с помощью helperPlotExecutionProfile функция.

helperPlotLFControllerExecutionProfile(executionProfile);

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

Если у вас есть лицензия Simulink Coverage™, можно также выполнить анализ покрытия кода для сгенерированного кода, чтобы измерить полноту проверки. Можно использовать недостающее покрытие данные, чтобы найти погрешности в проверке, недостающие требования или непредусмотренную функциональность. Настройте параметры покрытия и моделируйте тестовую модель, чтобы сгенерировать отчет анализа покрытия. Найдите сгенерированный отчет CoverageResults/LaneFollowingController_modelrefsil_summary_cov.html в рабочей директории.

if(license('test','Simulink_Coverage'))
    helperCoverageSettings('HighwayLaneFollowingControllerTestBench');
    cvDataGroupObj = cvsim('HighwayLaneFollowingControllerTestBench');
    % Get Generated Code coverage of LaneFollowingController.
    cvDataObj = get(cvDataGroupObj,'LaneFollowingController');
    cvhtml('CoverageResults/LaneFollowingController_modelrefsil_summary_cov',cvDataObj);
end
### Starting serial model reference code generation build
### Starting build procedure for: LaneFollowingController
   Assuming no disturbance added to measured output channel #3.
-->Assuming output disturbance added to measured output channel #2 is integrated white noise.
   Assuming no disturbance added to measured output channel #1.
-->Assuming output disturbance added to measured output channel #4 is integrated white noise.
-->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
### Successful completion of build procedure for: LaneFollowingController

Build Summary

Code generation targets built:

Model                    Action         Rebuild Reason                               
=====================================================================================
LaneFollowingController  Code compiled  Code instrumentation settings have changed.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 59.128s
### Preparing to start SIL simulation ...
Building with 'Microsoft Visual C++ 2017 (C)'.
MEX completed successfully.
### Starting SIL simulation for component: LaneFollowingController
### Stopping SIL simulation for component: LaneFollowingController
### Completed code coverage analysis

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

Точно так же можно сконфигурировать Lane Following Decision Logic, чтобы сгенерировать код и запустить в SIL, чтобы проверить функциональную эквивалентность с симуляцией.

Исследуйте дополнительные сценарии

Этот пример предоставляет дополнительные сценарии, которые можно использовать с HighwayLaneFollowingControllerTestBench модель:

  • scenario_LF_01_Straight_RightLane

  • scenario_LF_02_Straight_LeftLane

  • scenario_LF_03_Curve_LeftLane

  • scenario_LF_04_Curve_RightLane

  • scenario_LFACC_01_Curve_DecelTarget

  • scenario_LFACC_02_Curve_AutoRetarget

  • scenario_LFACC_03_Curve_StopnGo [По умолчанию]

  • scenario_LFACC_04_Curve_CutInOut

  • scenario_LFACC_05_Curve_CutInOut_TooClose

  • scenario_LFACC_06_Straight_StopandGoLeadCar

  • scenario_ACC_01_ISO_TargetDiscriminationTest

  • scenario_ACC_02_StopnGo

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

helperSLHighwayLaneFollowingControllerSetup("scenarioFcnName", "scenario_LFACC_04_Curve_CutInOut");

См. также

| | |

Похожие темы