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

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

В этом примере, вас:

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

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

Введение

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы исследовать тестовую модель, откройте рабочую копию файлов проекта в качестве примера. MATLAB копирует файлы в папку в качестве примера так, чтобы можно было отредактировать их.

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

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

open_system('HighwayLaneFollowingControllerTestBench');

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

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

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

  2. Маршрут После Логики Решения — Эта подсистема задает боковую и продольную логику решения.

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

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

  5. Метрическая Оценка — Эта подсистема задает метрики, чтобы оценить поведение уровня системы.

Подсистема Динамики аппарата является той же подсистемой, используемой в Магистральном примере Следующего Маршрута. Этот пример фокусируется на Маршруте После Логики Решения и Маршруте После образцов модели Контроллера.

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

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

  • Функциональный блок Pack Actors Truth MATLAB® упаковывает информацию об основной истине агентов в структуру шины средства отслеживания, которой требует Маршрут После образца модели Логики Решения.

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

  • Блок MATLAB function Истины Маршрутов Пакета упаковывает информацию об основной истине маршрута в структуру шины маршрутов, которой требует Маршрут После образца модели Логики Решения.

  • Блок Rear Axle to Vehicle Center переключает обнаружения маршрута от задней оси до центра транспортного средства как требуется боковым контроллером.

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

open_system('LaneFollowingDecisionLogic');

Ведущий Автомобильный блок MATLAB function Находки находит ведущий автомобиль, который является подарком самого важного объекта (MIO) перед автомобилем, оборудованным датчиком в том же маршруте. Это выводит относительное расстояние и относительную скорость между автомобилем, оборудованным датчиком и MIO.

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

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

open_system('LaneFollowingController');

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

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

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

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

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

На основе тормозящего состояния блока Watchdog Braking Controller подсистема диспетчера Моуда Селектора выводит ускоряющую команду, которая определяет, ускориться ли или замедлиться.

Модель симулируется

Сконфигурируйте 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.

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

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

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

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'                     }    {'off'        }    {'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.
### Successful completion of build procedure for: LaneFollowingController

Build Summary

Top model targets built:

Model                    Action                       Rebuild Reason                                    
========================================================================================================
LaneFollowingController  Code generated and compiled  Code generation information file does not exist.  

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

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

После генерации Кода С++ можно теперь оценить функциональность кода с помощью 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 generated and compiled  LaneFollowingController.cpp does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 1m 40.52s
### Preparing to start SIL simulation ...
Building with 'MinGW64 Compiler (C)'.
MEX completed successfully.
### Starting SIL simulation for component: LaneFollowingController
### Application stopped
### Stopping SIL simulation for component: LaneFollowingController

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

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

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

helperPlotLFControllerDiffSignals(diffResult);

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

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

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

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

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 2m 15.436s
### Preparing to start SIL simulation ...
Building with 'MinGW64 Compiler (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).

Точно так же можно сконфигурировать Маршрут После Логики Решения, чтобы сгенерировать код и запуститься в 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_Straight_TargetDiscriminationTest

  • scenario_ACC_02_Straight_StopnGo

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

helperSLHighwayLaneFollowingControllerSetup("scenarioFcnName", "scenario_LFACC_04_Curve_CutInOut");

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

| | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте