Сгенерируйте интерфейсы сообщения C++ для маршрута после средств управления и cочетания датчиков

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

Введение

Следующее поколение автономные транспортные средства (AVS) запускает очень комплексные алгоритмы, чтобы выполнить восприятие, планирование и управление. Архитектура для обслуживания широкого круга запросов (SOA) становится распространенными средними значениями контакта с этой увеличивающейся сложностью. SOA способствует распределенному подходу к реализации восприятия, планированию и алгоритмам управления с помощью локальных вычислительных модулей. Эти модули могут обмениваться информацией друг с другом использующим основанные на сообщении коммуникационные услуги, такие как Операционная система робота (ROS), Службы распределения данных (DDS) и Адаптивная Платформа AUTOSAR.

Этот пример фокусируется на моделировании основанной на сообщении связи между cочетанием датчиков и компонентами средств управления магистрального приложения следования маршрута. Пример использует Отправить (Simulink), и Получите (Simulink) блоки из библиотеки Simulink Messages и Events, чтобы смоделировать интерфейс передачи сообщений между компонентами этой системы. Этот пример также использует HLFControlsWithSensorFusionTestBench модель от Автоматизировать Тестирования на Хайвея Лейна После Средств управления и примера Cочетания датчиков. В этом примере, вас:

  1. Идентифицируйте компоненты алгоритма для развертывания — Анализ тестовая модель с сигналами и идентифицируйте компоненты алгоритма в тестовой модели.

  2. Добавьте интерфейсы сообщения Simulink в компоненты алгоритма — Анализ тестовая модель с сообщениями Simulink. Симулируйте модель и исследуйте результаты.

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

  4. Исследуйте сгенерированный код — Исследуют сгенерированный код и наблюдают интерфейсы сообщения.

В этом примере вы включаете симуляцию уровня системы посредством интеграции с Нереальным Engine® от Epic Games®. 3D среда симуляции требует Windows® 64-битная платформа.

if ~ispc
    error(['3D simulation is supported only on Microsoft',char(174),' Windows',char(174),'.'])
end

Идентифицируйте компоненты алгоритма для развертывания

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

addpath(fullfile(matlabroot,"toolbox","driving","drivingdemos"))
helperDrivingProjectSetup("HLFControlsSensorFusion.zip",workDir=pwd)

Откройте тестовую модель и подсветите компоненты модели для развертывания.

open_system("HLFControlsWithSensorFusionTestBench")
hilite_system("HLFControlsWithSensorFusionTestBench/Forward Vehicle Sensor Fusion")
hilite_system("HLFControlsWithSensorFusionTestBench/Lane Following Decision Logic")
hilite_system("HLFControlsWithSensorFusionTestBench/Lane Following Controller")

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

  • Simulation 3D Scenario — Задает дорогу, транспортные средства, генератор обнаружения видения и радарные датчики, используемые для симуляции.

  • Forward Vehicle Sensor Fusion — Плавит видение и радарные обнаружения датчика транспортных средств перед автомобилем, оборудованным датчиком.

  • Lane Following Decision Logic — Модель Algorithm, которая задает боковую и продольную логику решения и предоставляет информацию о центре маршрута и сопутствующую информацию самого важного объекта (MIO) контроллеру.

  • Lane Following Controller — Модель Algorithm, которая задает контроллер.

  • Vehicle Dynamics — Задает динамическую модель для автомобиля, оборудованного датчиком.

  • Metrics Assessment — Оценивает поведение уровня системы.

Этот пример конфигурирует Forward Vehicle Sensor Fusion, Lane Following Decision Logic, и Lane Following Controller компоненты с помощью сообщений Simulink.

Добавьте интерфейсы сообщения Simulink в компоненты алгоритма

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

open_system("SOAHLFControlsWithSensorFusionTestBench")

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

Откройте Forward Vehicle Sensor Fusion компонент.

open_system("SOAForwardVehicleSensorFusion")

Откройте Lane Following Decision Logic компонент.

open_system("SOALaneFollowingDecisionLogic")

Откройте Lane Following Controller компонент.

open_system("SOALaneFollowingController")

Заметьте, что сообщение Simulink Отправляет и Получает блоки, соединенные с Lane Following Controller ссылочный компонент. Симулируйте модель и исследуйте результаты.

sim("SOAHLFControlsWithSensorFusionTestBench");
   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.

Постройте показатели производительности для бокового контроллера.

hFigLatResults = helperPlotLFLateralResults(logsout);

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

close(hFigLatResults)

Постройте показатели производительности для продольного контроллера. Для получения дополнительной информации о боковых и продольных метриках контроллера, смотрите, что Хайвей Лейн Следует.

hFigLongResults = helperPlotLFLongitudinalResults(logsout,time_gap, ...
    default_spacing);

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

close(hFigLongResults)

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

Сгенерируйте Код С++ для Forward Vehicle Sensor Fusion, Lane Following Decision Logic, и Lane Following Controller компоненты алгоритма.

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

helperSetModelParametersForCodeGeneration(["SOAForwardVehicleSensorFusion", ...
                                           "SOALaneFollowingDecisionLogic", ...
                                           "SOALaneFollowingController"])
save_system("SOAForwardVehicleSensorFusion")
save_system("SOALaneFollowingDecisionLogic")
save_system("SOALaneFollowingController")
 
 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'                                                                           }

