主要内容

Processor-in-the-Loop JPDA追踪汽车应用程序的验证

这个例子向您展示了如何生成嵌入代码trackerJPDA(JPDA)追踪和验证使用processor-in-the-loop(公益诉讼)模拟与1 MB RAM STM32其核心板和2 MB的闪存。在本例中,您配置JPDA跟踪器能够处理从一个摄像头和一个雷达的检测传感器安装在前面的自我在高速公路场景中车辆。对于公益诉讼模拟,使用模拟检测来验证跟踪和计算生成的代码的性能。

设置跟踪算法嵌入代码生成

计算需求之间的平衡和跟踪性能。嵌入式系统的JPDA跟踪器是一个合适的选择。在每一步,JPDA追踪分裂detections-to-tracks数据关联问题转化为多个集群/传感器。每个集群包含一组探测和跟踪控制后,可以分配给彼此。检测和跟踪的具体分离到集群,每个集群的大小,每个集群和可行的数据关联事件的数量通常是由运行时输入和在编译时不知道。JPDA的跟踪算法的更多信息,请参阅算法的部分trackerJPDA

当生成嵌入式代码从跟踪器等安全关键应用高速公路车道后,动态内存分配通常是气馁。这意味着分配的内存数量在编译时间跟踪器必须是已知的。此外,生成的代码必须适合嵌入式设备提供的内存。有效管理一个追踪者没有动态内存分配的内存占用,您必须指定特定的边界跟踪。这些边界通常使用先验知识定义的目标应用程序。每个集群绑定可行事件的数量,你使用K-best JPDA追踪通过指定一个有限值MaxNumEvents财产。这允许跟踪器使用最多K数据关联事件每个集群没有列举所有可行的事件。您使用MaxNumDetectionsPerClusterMaxNumTracksPerCluster集群属性绑定的大小。对于高速公路驾驶场景,集群规模可以通过使用有界先验知识的最大间隔太近的车辆数。你选择一个适当的值AssignmentThreshold财产闸门detection-to-track协会。一个大的AssignmentThreshold值会导致门大小比预想的要大得多,从而导致大型集群的形成。为了避免大型集群,您设置ClusterViolationHandling财产“终止”,使跟踪误差是否违反了集群大小。你设置MaxNumDetectionsMaxNumDetectionsPerSensor属性使用信息从模拟或实际的传感器。在这个例子中,雷达输出最多36个对象级检测和相机输出最多10对象级别的检测。

最后,嵌入代码生成使用嵌入式®编码器™需要MATLAB®代码写在一个函数的形式。这个函数通常被称为一个入口点函数。你重写跟踪算法作为一个函数,定义使用作为一个入口点函数内的追踪持续的函数调用之间的变量来保存其状态。对于这个示例,跟踪算法是裹着的入口点函数,trackingAlgorithm所示,并与这个例子。

类型trackingAlgorithm.m
函数跟踪= trackingAlgorithm(检测、时间)%作为一个持久变量定义跟踪持续追踪%初始化跟踪器在第一次调用使用isempty如果isempty(跟踪)追踪= trackerJPDA (FilterInitializationFcn = @helperInitFVSFFilter,…MaxNumEvents = 5,……% 5最好每个集群事件MaxNumSensors = 2,…% 2传感器提要数据追踪MaxNumTracks = 36岁,…%应至少MaxNumDetectionsPerSensor MaxNumDetections = 46岁,…%最大数量的检测传感器ClutterDensity = 1 e-9,…%误警率每单位体积测量AssignmentThreshold = 50,…%阈值控制作业ConfirmationThreshold = [5 - 6],…%确认跟踪5打6 DeletionThreshold = [4 - 5],…%删除跟踪4遗漏了5 HitMissThreshold = 0.5,……%的概率赋值导致/小姐EnableMemoryManagement = true,…%为减少足迹MaxNumDetectionsPerCluster = 5,启用内存管理……%最大检测每个集群MaxNumTracksPerCluster = 5,……%最大跟踪每个集群MaxNumDetectionsPerSensor = 36岁,…%最大检测每个集群ClusterViolationHandling =“终止”……%错误如果违反集群大小); end % Update the tracker every step using current detections and time stamp tracks = tracker(detections, time); end

设置测试台上

