主要内容

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

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

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

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

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

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

类型trackingAlgorithm.m
在第一次调用时使用isempty if isempty(跟踪器)初始化跟踪器跟踪器= trackerJPDA(FilterInitializationFcn=@helperInitFVSFFilter,…MaxNumEvents = 5,……% 5最佳事件每个集群MaxNumSensors=2,…只有2个传感器向跟踪器MaxNumTracks=36提供数据,…%应该至少是MaxNumDetectionsPerSensor MaxNumDetections=46,…%来自所有传感器的最大检测数ClutterDensity=1e-9,…单位测量量的虚警率AssignmentThreshold=50,…%门控分配阈值ConfirmationThreshold=[5 6],…%确认6个音轨中有5个命中DeletionThreshold=[4 5],…删除一个5次命中4次的音轨,HitMissThreshold=0.5,…%分配导致命中/遗漏的概率EnableMemoryManagement=true,…%启用内存管理以减少内存占用MaxNumDetectionsPerCluster=5,…%每个集群的最大检测数MaxNumTracksPerCluster=5,…%每个集群最大跟踪数MaxNumDetectionsPerSensor=36,…%每个集群最大检测次数ClusterViolationHandling='Terminate'…%错误,如果集群大小违反); 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);%创建显示范围= HelperJPDATrackerPILDisplay;每次运行前清除持久变量清晰的trackingAlgorithm%选择数据类型数据类型=“单一”推进(场景)获取当前模拟时间时间=(场景。SimulationTime,数据类型);收集雷达和相机传感器的探测detections = helperCollectDetections(egoVehicle,雷达,相机,时间);将检测转换为单一精度detections = helperCastDetections(detections, dataType);向跟踪算法提供检测tracks = trackingAlgorithm(检测,时间);为真理寻找可察觉的目标真理= helperFilterWithinCoverage(egoVehicle,雷达,相机);%计算GOSPA度量gospa(end+1,1) = gospaObj(tracks, truth);% #好< SAGROW >%可视化结果scope(scenario, egoVehicle, {radar;camera}, detection, tracks);结束

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

gospa = helperJPDATrackerPILTestBench(scenario oname, trackingAlgorithmName, dataType);%没有可视化gospa = helperJPDATrackerPILTestBench(scenarioName, trackingAlgorithmName, dataType, true);%启用可视化

为PIL生成代码

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

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

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

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

cfg = coder.config (“自由”“是”,真正的);创建一个编码器。EmbeddedeCodeConfig对象cfg。VerificationMode =“公益诉讼”启用PIL进行验证cfg。DynamicMemoryAllocation =“关闭”关闭动态内存分配cfg。工具链=用于ARM嵌入式处理器的GNU工具%指定工具链cfg。硬件= coder.hardware (“STM32 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”;福音apil = helperJPDATrackerPILTestBench(scenario oname, trackingAlgorithmName, dataType);
启动应用程序:'codegen\lib\trackingAlgorithm\pil\trackingAlgorithm. '下载可执行文件到硬件驱动器:S: H:\MATLAB\Examples\driving_fusion_nucleo-ex84625170\codegen\lib\trackingAlgorithm\pil\..\..\..\ trackingAlgorithm.bin 1文件(S)复制的执行分析数据可供查看。打开模拟数据检查器。终止后可获得执行分析报告。

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

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

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

明确(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目标硬件上跟踪算法的跟踪和计算性能。场景模拟允许您定义各种情况,并在这些情况下验证跟踪器的性能。然而,在真实数据集上验证跟踪器的性能也是至关重要的。这保证了跟踪算法能够承受现实情况的挑战和复杂性。

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

videoFile =“05 _highway_lanechange_25s.mp4”;sensorFile =“05 _highway_lanechange_25s_sensor.mat”%加载数据记录=负载(sensorFile);numSteps =元素个数(recording.radar);用摄像机记录下这个场景。videoReader = videoReader (videoFile);%初始化显示范围= HelperJPDATrackerPILDisplay (“UseRecordedData”,真正的);%定时器在20赫兹时间=投(0,数据类型);步伐=投(0.05,数据类型);%初始化跟踪器明确(trackingAlgorithmName);currentStep = 1: numSteps%更新时间time = time + timeStep;从记录中收集检测[radarTotalDetections, visionDetections, laneData, imuData] = helperCollectDetectionsFromRecording(recording, time, currentStep);雷达探测目标和杂波[radarDetections, staticDetections] = helperFilterStaticDetections(radarTotalDetections, imuData);%连接检测检测= [radarDetections; visionDetections];检测= helperCastDetections(检测、数据类型);在硬件上运行跟踪器tracks = feval(trackingAlgorithmName,detections, time);% #好< FVAL >%可视化vidImage = readFrame (videoReader);scope(vidImage, laneData, detections, staticDetections, tracks);结束
###连接配置函数'trackingAlgorithm': 'STM32微控制器' ## COM端口:COM3 ###波特率:115200 ###启动应用程序:'codegen\lib\trackingAlgorithm\pil\trackingAlgorithm. '下载可执行文件到硬件驱动器:S: H:\MATLAB\Examples\driving_fusion_nucleo-ex84625170\codegen\lib\trackingAlgorithm\pil\..\..\..\ trackingAlgorithm.bin 1文件(S)复制的执行分析数据可供查看。打开模拟数据检查器。终止后可获得执行分析报告。

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

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

探索其他场景

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