Сгенерируйте код для Forward Vehicle Sensor Fusion компонент.

slbuild("SOAForwardVehicleSensorFusion");
### Starting serial model reference code generation build
### Starting build procedure for: ForwardVehicleSensorFusion
### Successful completion of code generation for: ForwardVehicleSensorFusion
### Starting build procedure for: SOAForwardVehicleSensorFusion
### Successful completion of code generation for: SOAForwardVehicleSensorFusion

Build Summary

Code generation targets built:

Model                       Action          Rebuild Reason  
============================================================
ForwardVehicleSensorFusion  Code generated                  

Top model targets built:

Model                          Action          Rebuild Reason                   
================================================================================
SOAForwardVehicleSensorFusion  Code generated  Referenced models were updated.  

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

Сгенерируйте код для Lane Following Decision Logic компонент.

slbuild("SOALaneFollowingDecisionLogic");
### Starting serial model reference code generation build
### Checking the status of model reference code generation target for model 'LaneFollowingDecisionLogic' used in 'SOALaneFollowingDecisionLogic'
### Checking for structural changes in LaneFollowingDecisionLogic because the model reference rebuild option is set to 'If any changes detected'. Structural changes cause the model reference code generation target to be rebuilt.
### Starting build procedure for: LaneFollowingDecisionLogic
### Generating code and artifacts to 'Model specific' folder structure
### Code for the model reference code generation target for model LaneFollowingDecisionLogic is up to date because no functional changes were found in the referenced model.
### Model reference code generation target for LaneFollowingDecisionLogic is up to date.
### Starting build procedure for: SOALaneFollowingDecisionLogic
### Generating code and artifacts to 'Model specific' folder structure
### Generating code into build folder: C:\Local\Examples\autonomous_control-ex39999976\SOALaneFollowingDecisionLogic_ert_rtw
### Generated code for 'SOALaneFollowingDecisionLogic' is up to date because no structural, parameter or code replacement library changes were found.
### Saving binary information cache.
### Skipping makefile generation and compilation because C:\Local\Examples\autonomous_control-ex39999976\slprj\ert\_sharedutils\rtwshared.lib is up to date
### Skipping makefile generation and compilation because C:\Local\Examples\autonomous_control-ex39999976\SOALaneFollowingDecisionLogic.exe is up to date
### Successful completion of code generation for: SOALaneFollowingDecisionLogic

Build Summary

Top model targets built:

Model                          Action                                Rebuild Reason  
=====================================================================================
SOALaneFollowingDecisionLogic  Binary information cache regenerated                  

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

Сгенерируйте код для Lane Following Controller компонент.

slbuild("SOALaneFollowingController");
### Starting serial model reference code generation build
### Checking the status of model reference code generation target for model 'LaneFollowingController' used in 'SOALaneFollowingController'
### Checking for structural changes in LaneFollowingController because the model reference rebuild option is set to 'If any changes detected'. Structural changes cause the model reference code generation target to be rebuilt.
### Starting build procedure for: LaneFollowingController
### Generating code and artifacts to 'Model specific' folder structure
   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.
### Code for the model reference code generation target for model LaneFollowingController is up to date because no functional changes were found in the referenced model.
### Model reference code generation target for LaneFollowingController is up to date.
### Starting build procedure for: SOALaneFollowingController
### Generating code and artifacts to 'Model specific' folder structure
### Generating code into build folder: C:\Local\Examples\autonomous_control-ex39999976\SOALaneFollowingController_ert_rtw
### Generated code for 'SOALaneFollowingController' is up to date because no structural, parameter or code replacement library changes were found.
### Saving binary information cache.
### Skipping makefile generation and compilation because C:\Local\Examples\autonomous_control-ex39999976\slprj\ert\_sharedutils\rtwshared.lib is up to date
### Skipping makefile generation and compilation because C:\Local\Examples\autonomous_control-ex39999976\SOALaneFollowingController.exe is up to date
### Successful completion of code generation for: SOALaneFollowingController

Build Summary

Top model targets built:

Model                       Action                                Rebuild Reason  
==================================================================================
SOALaneFollowingController  Binary information cache regenerated                  

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

Исследуйте сгенерированный код

Исследуйте сгенерированный код для Forward Vehicle Sensor Fusion компонент и проверяет интерфейсы сообщения.

Откройте SOAForwardVehicleSensorFusion.cpp файл и представление эти интерфейсы сообщения:

  • TimeRecvData.RecvData — Получает системное время от Simulation 3D Scenario подсистема.

  • VisionRecvData.RecvData — Получает обнаружения видения от Simulation 3D Scenario подсистема.

  • RadarRecvData.RecvData — Получает радарные обнаружения от Simulation 3D Scenario подсистема.

  • TracksSendData.SendData — Отправляет подтвержденные дорожки, обнаруженные этим компонентом к Lane Following Decision Logic компонент.

Можно также использовать этот процесс, чтобы проверить классы сообщений для Lane Following Decision Logic и Lane Following Controller компоненты от их сгенерированного кода.

Для получения информации о том, как интегрировать сгенерированный код с внешними протоколами сообщения, смотрите, Генерируют сообщения C++, чтобы Передать Между Simulink и Операционной системой или Промежуточным программным обеспечением (Embedded Coder) и Использование Рукописный Код, чтобы Интегрировать сообщения C++ с POSIX (Embedded Coder).

Похожие темы