测试跟踪算法,您可以使用drivingScenario(自动驾驶工具箱)对象来模拟高速公路驾驶场景。您使用drivingRadarDataGenerator(自动驾驶工具箱)visionDetectionGenerator(自动驾驶工具箱)对象来模拟检测分别从雷达和摄像头传感器。在这个例子中使用的场景和传感器配置所示类似提出车辆传感器融合(自动驾驶工具箱)例子,适用于汽车等应用程序高速公路车道后(自动驾驶工具箱)。场景和传感器模型生成的过程是用辅助函数,helperCreateFVSFPILScenario,附加的例子。这个函数接受场景的名称作为输入。兼容场景名称,请参阅探索其他场景这个例子的底部。

这个示例中使用的目标板支持单引号和双精度浮点运算。金宝app减少内存占用的追踪,使用单精确跟踪器的输入。使用单精确跟踪器的输入允许它使用严格的单精度算法在生成的代码中。将检测到单精度,使用helperCastDetections附加功能与这个例子。您可以配置跟踪算法使用双精度输入通过改变数据类型变量来“双”

你评估使用的跟踪算法的性能trackGOSPAMetric(GOSPA)指标。GOSPA度量使用可用的地面实况场景模拟和捕获跟踪算法的准确性作为标量每一步的距离。度规的这一特性也使一个有吸引力的方法来评估公益诉讼期间跟踪算法模拟的等效性。在本例中,您在目标硬件验证生成的代码会产生相同的结果通过比较从MATLAB模拟仿真和公益诉讼GOSPA值。

%创建场景。scenarioName =“scenario_FVSF_01_Curve_FourVehicles”;[场景,egoVehicle、雷达、相机]= helperCreateFVSFPILScenario (scenarioName);%创建GOSPA度量对象gospaObj = trackGOSPAMetric(距离=“posabserr”);

接下来,您在这个特定的场景上运行试验台通过运行跟踪在MATLAB环境下确保试验台和跟踪算法产生预期的结果。你也捕捉GOSPA度量MATLAB执行期间。

%捕获GOSPA度量gospa = 0 (0, 1);%创建显示范围= HelperJPDATrackerPILDisplay;每次运行前%明显持久变量清晰的trackingAlgorithm;%选择数据类型数据类型=“单一”;推进(场景)%得到当前仿真时间时间=(场景。SimulationTime,数据类型);%收集探测雷达和摄像头传感器检测= helperCollectDetections (egoVehicle、雷达、相机、时间);%检测单精度检测= helperCastDetections(检测、数据类型);%饲料检测跟踪算法跟踪= trackingAlgorithm(检测、时间);%寻找真理可检测的目标真理= helperFilterWithinCoverage (egoVehicle、雷达、摄像头等);%计算GOSPA度量gospa (+ 1, - 1) = gospaObj(痕迹,真理);% #好< SAGROW >%可视化结果范围(场景、egoVehicle{雷达;相机},检测,跟踪);结束

方便地重新运行这个在公益诉讼模拟试验台,你也将试验台在一个单独的函数,helperJPDATrackerPILTestBench。调用这个函数可以使用如下语法:

gospa = helperJPDATrackerPILTestBench (scenarioName trackingAlgorithmName,数据类型);%没有可视化gospa = helperJPDATrackerPILTestBench (scenarioName trackingAlgorithmName,数据类型,真正的);%启用可视化

为公益诉讼生成代码

在本节中,您为跟踪算法生成独立的C代码作为一个静态库。您进一步验证的代码通过公益诉讼运行模拟STM32 H743ZI2核目标板。这一目标板有一个手臂®皮层®M7 CPU和1 MB的RAM和2 MB的闪存。关于公益诉讼模拟黑板上的更多信息,请参阅使用意法半导体核董事会Processor-in-the-Loop验证的MATLAB函数意金宝app法半导体(仿真软件编金宝app码器支持计划董事会核)的例子。尽管这个示例讨论了关于公益诉讼而言目标硬件仿真,这种方法可用于任何受支持的硬件。金宝app看到嵌入式硬件编码器支持金宝app(嵌入式编码)页面获取更多信息关于硬件董事会的支持。金宝app

跟踪算法来生成代码,您必须定义的类型的入口点函数的输入。一个简单的方法来定义这些输入是通过使用codegen(MATLAB编码器)论点。使用MATLAB执行过程中捕获的检测为入口点函数定义的输入类型。注意,输入的数据类型的代码生成后不能更改。因此,如果嵌入代码生成单精度测量、试验台必须提供单精确测量作为输入的跟踪算法。随着检测数量的变化之间的每次调用跟踪算法,你发现输入类型定义为可变大小单元阵列的最大使用46元素coder.typeof(MATLAB编码器)函数。您还定义时间的输入类型输入使用正确的数据类型中定义的设置测试台上部分。

