主要内容

面向汽车应用的JPDA跟踪器的处理器在环验证

此示例向您展示如何为控件生成嵌入式代码trackerJPDA(JPDA)跟踪器,并在STM32 Nucleo板上使用1 MB RAM和2 MB闪存上使用处理器在环(PIL)模拟验证它。在本例中,您将JPDA跟踪器配置为处理高速公路场景中安装在自我车辆前面的摄像头和雷达传感器的检测。对于PIL模拟,您使用模拟检测来验证生成代码的跟踪和计算性能。

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

平衡计算需求和跟踪性能。JPDA跟踪器是嵌入式系统的合适选择。在每一步,JPDA跟踪器将检测到跟踪的数据关联问题拆分为每个传感器的多个集群。每个集群包含一组检测和跟踪,可以在门控后分配给彼此。将检测和跟踪精确地分离到集群、每个集群的大小以及每个集群的可行数据关联事件的数量通常是由运行时输入决定的,在编译时是不知道的。有关JPDA跟踪算法的详细信息,请参阅算法的部分trackerJPDA

当从跟踪器为安全关键应用程序(如高速公路车道跟踪)生成嵌入式代码时,通常不鼓励动态内存分配。这意味着在编译时必须知道分配给跟踪器的内存量。此外,生成的代码必须适合嵌入式设备提供的内存。要在没有动态内存分配的情况下有效地管理跟踪器的内存占用,必须在跟踪器上指定某些边界。这些界限通常是使用关于目标应用程序的先验知识定义的。的有限值,使用K-best JPDA跟踪器来约束每个集群中可行事件的数量MaxNumEvents财产。这允许跟踪器在每个集群中使用最多K个数据关联事件,而无需枚举所有可行事件。你可以使用MaxNumDetectionsPerCluster而且MaxNumTracksPerCluster属性绑定集群的大小。对于高速公路驾驶场景,可以通过使用关于紧密间隔车辆的最大数量的先验知识来限制集群大小。为选择一个适当的值AssignmentThreshold属性,用于对检测到跟踪关联进行门控。一个大的AssignmentThreshold值可能导致门尺寸比期望的大得多,这可能导致形成大簇。为避免大型集群,可以设置ClusterViolationHandling财产“终止”,这将导致跟踪器在违反集群大小时出错。你设置MaxNumDetections而且MaxNumDetectionsPerSensor属性,使用来自模拟或实际传感器的信息。在本例中,雷达输出最多36个目标级检测,摄像机输出最多10个目标级检测。

最后,使用embedded®Coder™生成嵌入式代码需要以函数的形式编写MATLAB®代码。这个函数通常被称为入口点函数。要将跟踪算法重写为函数,可以在入口点函数中定义跟踪器,使用持续的变量在函数调用之间保存其状态。在本例中,跟踪算法封装在入口点函数t中rackingAlgorithm如下所示,并附上此示例。

类型trackingAlgorithm.m
函数tracks = trackingAlgorithm(detection, time) %将跟踪器定义为持久变量持久跟踪器%在第一次调用时使用isempty if isempty(跟踪器)跟踪器= trackerJPDA(FilterInitializationFcn=@helperInitFVSFFilter,…MaxNumEvents = 5,……% 5最佳事件每集群MaxNumSensors=2,…只有2个传感器馈送数据跟踪器MaxNumTracks=36,…%应该至少是MaxNumDetectionsPerSensor MaxNumDetections=46,…所有传感器的最大检测数量% ClutterDensity=1e-9,…%单位测量量误报率%门限值分配ConfirmationThreshold=[5 6],…%确认6次命中5次的音轨DeletionThreshold=[4 5],…%删除5次命中4次的音轨,HitMissThreshold=0.5,…%命中/不命中的分配概率MaxNumDetectionsPerCluster=5,…每个集群最大检测数量MaxNumTracksPerCluster=5,…每个集群最大跟踪数MaxNumDetectionsPerSensor=36,…%每个集群最大检测次数%如果违反集群大小错误); end % Update the tracker every step using current detections and time stamp tracks = tracker(detections, time); end

设置测试台

要测试跟踪算法,可以使用drivingScenario(自动驾驶工具箱)对象来模拟高速公路驾驶场景。你可以使用drivingRadarDataGenerator(自动驾驶工具箱)而且visionDetectionGenerator(自动驾驶工具箱)分别模拟来自雷达和摄像机传感器的探测对象。本例中使用的场景和传感器配置类似于前方车辆传感器融合(自动驾驶工具箱)例及适用于汽车应用等高速公路车道跟踪(自动驾驶工具箱).场景和传感器模型生成的过程封装在辅助函数中,helperCreateFVSFPILScenario,附上这个例子。这个函数接受场景的名称作为输入。有关兼容的场景名称,请参见探索其他场景部分。

