主要内容

如何生成C代码跟踪

这个例子展示了如何为MATLAB函数生成C代码过程跟踪检测和输出。函数包含一个trackerGNN,但可以使用任何追踪。

从MATLAB代码自动生成的代码有两个主要优点:

  1. 原型可以在MATLAB环境中开发和调试。MATLAB工作完成后,自动生成C代码使得算法可部署的各种目标。此外,通过运行编译C代码可以进一步测试了墨西哥人文件在MATLAB环境中使用相同的可视化和分析工具,在原型阶段。

  2. 生成C代码后,您可以生成可执行代码,这在许多情况下运行速度比MATLAB代码。改进的运行时可用于开发和部署实时传感器融合和跟踪系统。它还提供了一个更好的方法来批量试验跟踪系统大量的数据集。

这个例子解释了MATLAB代码如何修改空中交通管制例子来支持代码生成。金宝app这个例子需要MATLAB编码器许可生成C代码。

修改和运行MATLAB代码

MATLAB生成C代码,程序员需要MATLAB代码是一个函数的形式。此外,函数的参数不能MATLAB类。

在这个例子中,空中交通管制(ATC)的代码被重组的例子trackerGNN执行传感器融合和跟踪驻留在一个单独的文件,tracker_kernel.m。审查这个文件为代码生成关于内存分配的重要信息。

保持的状态trackerGNN之间的调用tracker_kernel.m跟踪器被定义为一个持续的变量。

此函数将一个细胞的数组objectDetection对象,生成的fusionRadarSensor对象,和时间作为输入参数。

同样,从一个函数输出,支持代码生成不能对象。金宝app的输出tracker_kernel.m是:

  1. 确认跟踪,结构体数组,其中包含一个变量数量的跟踪。

  2. 数量的痕迹——一个整数标量。

  3. 跟踪处理当前更新的信息。

通过重组这样的代码,您可以重用相同的显示工具中使用ATC的例子。这些工具仍然在MATLAB中运行,不需要代码生成。

%如果定义之前的追踪,清晰。清晰的tracker_kernel%与雷达和平台创建ATC的场景。(场景、塔、雷达)= helperCreateATCScenario;%创建一个显示显示真实的测量和跟踪的位置%客机。(戏剧、无花果)= helperTrackerCGExample (“创建显示”、场景);helperTrackerCGExample (“显示更新”、戏剧、场景、塔);

现在运行示例通过调用tracker_kernel在MATLAB函数。这个初始运行提供一个基线比较结果和使您能够收集一些关于跟踪器的性能指标在MATLAB运行时文件或墨西哥人。

模拟和跟踪飞机

下面的循环发展平台的位置,直到结束的场景。每一步的场景中,雷达探测来自目标的视野。更新追踪这些探测雷达后完成了一个360度扫描方位。

%设置模拟雷达的发展更新的速度。场景。UpdateRate = radar.UpdateRate;%创建一个缓冲区来收集的全扫描雷达的探测。scanBuffer = {};%初始化跟踪数组。跟踪= [];%设置随机种子可重复的结果。rng (2020)%的数量分配内存跟踪在MATLAB和时间测量。numSteps = 12;numSteps numTracks = 0 (1);运行时= 0 (1、numSteps);指数= 0;推进(场景)& & ishghandle(图)%生成检测目标在雷达领域当前的视图中。[引爆器,配置]=检测(场景);scanBuffer = (scanBuffer;依据);% #好< AGROW >允许缓冲增长。%更新追踪360度扫描完成时。如果config.IsScanDone%更新追踪指数=指数+ 1;抽搐(追踪,numTracks(指数),信息]= tracker_kernel (scanBuffer scenario.SimulationTime);运行时(指数)= toc;%收集MATLAB运行时数据%清晰扫描缓冲区下扫描。scanBuffer = {};结束%更新显示与当前梁位置,缓冲检测%的轨道位置。helperTrackerCGExample (“显示更新”、戏剧、场景、塔、scanBuffer跟踪);结束

编译成一个墨西哥人文件的MATLAB函数