sampleDetection =检测{1};detectionsInput =编码器。类型of({sampleDetection},[46 1],[1 0]); timeInput = cast(0,dataType);

您定义的代码生成配置公益诉讼验证通过创建一个coder.EmbeddedCodeConfig(MATLAB编码器)对象。你定义VerificationMode作为“公益诉讼”并指定某些硬件配置上的属性。配置文件生成的代码在目标硬件,你也设置CodeExecutionProfiling财产真正的

cfg = coder.config (“自由”,“是”,真正的);%创建一个编码器。EmbeddedeCodeConfig对象cfg。VerificationMode =“公益诉讼”;%为验证启用公益诉讼cfg。DynamicMemoryAllocation =“关闭”;%断开动态内存分配cfg。工具链=“ARM嵌入式处理器的GNU工具”;%指定工具链cfg。硬件= coder.hardware (“STM32 H743ZI2核”);%指定硬件板cfg。StackUsageMax = 512;%(字节)限制使用堆栈cfg.Hardware。PILCOMPort =“COM3”;%为连接指定的端口与硬件cfg。CodeExecutionProfiling = true;%启用代码执行分析

使用生成代码codegen函数。这个函数产生一个墨西哥人文件名为trackingAlgorithm_pil在当前工作目录中。这个墨西哥人文件提供了一个包装发送输入从MATLAB环境目标硬件和收集从目标硬件输出回MATLAB。

codegen (“trackingAlgorithm.m”,“参数”{detectionsInput, timeInput},“配置”cfg);
# # #连接配置功能的trackingAlgorithm: STM32单片机的# # # COM端口:COM3 # # #波特率:115200代码生成成功。

公益诉讼仿真和结果

在本节中,您使用前一节运行公益诉讼产生的墨西哥人使用目标硬件仿真。重用中创建的试验台设置测试台上部分,您跟踪算法名称指定为trackingAlgorithm_pil

trackingAlgorithmName =“trackingAlgorithm_pil”;gospaPIL = helperJPDATrackerPILTestBench (scenarioName trackingAlgorithmName,数据类型);
# # #开始应用程序:“codegen \ lib \ trackingAlgorithm \ \ trackingAlgorithm趁手。精灵的终止执行:明确trackingAlgorithm_pil # # #可执行文件下载到硬件驱动:S: H: \ MATLAB \ \ driving_fusion_nucleo-ex84625170例子\ codegen \ lib \ trackingAlgorithm \公益诉讼\ . . \ \ . . \…\ trackingAlgorithm。本1文件复制执行分析数据可供浏览。开放的仿真数据检查员。执行分析报告后终止。

下面的情节显示GOSPA度量了在MATLAB和公益诉讼期间仿真运行。注意捕获的GOSPA指标在两个运行一样,这确保生成的代码运行在目标硬件和MATLAB产生相同的结果。

图;情节(gospa“线宽”2);持有;情节(gospaPIL“线宽”2,“线型”,“——”);传奇(MATLAB仿真的,“公益诉讼模拟”);标题(“GOSPA指标”);包含(“时间步”);ylabel (“指标”);网格;

除了跟踪性能外,您还可以使用分析结果被公益诉讼模拟检查计算跟踪算法在目标硬件的性能。下面的情节显示运行时性能目标跟踪算法的硬件。注意跟踪器可以运行速度超过100赫兹,保证实时计算这个板的能力。

明确(trackingAlgorithmName);%结果公益诉讼结束后可用
执行分析报告:报告(getCoderExecutionProfile (trackingAlgorithm))
%的阴谋执行概要executionProfile = getCoderExecutionProfile (“trackingAlgorithm”)
代码执行trackingAlgorithm分析数据。打开一个报告,输入命令报告(executionProfile)。
图;stepSection = executionProfile.Sections (2);execTime = stepSection.ExecutionTimeInSeconds;阴谋(1 * execTime e3,“线宽”2);标题(“追踪执行时间(模拟数据)”);包含(“时间步”);ylabel (“时间(ms)”);网格;

实时性能验证记录数据