本例中使用的目标板支持单精度和双精度浮点运算。为了减少跟踪器的内存占用,可以使用跟踪器的单精度输入。对跟踪器使用单精度输入允许它在生成的代码中使用严格的单精度算术。要将检测强制转换为单精度,可以使用helperCastDetections本例附带的函数。属性将跟踪算法配置为使用双精度输入数据类型变量来“双”

方法来评估跟踪算法的性能trackGOSPAMetric(GOSPA)指标。GOSPA度量使用来自场景模拟的可用地面真相,并将跟踪算法的精度捕获为每一步的标量距离。度量的这一特性也使它成为PIL仿真过程中评估跟踪算法等效性的一种有吸引力的方法。在本例中,您将通过比较MATLAB仿真和PIL仿真中的GOSPA值来验证在目标硬件上生成的代码是否产生相同的结果。

创建场景。scenarioName =“scenario_FVSF_01_Curve_FourVehicles”;[scenario, egoVehicle, radar, camera] = helperCreateFVSFPILScenario(scenarioName);创建GOSPA度量对象gospaObj = trackGOSPAMetric(距离=“posabserr”);

接下来,通过在MATLAB环境中运行跟踪器,在这个特定的场景中运行测试平台,以确保测试平台和跟踪算法产生预期的结果。您还可以在MATLAB执行期间捕获GOSPA度量。

捕获GOSPA度量Gospa = 0 (0,1);%创建显示scope = HelperJPDATrackerPILDisplay;每次运行前清除持久变量清晰的trackingAlgorithm选择数据类型数据类型=“单一”推进(场景)获取当前模拟时间时间= cast(场景。SimulationTime,数据类型);从雷达和摄像头传感器收集检测detections = helperCollectDetections(egoVehicle, radar, camera, time);%铸造检测到单精度detections = helperCastDetections(detections, dataType);将检测送入跟踪算法tracks = trackingAlgorithm(检测,时间);为真理寻找可探测的目标真相= helperFilterWithinCoverage(egoVehicle,雷达,相机);计算GOSPA度量gospa(end+1,1) = gospaObj(轨道,真理);% #好< SAGROW >%可视化结果范围(场景,egoVehicle,{雷达;摄像头},探测,轨迹);结束

为了在PIL模拟期间方便地重新运行这个测试平台,您还将测试平台包装在一个单独的函数中,helperJPDATrackerPILTestBench.这个函数可以用下面的语法调用:

gospa = helperJPDATrackerPILTestBench(场景名,trackingAlgorithmName,数据类型);%没有可视化gospa = helperJPDATrackerPILTestBench(scenarioName, trackingAlgorithmName, dataType, true);%启用可视化

为PIL生成代码

在本节中,您将为跟踪算法生成独立的C代码作为静态库。通过在STM32 Nucleo H743ZI2目标板上运行PIL模拟,进一步验证代码。该目标板有一个ARM®-Cortex®M7 CPU, 1 MB RAM和2 MB闪存。有关此板上的PIL模拟的更多信息,请参阅用意法半导体Nucleo板实现MATLAB函数的在环处理器验证(意法半导体Nucleo板的Simulink Coder支持包)的例子。虽然本例讨论的是在Nucleo目标硬件上进行PIL仿真,但这种方法可以用于任何受支持的硬件上。看到嵌入式编码器支持的硬件(嵌入式编码)有关支持的硬件板的详细信息。

要为跟踪算法生成代码,必须定义入口点函数的输入类型。定义这些输入的一种简单方法是使用codegen(MATLAB编码器)论点。您可以使用MATLAB执行期间捕获的检测来定义入口点函数的输入类型。注意,在代码生成之后,输入的数据类型不能更改。因此,如果嵌入式代码是用单精度测量生成的,那么测试台必须提供单精度测量作为跟踪算法的输入。方法将检测输入类型定义为最大46个元素的可变大小单元格数组,因为每次对跟踪算法的调用之间检测数量会发生变化coder.typeof(MATLAB编码器)函数。方法中定义的正确数据类型还可以定义时间输入的输入类型设置测试台部分。

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

为PIL验证定义代码生成配置编码器。EmbeddedCodeConfig(MATLAB编码器)对象。你定义VerificationMode作为“公益诉讼”并在配置上指定某些硬件属性。要在目标硬件上分析生成的代码,还可以设置CodeExecutionProfiling财产真正的

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

使用codegen函数。这个函数生成一个名为t的MEX文件rackingAlgorithm_pil在当前工作目录中。这个MEX文件提供了一个包装器,用于将MATLAB环境中的输入发送到目标硬件,并将目标硬件中的输出收集回MATLAB。

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

PIL模拟与结果

