主要内容

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

这个例子展示了如何为一个MATLAB®函数生成C代码记录处理数据从测试车辆和轨道的对象。

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

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

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

这个例子解释了MATLAB代码如何修改向前碰撞警告使用传感器融合例子来支持代码生成。金宝app

这个例子需要MATLAB®编码器™许可生成C代码。

修改和运行MATLAB代码

你可以学习基本的代码生成使用MATLAB的编码器介绍代码生成功能匹配和登记的例子。

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

在这个例子中,向前碰撞警告的代码例子(结合)已经被重组,这样的函数执行传感器融合和跟踪驻留在一个单独的文件,trackingForFCW_kernel.m。审查这个文件为代码生成关于内存分配的重要信息。

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

这个函数作为输入一帧记录的数据包括:

  1. 视觉对象——一个结构体包含10视觉对象。

  2. 雷达对象——一个结构体包含36个雷达对象。

  3. 惯性测量,结构体包含速度和角速度。

  4. 车道的报道——一个结构体数组参数左和右车道边界。

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

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

  2. 自我巷,结构体数组参数的左和右车道边界。

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

  4. 最重要的信息对象(绪)和警告级别从结合逻辑。

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

运行下面的代码行来加载记录数据和准备显示以类似的方式结合的例子。

%如果定义之前的追踪,清晰清晰的trackingForFCW_kernel%设置显示videoFile =“01 _city_c2s_fcw_10s.mp4”;sensorConfigFile =“SensorConfigurationData.mat”;[videoReader, videoDisplayHandle bepPlotters、传感器]= helperCreateFCWDemoDisplay (videoFile sensorConfigFile);%读取记录检测文件detfile =“01 _city_c2s_fcw_10s_sensor.mat”;[visionObjects radarObjects, imu,车道,步伐,numSteps] = helperReadSensorRecordingsFile (detfile);%计算初始自我巷。如果车道信息记录%无效,车道边界定义为直线半个车道%距离两边的车。巷宽= 3.6;%米egoLane =结构(“左”(0 0巷宽/ 2),“对”,0 0巷宽/ 2);%准备一些时间变量时间戳= 0;%的开始记录以来指数= 0;%指数记录传感器数据%定义的位置和速度选择器:%的状态向量是恒定加速度:[x, vx;斧子;y v,唉)%加速度恒定位置:(x, y) = (1 0 0 0 0 0;0 0 0 1 0 0]*状态positionSelector = [1 0 0 0 0 0;0 0 0 1 0 0);%加速度恒定速度:[x, y] = [0 1 0 0 0 0;0 0 0 0 1 0]*状态velocitySelector = [0 1 0 0 0 0;0 0 0 0 0 1);

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

%的数量分配内存跟踪在MATLAB和时间测量numSteps numTracks = 0 (1);运行时= 0 (1、numSteps);指数< numSteps & & ishghandle (videoDisplayHandle)%更新场景计数器指数=指数+ 1;时间戳=时间+步伐;抽搐;%调用MATLAB跟踪内核文件执行跟踪(跟踪、egoLane numTracks(指数),mostImportantObject] = trackingForFCW_kernel (visionObjects(指数),radarObjects(指数),imu(指数),车道(指数),egoLane、时间戳、positionSelector, velocitySelector);运行时(指数)= toc;%收集MATLAB运行时数据%更新显示视频和鸟瞰的阴谋帧= readFrame (videoReader);%读视频帧laneBoundaries = [parabolicLaneBoundary (egoLane.left); parabolicLaneBoundary (egoLane.right)];helperUpdateFCWDemoDisplay(框架、videoDisplayHandle bepPlotters laneBoundaries,传感器,跟踪、mostImportantObject positionSelector、velocitySelector visionObjects(指数),radarObjects(指数));结束

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

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

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

%定义的属性输入基于第一次的数据帧。compInputs = {visionObjects (1) radarObjects (1), imu(1)道(1),egoLane、时间戳、positionSelector, velocitySelector};%的代码生成可能还需要一段时间。h =对话框({“生成代码。这可能需要几分钟……”;“这消息框完成后将关闭。”},“Codegen消息”);%生成代码。试一试codegentrackingForFCW_kernelarg游戏compInputs;关闭(h)我关闭(h)删除(videoDisplayHandle.Parent.Parent)把(我)结束
代码生成成功。

运行生成的代码

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

%如果定义之前的追踪,清晰清晰的trackingForFCW_kernel_mex%的数量分配内存跟踪和测量时间numSteps numTracksMex = 0 (1);numSteps runTimesMex = 0 (1);%重置数据和视频计数器指数= 0;videoReader。CurrentTime = 0;指数< numSteps & & ishghandle (videoDisplayHandle)%更新场景计数器指数=指数+ 1;时间戳=时间+步伐;抽搐;%调用生成的墨西哥人文件来执行跟踪(跟踪、egoLane numTracksMex(指数),mostImportantObject] = trackingForFCW_kernel_mex (visionObjects(指数),radarObjects(指数),imu(指数),车道(指数),egoLane、时间戳、positionSelector, velocitySelector);runTimesMex(指数)= toc;%收集墨西哥人运行时数据%更新显示视频和鸟瞰的阴谋帧= readFrame (videoReader);%读视频帧laneBoundaries = [parabolicLaneBoundary (egoLane.left); parabolicLaneBoundary (egoLane.right)];helperUpdateFCWDemoDisplay(框架、videoDisplayHandle bepPlotters laneBoundaries,传感器,跟踪、mostImportantObject positionSelector、velocitySelector visionObjects(指数),radarObjects(指数));结束

比较两个运行的结果

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

图(2)次要情节(2,1,1)情节(2:numSteps, numTracks(2:结束),“rs -”2:numSteps numTracksMex(2:结束),“bx - - - - - -”)标题(“每一步的歌曲数量”);传奇(MATLAB的,墨西哥人的)网格次要情节yyaxis (2, 1, 2)图(2:numSteps runTimesMex(2:结束)* 1 e3);ylabel (“墨西哥人处理时间(ms)”);yyaxis正确的图(2:numSteps,运行时(2:结束)。/ runTimesMex(2:结束)ylabel (加速比的);标题(“墨西哥人每一步处理时间和加速比的)网格包含(“时间步”)

情节顶部显示的跟踪数量由每一个跟踪器是相同的。这措施跟踪的大小问题的跟踪。

底部图显示了MATLAB和生成的代码所需的时间函数来处理每一个步骤。注意,第一步需要一个不成比例的时间,因为追踪器必须建造在第一步。因此,第一次步骤被忽略。

结果表明,墨西哥人代码MATLAB代码要快得多。他们也显示的毫秒数所需的墨西哥人代码来执行每个更新步骤在您的计算机上。例如,在电脑上2.6 GHz CPU时钟速度的运行Windows®7日,墨西哥人代码所需的时间运行一个更新步骤是少于4 ms。作为参考,在本例中使用的记录数据采样每50毫秒,墨西哥人运行时是足够短,允许实时跟踪。

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

p =概要文件(“信息”);speedUpRatio =意味着(运行时(2:结束)。/ runTimesMex(2:结束);disp ([生成的代码的num2str (speedUpRatio),“倍MATLAB代码”。]);disp ([“计算机时钟速度”num2str (p。/ 1 e9以及构建软件所依据),GHz。]);
生成的代码是25.443倍MATLAB代码。计算机时钟速度是3.6 GHz。

总结

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

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

另请参阅

相关的话题