在前面的章节中,您验证的跟踪和计算性能跟踪算法在其核心目标硬件。场景仿真允许您定义各种情况和验证跟踪器在这种情况下的性能。然而,也是至关重要的验证跟踪器的性能在一个真实的数据集。这将确保跟踪算法能承受的挑战和现实情况的复杂性。

在本节中,您验证的计算性能跟踪器使用记录数据从相机和雷达高速公路场景。这段录音是一种多模雷达使用的雷达,它提供了一个广泛覆盖在中档和一条狭窄但是高分辨率覆盖范围。从目标对象除了提供检测,雷达也输出检测道路基础设施,使跟踪算法容易受到许多错误的轨道。你过滤掉基础设施检测使用helper函数,helperFilterStaticDetections。这个helper函数使用记录速度、偏航率自我的车辆,以及多普勒雷达的信息(数据)过滤检测从静态环境中的对象。

videoFile =“05 _highway_lanechange_25s.mp4”;sensorFile =“05 _highway_lanechange_25s_sensor.mat”;%加载数据记录=负载(sensorFile);numSteps =元素个数(recording.radar);%可视化场景使用相机记录videoReader = videoReader (videoFile);%初始化显示范围= HelperJPDATrackerPILDisplay (“UseRecordedData”,真正的);%计时器在20 Hz时间=投(0,数据类型);步伐=投(0.05,数据类型);%初始化跟踪器明确(trackingAlgorithmName);currentStep = 1: numSteps%更新时间时间=时间+步伐;%收集检测记录[radarTotalDetections, visionDetections laneData imuData] = helperCollectDetectionsFromRecording(记录、时间currentStep);%的雷达探测目标和杂波[radarDetections, staticDetections] = helperFilterStaticDetections (radarTotalDetections imuData);%连接检测检测= [radarDetections; visionDetections];检测= helperCastDetections(检测、数据类型);%在硬件上运行跟踪跟踪=函数宏指令(trackingAlgorithmName、检测、时间);% #好< FVAL >%可视化vidImage = readFrame (videoReader);范围(staticDetections vidImage laneData,检测,跟踪);结束
# # #连接配置功能的trackingAlgorithm: STM32单片机的# # # COM端口:COM3 # # #波特率:115200 # # #开始应用:“codegen \ lib \ trackingAlgorithm \ \ trackingAlgorithm趁手。精灵的终止执行:明确trackingAlgorithm_pil # # #可执行文件下载到硬件驱动:S: H: \ MATLAB \ \ driving_fusion_nucleo-ex84625170例子\ codegen \ lib \ trackingAlgorithm \公益诉讼\ . . \ \ . . \…\ trackingAlgorithm。本1文件复制执行分析数据可供浏览。开放的仿真数据检查员。执行分析报告后终止。

明确(trackingAlgorithmName);%结果公益诉讼结束后可用
执行分析报告:报告(getCoderExecutionProfile (trackingAlgorithm))
%的阴谋执行概要executionProfile = getCoderExecutionProfile (“trackingAlgorithm”)
代码执行trackingAlgorithm分析数据。打开一个报告,输入命令报告(executionProfile)。
图;stepSection = executionProfile.Sections (2);execTime = stepSection.ExecutionTimeInSeconds;阴谋(1 * execTime e3,“线宽”2);标题(的追踪执行时间(记录数据));包含(“时间步”);ylabel (“时间(ms)”);网格;

注意跟踪器能跟踪目标的视野内的传感器和能够跑得更快比60赫兹在这个特定的硬件板。这个验证算法的实时跟踪能力在密集的交通场景中捕获记录。

探索其他场景

重要的是要评估跟踪算法的性能在不同的场景。您可以使用模拟环境在这个例子中探索其他场景,兼容定义的试验台helperJPDATrackerPILTestBench。这里有五个场景,您可以使用通过指定兼容scenarioName输入下列之一:

  • “scenario_FVSF_01_Curve_FourVehicles”

  • “scenario_FVSF_02_Straight_FourVehicles”

  • “scenario_FVSF_03_Curve_SixVehicle”

  • “scenario_FVSF_04_Straight_FourVehicles”

  • “scenario_FVSF_05_Straight_TwoVehicles”

总结

在这个例子中,您学习了如何从公益诉讼的跟踪算法模拟生成代码。你验证生成的代码STM32董事会核使用模拟数据以及从高速公路驾驶场景记录数据。你进一步评估计算性能和实时跟踪算法的能力在这样的场景选择目标硬件。