在本节中,您将使用前一节生成的MEX使用目标硬件运行PIL模拟。中创建的测试台架设置测试台节中,将跟踪算法名称指定为trackingAlgorithm_pil

trackingAlgorithmName =“trackingAlgorithm_pil”;gospaPIL = helperJPDATrackerPILTestBench(场景名,trackingAlgorithmName,数据类型);
###启动应用程序:` codegen\lib\trackingAlgorithm\pil\trackingAlgorithm。将可执行文件下载到Drive: S: H:\MATLAB\Examples\driving_fusion_nucleo-ex84625170\codegen\lib\trackingAlgorithm\pil\.. .\..\..\..\trackingAlgorithm.bin 1文件拷贝执行分析数据可供查看。打开模拟数据检查器。终止后可用的执行概要报告。

下面的图显示了在MATLAB运行和PIL模拟期间捕获的GOSPA度量。请注意,在两次运行期间捕获的GOSPA指标是相同的,这确保了在目标硬件上运行生成的代码产生与MATLAB相同的结果。

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

除了跟踪性能之外,还可以使用PIL模拟捕获的分析结果来检查跟踪算法在目标硬件上的计算性能。下图显示了跟踪算法在目标硬件上的运行时性能。请注意,跟踪器能够以超过100 Hz的速度运行,确保在这个特定的板上实时计算的能力。

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

记录数据的实时性能验证

在前面的小节中,您在Nucleo目标硬件上验证了跟踪算法的跟踪和计算性能。场景模拟允许您定义各种情况,并验证跟踪器在这些情况下的性能。然而,在真实数据集上验证跟踪器的性能也是至关重要的。这确保了跟踪算法能够承受现实情况的挑战和复杂性。

在本节中,您将在高速公路场景中使用来自摄像机和雷达的记录数据验证跟踪器的计算性能。在这个记录中使用的雷达是一个多模式雷达,它在中距离提供广泛的覆盖,在远距离提供狭窄但高分辨率的覆盖。除了提供来自目标物体的探测,雷达还输出来自道路基础设施的探测,使得跟踪算法容易受到许多虚假跟踪的影响。您可以使用helper函数过滤出基础设施检测,helperFilterStaticDetections.这个辅助功能使用记录的速度,自我飞行器的偏航率,以及来自雷达的多普勒(距离率)信息来过滤环境中静态物体的探测。

videoFile =“05 _highway_lanechange_25s.mp4”;sensorFile =“05 _highway_lanechange_25s_sensor.mat”加载数据记录= load(sensorFile);numSteps = numel(recording.radar);使用相机记录可视化场景videoReader = videreader (videoFile);初始化显示scope = HelperJPDATrackerPILDisplay(“UseRecordedData”,真正的);%定时器在20hztime = cast(0,dataType);timeStep = cast(0.05,dataType);%重新初始化跟踪器明确(trackingAlgorithmName);currentStep = 1:numSteps%更新时间time = time + timeStep;从记录中收集检测[radarTotalDetections, visionDetections, laneData, imuData] = helperCollectDetectionsFromRecording(recording, time, currentStep);%雷达探测目标和杂波[radarDetections, staticDetections] = helperFilterStaticDetections(radarTotalDetections, imuData);%串联检测探测=[雷达探测;视觉探测];detections = helperCastDetections(detections,dataType);在硬件上运行跟踪器tracks = feval(trackingAlgorithmName,检测,时间);% #好< FVAL >%可视化vidImage = readFrame(videereader);scope(vidImage, laneData, detections, staticDetections, tracks);结束
###连接配置功能“trackingAlgorithm”:“STM32微控制器”COM端口:COM3波特率:115200启动应用程序:“codegen\lib\trackingAlgorithm\pil\trackingAlgorithm”。将可执行文件下载到Drive: S: H:\MATLAB\Examples\driving_fusion_nucleo-ex84625170\codegen\lib\trackingAlgorithm\pil\.. .\..\..\..\trackingAlgorithm.bin 1文件拷贝执行分析数据可供查看。打开模拟数据检查器。终止后可用的执行概要报告。

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

请注意,跟踪器能够跟踪传感器视野范围内的目标,并且能够在这个特定的硬件板上以超过60 Hz的速度运行。这验证了算法在记录中捕获的更密集的交通场景下的实时跟踪能力。

探索其他场景

对跟踪算法在不同场景下的性能进行评估是非常重要的。您可以使用本例中的模拟环境来探索与定义的测试平台兼容的其他场景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”

总结

在本例中,您学习了如何从用于PIL模拟的跟踪算法生成代码。您使用模拟数据以及来自高速公路驾驶场景的记录数据在STM32 Nucleo板上验证了生成的代码。在选定的目标硬件上,您进一步评估了这种情况下跟踪算法的计算性能和实时能力。

Baidu
map