使用codegen函数编译tracker_kernel到一个墨西哥人文件的函数。您可以指定报告选项来生成一个编译报告显示原始的MATLAB代码和相关的文件中创建C代码生成。考虑创建一个临时目录,MATLAB编码器可以存储生成的文件。注意,除非你使用- o选项指定可执行文件的名称,生成的墨西哥人文件具有相同的名称作为原始MATLAB文件_mex附加。

MATLAB编码器要求您指定属性的所有输入参数。使用的输入跟踪创建正确的数据类型和大小的对象使用的跟踪。的数据类型和数据帧之间的尺寸不能改变。一个简单的方法是定义输入属性的示例在命令行中使用arg游戏选择。有关更多信息,请参见输入规格(MATLAB编码器)

%定义输入的属性。首先定义检测缓冲区%可变大小单元阵列包含objectDetection对象。然后%将第二个参数定义为simTime,这是一个标量的两倍。侦破= coder.typeof (scanBuffer (1), (inf 1], [1 0]);compInputs ={侦破scenario.SimulationTime};%的代码生成可能还需要一段时间。h =对话框({“生成代码。这可能需要几分钟……”;“这消息框完成后将关闭。”},“Codegen消息”);%生成代码。试一试codegentracker_kernelarg游戏compInputs;关闭(h)我关闭(h)把(我)结束
代码生成成功。

运行生成的代码

现在已经生成的代码,运行与生成的墨西哥人文件相同的场景tracker_kernel_mex。其他是相同的。

%如果定义之前的追踪,清晰。清晰的tracker_kernel_mex%的数量分配内存跟踪和测量时间numSteps numTracksMex = 0 (1);numSteps runTimesMex = 0 (1);%重置场景中,数据计数器,策划者,scanBuffer,跟踪和提高。指数= 0;重启(场景)scanBuffer = {};clearPlotterData(戏剧);跟踪= [];rng (2020)推进(场景)& & ishghandle(图)%生成检测目标在雷达领域当前的视图中。[引爆器,配置]=检测(场景);scanBuffer = (scanBuffer;依据);% #好< AGROW >允许缓冲增长。%更新追踪360度扫描完成时。如果config.IsScanDone%更新追踪。指数=指数+ 1;抽搐(追踪,numTracksMex(指数),信息]= tracker_kernel_mex (scanBuffer scenario.SimulationTime);runTimesMex(指数)= toc;%收集墨西哥人运行时数据%清晰扫描缓冲区下扫描。scanBuffer = {};结束%更新显示与当前梁位置,缓冲检测%的轨道位置。helperTrackerCGExample (“显示更新”、戏剧、场景、塔、scanBuffer跟踪);结束

比较两个运行的结果

比较结果和生成的代码的性能与MATLAB代码。下面的情节比较的数量在每个时间步跟踪维护的追踪器。他们也显示了处理的时间每个调用的功能。

图(2)次要情节(2,1,1)情节(2:numSteps, numTracks (2: numSteps),的:“2:numSteps numTracksMex (2: numSteps),“x”。)标题(“每一步的歌曲数量”);传奇(MATLAB的,墨西哥人的)网格次要情节(2,1,2)情节(2:numSteps, runTimesMex (2: numSteps) * 1 e3);标题(“墨西哥人处理时间每一步”)网格包含(“时间步”)ylabel (“墨西哥人处理时间(女士)”)

情节顶部显示的跟踪数量由每一个跟踪器是相同的。这措施跟踪的大小问题的跟踪。即使有3确认跟踪整个跟踪示例中,所有的总数跟踪维护的追踪不同数量的基础上试探性的痕迹,这是由错误的检测。

底部图显示了生成的代码所需的时间函数来处理每一个步骤。被排除在阴谋的第一步,因为它需要一个不成比例的时间来实例化所有的歌曲的第一步。

结果显示的毫秒数墨西哥人所需的代码来执行每个更新步骤在您的计算机上。在这个例子中,墨西哥人代码所需的时间来运行一个更新步骤是用几毫秒。

总结

这个例子展示了如何从MATLAB代码生成C代码传感器融合和跟踪。

自动代码生成的主要好处是原型的能力在MATLAB环境中,并生成一个墨西哥人文件,可以在MATLAB环境中运行。生成的C代码可以部署到目标。在大多数情况下,生成的代码的速度比MATLAB代码,并且可以用于批量测试算法和生成实时跟踪系统。