主要内容

跟踪和传感器融合的代码生成

这个例子展示了如何生成一个MATLAB®函数的C代码,该函数处理从测试车辆记录的数据,并跟踪它周围的对象。

从MATLAB代码自动生成代码有两个关键的好处:

  1. 原型可以在MATLAB环境中开发和调试。一旦MATLAB工作完成,自动生成C代码使算法可部署到各种目标。此外,还可以使用原型阶段可用的可视化和分析工具,在MATLAB环境中运行已编译的MEX文件,从而进一步测试C代码。

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

该示例说明了如何修改MATLAB代码使用传感器融合向前碰撞警告示例以支持代码生成。万博1manbetx

此示例需要MATLAB®Coder™许可证来生成C代码。

修改并运行MATLAB代码

您可以了解使用MATLAB Coder生成代码的基础知识引入特征匹配和注册的代码生成例子。

为了生成C代码,MATLAB Coder要求MATLAB代码以函数形式存在。此外,函数的参数不能是MATLAB类。

在本例中,前向碰撞警告(FCW)示例的代码已被重新构造,以便执行传感器融合和跟踪的函数驻留在一个单独的文件中,称为trackingForFCW_kernel.m.查看此文件,了解关于代码生成所需的内存分配的重要信息。

来维持这个国家multiObjectTracker之间的调用trackingForFCW_kernel.m,跟踪器定义为持续的变量。

此函数作为输入的输入帧,其中包括:

  1. 视觉物体 - a结构体包含10个视觉对象。

  2. 雷达目标- A结构体包含36个雷达对象。

  3. 惯性测量- A结构体包含速度和横摆率。

  4. 车道报告 - a结构体数组的参数为左和右车道边界。

类似地,支持代码生成的函数的输出不能是对象。万博1manbetx的输出trackingForFCW_kernel.m是:

  1. 确认轨道- A结构体数组,其中包含数量可变的轨道。

  2. 自我巷 - 一个结构体带有左、右车道边界参数的数组。

  3. 轨道数-一个整数标量。

  4. FCW逻辑中关于最重要对象(MIO)和警告级别的信息。

通过以这种方式重构代码,您可以重用FCW示例中使用的相同的显示工具。这些工具仍然可以在MATLAB中运行,并且不需要代码生成。

运行以下代码行以类似于FCW示例的方式加载记录的数据并准备显示。

