主要内容

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

此示例显示如何为MATLAB®函数生成C代码,该函数处理从测试车辆记录的数据并跟踪车辆周围的对象。

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

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

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

示例说明如何修改的MATLAB代码使用传感器融合的前向碰撞预警支持代码生成的示例。金宝app

这个例子需要MATLAB®Coder™许可证来生成C代码。

修改并运行MATLAB代码

您可以从中了解使用MATLAB编码器生成代码的基础知识基于特征匹配和配准的代码生成简介的例子。

为了生成C代码,MATLAB编码器要求MATLAB代码采用函数的形式。此外,函数的参数不能是MATLAB类。

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

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

该函数将记录的数据帧作为输入,其中包括:

  1. 视觉物体- A结构包含10个视觉物体。

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

  3. 惯性测量-A结构包含速度和偏航率。

  4. Lane报道- A结构数组的参数为左和右车道边界。

类似地,支持代码生成的函数的输出不能是对象金宝apptrackingForFCW_kernel.m是:

  1. 确认轨道-A结构包含可变数量磁道的数组。

  2. 自我通道- A结构具有左右车道边界参数的数组。

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

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

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

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

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

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

%在MATLAB中分配内存用于轨道数和时间测量numtrack=零(1,numSteps);运行时=零(1,numSteps);索引< numSteps && ishhandle (videoDisplayHandle)%更新方案计数器Index = Index + 1;timeStamp = timeStamp + timeStep;抽搐;%调用MATLAB跟踪内核文件执行跟踪[tracks,egoLane,numtrack(index),mostImportantObject]=FCW_内核的跟踪(...visionObjects(索引)、radarObjects(索引)、imu(索引)、lanes(索引)、eGrane、时间戳、位置选择器、速度选择器);运行时(索引)=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文件。您可以指定报告选项生成一个编译报告,显示原始的Matlab代码和在C代码生成期间创建的相关文件。考虑创建一个临时目录,其中Matlab编码器可以存储生成的文件。- o选项指定可执行文件的名称,则生成的MEX文件与原始的MATLAB文件具有相同的名称_墨西哥附加。

MATLAB编码器要求您指定所有输入参数的属性。跟踪器使用输入为跟踪中使用的对象创建正确的数据类型和大小。数据帧之间的数据类型和大小不能改变。的示例在命令行中定义输入属性是一种简单的方法arg游戏选项。有关详细信息,请参阅在命令行通过示例定义输入属性(MATLAB编码器)

%基于第一个时间帧中的数据定义输入的属性。compInputs = {visionObjects(1), radarObjects(1), imu(1), lanes(1), egoLane, timeStamp, positionSelector, velocitySelector};代码生成可能需要一些时间。h=msgbox({'正在生成代码。这可能需要几分钟时间…''完成后,此消息框将关闭。'},“Codegen消息”);%生成代码。试一试codegentrackingForFCW_kernelarg游戏compInputs; 关闭(h)接住删除(videoDisplayHandle.Parent.Parent) throw(ME)终止
代码生成成功。

运行生成的代码

现在代码已经生成,使用生成的MEX文件运行完全相同的场景trackingForFCW_kernel_mex. 其他一切都是一样的。

%如果定义了以前的跟踪器,清除它清晰的trackingForFCW_kernel_mex%分配内存用于轨道数量和时间度量numTracksMex=零(1,numSteps);runTimesMex=0(1,numSteps);%重新设置数据和视频计数器指数= 0;videoReader。CurrentTime = 0;索引< numSteps && ishhandle (videoDisplayHandle)%更新方案计数器Index = Index + 1;timeStamp = timeStamp + timeStep;抽搐;%调用生成的MEX文件以执行跟踪[tracks,eGrane,numTracksMex(索引),mostImportantObject]=FCW_kernel_mex的跟踪(...visionObjects(索引)、radarObjects(索引)、imu(索引)、lanes(索引)、eGrane、时间戳、位置选择器、速度选择器);runTimesMex(索引)=toc;%收集MEX运行时数据%更新视频和鸟瞰图显示帧= readFrame (videoReader);%读取视频帧laneBoundaries = [parabolicLaneBoundary (egoLane.left); parabolicLaneBoundary (egoLane.right)];helperUpdateFCWDemoDisplay(frame, videoDisplayHandle, bepplotter, laneBoundaries, sensor,...轨道,mostImportantObject,位置选择器,速度选择器,visionObjects(索引),radarObjects(索引));终止

比较两次运行的结果

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

图(2)subplot(2,1,1) plot(2:numSteps, numTracks(2:end),“rs -”2: numSteps numTracksMex(2:结束),“bx-”)标题(“每一步的轨道数”);传奇(MATLAB的“墨西哥”)网格子图(2,1,2)yyaxis图(2:numSteps runTimesMex(2:结束)* 1 e3);ylabel (“MEX处理时间(毫秒)”);yyaxis正确的/ runTimesMex(2:end) ./ runTimesMex(2:end) ylabel(加速比的);标题(“MEX处理时间和每一步加速比”)网格包含(“时间步长”

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

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

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

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

p=外形(“信息”);speedUpRatio = mean(runTimes(2:end) ./ runTimesMex(2:end));disp (['生成的代码是'num2str (speedUpRatio),比MATLAB代码快很多倍]); disp(['计算机时钟速度为',num2str(p.ClockSpeed/1e9),GHz。]);
生成的代码比MATLAB代码快25.443倍,计算机时钟速度为3.6ghz。

总结

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

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

另见

相关的话题