%如果定义了以前的跟踪器,清除它清除trackingForFCW_kernel%设置显示VideoFile =.“01 _city_c2s_fcw_10s.mp4”;sensorconfigfile =“SensorConfigurationData.mat”;[videoReader, videoDisplayHandle, bepplotter,sensor] = helperCreateFCWDemoDisplay(videoFile,sensorConfigFile);%读取记录的检测文件detfile =“01 _city_c2s_fcw_10s_sensor.mat”;[visionObjects, radarObjects, imu, lanes, timeStep, numSteps] = helperReadSensorRecordingsFile(detfile);%计算初始自我通道。如果记录的车道信息为无效,将车道边界定义为半车道的直线汽车每侧的距离。Lanewidth = 3.6;%米egoLane =结构('剩下',[0 0 LaneWidth / 2],'对', [0 0 -laneWidth/2]);%准备一些时间变量时间戳= 0;%记录开始后的时间指数= 0;索引到记录的传感器数据%定义位置和速度选择器:%状态矢量为恒加速度:[x;vx;ax;y;vy;ay]%恒加速度位置:[x;y] = [1 0 0 0 0;0 0 0 1 0 0positionSelector = [1 0 0 0 0;0 0 0 1 0 0];%恒加速度速度:[x;y] = [0 1 0 0 0 0;0 0 0 1 0] * StatevelocitySelector = [0 1 0 0 0;0 0 0 1 0];

现在通过调用来运行该示例trackingForFCW_kernel在MATLAB函数。这个初始运行提供了比较结果的基线,并使您能够收集跟踪器在MATLAB中或作为MEX文件运行时的性能指标。

%在MATLAB中分配内存用于轨道数和时间测量numTracks = 0 (1, numSteps);runTimes = 0 (1, numSteps);尽管索引%更新场景计数器Index = Index + 1;timeStamp = timeStamp + timeStep;抽搐;%调用matlab跟踪内核文件以执行跟踪[track, egoLane, numTracks(index), mostImportantObject] = trackingForFCW_kernel(...visionObjects(index), radarObjects(index), imu(index), lanes(index), egoLane, timeStamp, positionSelector, velocitySelector);运行时(指数)= toc;%收集MATLAB运行时间数据%更新视频和鸟瞰图显示帧= readFrame (videoReader);%读取视频帧laneBoundaries = [parabolicLaneBoundary (egoLane.left); parabolicLaneBoundary (egoLane.right)];helperUpdateFCWDemoDisplay(frame, videoDisplayHandle, bepplotter, laneBoundaries, sensor,...轨道,mostImportantObject,位置选择器,速度选择器,visionObjects(索引),radarObjects(索引));结束

将MATLAB函数编译为MEX文件

使用codegen函数编译trackingForFCW_kernel函数转换为一个MEX文件。您可以指定-报告选项生成编译报告,其中显示在C代码生成期间创建的原始MATLAB代码和相关文件。考虑创建一个临时目录,MATLAB Coder可以在其中存储生成的文件。注意,除非你使用-O选项指定可执行文件的名称,则生成的MEX文件与原始的MATLAB文件具有相同的名称_mex附加。

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

%根据第一个时间帧的数据定义输入的属性。compInputs = {visionObjects(1), radarObjects(1), imu(1), lanes(1), egoLane, timeStamp, positionSelector, velocitySelector};%代码生成可能需要一些时间。h =对话框({“生成代码。这可能需要几分钟……”完成后此消息框将关闭。},“Codegen消息”);%生成代码。尝试codegentrackingForFCW_kernelarg游戏compinputs.;关闭(h)我关闭(h)删除(videodisplayhandle.parent.parent)掷(me)结束
代码生成成功。

运行生成的代码

现在代码已经生成,使用生成的MEX文件运行完全相同的场景trackingforfcw_kernel_mex..其他一切都保持不变。

%如果定义了以前的跟踪器,清除它清除trackingforfcw_kernel_mex.%分配内存用于轨道数量和时间度量numTracksMex = 0 (1, numSteps);runTimesMex = zeros(1, numSteps); / /输出%重新设置数据和视频计数器指数= 0;videoReader。CurrentTime = 0;尽管索引%更新场景计数器Index = Index + 1;timeStamp = timeStamp + timeStep;抽搐;%调用生成的MEX文件来执行跟踪[track, egoLane, numTracksMex(index), mostImportantObject] = trackingForFCW_kernel_mex(...visionObjects(index), radarObjects(index), imu(index), lanes(index), egoLane, timeStamp, positionSelector, velocitySelector);runTimesMex(指数)= toc;%收集MEX运行时数据%更新视频和鸟瞰图显示帧= readFrame (videoReader);%读取视频帧laneBoundaries = [parabolicLaneBoundary (egoLane.left); parabolicLaneBoundary (egoLane.right)];helperUpdateFCWDemoDisplay(frame, videoDisplayHandle, bepplotter, laneBoundaries, sensor,...轨道,mostImportantObject,位置选择器,速度选择器,visionObjects(索引),radarObjects(索引));结束

比较两次运行的结果

比较生成代码与MATLAB代码的结果和性能。下面的图比较了跟踪器在每个时间步骤中维护的轨迹数量。它们还显示了处理每个函数调用所花费的时间。

图(2)子图(2,1,1)绘图(2:numsteps,numtracks(2:结束),“rs -”2: numSteps numTracksMex(2:结束),“bx - - - - - -”) 标题('每个步骤的曲目数量');传奇('matlab'墨西哥人的)网格子图(2,1,2)yyaxisplot(2:numsteps,runtimesmex(2:结束)* 1e3);ylabel('MEX处理时间(MS)');yyaxis正确的/ runTimesMex(2:end) ./ runTimesMex(2:end) ylabel('加速比率');标题('MEX处理时间和加速比例在每个步骤')网格包含(“时间步”

上面的图显示了每个跟踪器所维护的轨迹数量是相同的。它用轨迹的数量来衡量跟踪问题的大小。

下图显示了MATLAB和生成的代码函数处理每个步骤所需的时间。注意,第一步需要更长的时间,因为跟踪器必须在第一步中构造。因此,第一次步骤被忽略。

结果表明MEX代码比MATLAB代码快得多。它们还显示MEX代码所需的毫秒数以在计算机上执行每个更新步骤。例如,在CPU时钟速度为2.6 GHz运行Windows®7的计算机上,MEX代码运行更新步骤所需的时间小于4毫秒。作为参考,每50毫秒采样在此示例中使用的记录数据,因此MEX运行时间足够短以允许实时跟踪。

显示CPU时钟速度和平均加速比。

p =概要文件('信息');speedupratio =均值(runtimes(2:结束)./ runtimesmex(2:结束));disp (['生成的代码是'num2str (speedUpRatio),'比matlab代码快。']);disp ([计算机时钟速度是num2str (p。/ 1 e9以及构建软件所依据),GHz。]);
生成的代码比MATLAB代码快25.443倍。计算机时钟速度为3.6 GHz。

概括

此示例显示了如何从Matlab代码生成C代码以进行传感器融合和跟踪。

自动代码生成的主要好处是能够在MATLAB环境中实现原型,生成可以在MATLAB环境中运行的MEX文件,并使用C代码将其部署到目标。在大多数情况下,生成的代码比MATLAB代码更快,可以用于算法的批量测试和生成实时跟踪系统。

另请参阅

相关话题