主要内容

汽车安全应用程序进行航迹融合

这个例子展示了如何从两辆车跟踪融合环境提供一个更全面的估计比可以看到每辆车。示例演示了使用track-level熔化炉和对象跟踪数据格式。在本例中,您使用自动驾驶的驾驶场景和视觉检测发电机工具箱™,雷达的雷达数据发生器工具箱™,从传感器融合和追踪和跟踪融合模型和跟踪工具箱™。

动机

汽车安全的应用程序依赖于来自不同传感器的数据融合系统安装在车辆。个人车辆融合传感器检测通过使用一个集中的跟踪或采取更分散的方法和融合跟踪由单独的传感器。除了intravehicle数据融合,融合的数据来自多个车辆提供额外的好处,包括更好的覆盖、态势感知和安全[1]。这种车辆间传感器融合方法的利用各种传感器,并提供更好的覆盖每辆车,因为它使用传感器对其他车辆更新的数据。各国政府和汽车制造商早就认识到需要在车辆之间共享信息,以提高汽车安全。例如,V2X协议和蜂窝通信链接正在开发中。

虽然传感器融合多个车辆是有益的,但大多数车辆必须符合一定的安全要求,即使只有内部传感器是可用的。因此,车辆可能会配备一个追踪,追踪熔化炉,或两者兼而有之。这些跟踪算法在单一车辆提供态势感知水平。结果,假设在这个例子中是,汽车共享态势感知通过广播进行航迹融合跟踪和执行。

这个例子演示了融合跟踪从两辆车的好处来增强态势感知和安全。这个例子不模拟通信系统。相反,这个示例假定一个通信系统提供的传输所需要的带宽两辆车之间的追踪。

进行航迹架构

下面的框图描述了主要功能在两辆车,地点:

  • 每个提供车辆1有两个传感器,检测本地车辆跟踪。跟踪器使用本地传感器跟踪对象的检测和输出这些地方跟踪车辆跟踪熔化炉。

  • 车辆2有一个传感器,这是一个跟踪雷达。跟踪雷达输出跟踪,作为当地追踪车辆2。跟踪雷达的跟踪输入的车辆跟踪车辆熔化炉2。

  • 跟踪每辆车熔化炉融合当地的车辆跟踪和追踪收到其他车辆的跟踪熔化炉。每次更新后,跟踪每个车辆广播其熔化炉融合,给力的下一个更新跟踪熔化炉在其他车辆上。

V2VFusion.png

在本例中,您使用一个trackerJPDA(传感器融合和跟踪工具箱)对象定义车辆1追踪。

%创建追踪车辆1v1Tracker = trackerJPDA (“TrackerIndex”,1“DeletionThreshold”(4 - 4),“AssignmentThreshold”,100年正);% 1车辆跟踪posSelector = [1 0 0 0 0 0;0 0 1 0 0 0);

在此体系结构中,融合跟踪从一个车辆更新其他车辆上的融合跟踪。这些融合跟踪广播回到第一车。为了避免谣言传播,小心追踪如何从另一个车辆更新跟踪熔化炉。

考虑下面的谣言传播的例子:在一些更新步骤中,车辆1使用其内部传感器跟踪一个物体。车辆1然后融合对象跟踪并将其传输到车辆2,现在融合跟踪有自己的轨道,成为意识到对象。到目前为止,这正是进行航迹融合的目标:提高态势感知车辆2与车辆信息1。因为车辆2现在知道对象,它开始广播追踪,也许是另一辆车的好处(在这个例子中没有显示)。

然而,现在车辆1收到跟踪信息从车辆2实际上只有1车辆跟踪的对象。所以,跟踪车辆1熔化炉必须意识到这个对象的跟踪就从车辆2实际上不包含任何新信息更新由一个独立的来源。区分歌曲包含新的信息和跟踪,只是重复信息,您必须定义车辆2作为一个外部来源车辆跟踪熔化炉的1。同样,车辆1必须被定义为外部源跟踪车辆熔化炉2。此外,你只需要定义轨迹跟踪更新的基于信息从一个内部源的熔化炉自我报告的。通过这样做,每个车辆的跟踪熔化炉忽略更新追踪之间来回反射跟踪熔化炉没有任何新的信息。

每辆车的地方跟踪器跟踪对象相对于参考系,叫做自我框架。进行航迹融合是在场景中完成的框架,即全局级别的框架。助手egoToScenario函数转换跟踪从自我帧场景框架。同样地,函数scenarioToEgo从场景坐标系转换跟踪任何自我的框架。这两个转换依赖StateParameters财产的objectTrack(传感器融合和跟踪工具箱)对象。当trackFuser对象计算的距离中心跟踪场景框架本地跟踪框架,它使用StateParameters当地的跟踪执行坐标变换。

实现前面所描述的trackFuser作为一个定义,定义以下来源fuserSourceConfiguration(传感器融合和跟踪工具箱)对象。

%定义每个车辆来源v1TrackerConfiguration = fuserSourceConfiguration (“SourceIndex”,1“IsInternalSource”,真的,% v1Tracker v1Fuser内部“CentralToLocalTransformFcn”@scenarioToEgo,“LocalToCentralTransformFcn”,@egoToScenario);%坐标变换v2FuserConfiguration = fuserSourceConfiguration (“SourceIndex”4“IsInternalSource”、假);% v2Fuser v2Fuser外部v1Sources = {v1TrackerConfiguration;v2FuserConfiguration};v2TrackerConfiguration = fuserSourceConfiguration (“SourceIndex”2,“IsInternalSource”,真的,% v2Tracker v2Fuser内部“CentralToLocalTransformFcn”@scenarioToEgo,“LocalToCentralTransformFcn”,@egoToScenario);%坐标变换v1FuserConfiguration = fuserSourceConfiguration (“SourceIndex”3,“IsInternalSource”、假);% v1Fuser v2Fuser外部v2Sources = {v2TrackerConfiguration;v1FuserConfiguration};

现在,您可以定义每个车辆跟踪熔化炉trackFuser(传感器融合和跟踪工具箱)对象。

stateParams =结构(“帧”,“矩形”,“位置”(0 0 0),“速度”,0 0 0);v1Fuser = trackFuser (“FuserIndex”3,“AssignmentThreshold”,100年正无穷,“MaxNumSources”2,“SourceConfigurations”v1Sources,“StateFusion”,“十字路口”,“DeletionThreshold”3 [3],“StateParameters”,stateParams);v2Fuser = trackFuser (“FuserIndex”4“AssignmentThreshold”,100年正无穷,“MaxNumSources”2,“SourceConfigurations”v2Sources,“StateFusion”,“十字路口”,“DeletionThreshold”3 [3],“StateParameters”,stateParams);%初始化变量fusedTracks1 = objectTrack.empty (0,1);fusedTracks2 = objectTrack.empty (0,1);wasFuser1Updated = false;wasFuser2Updated = false;

定义场景

下面的场景展示了两个车辆行驶街道。车辆1是导致车辆配备了两个前瞻性传感器:短程雷达传感器和视觉传感器。车辆2,推动10米车辆1,配有远程雷达。街的右边包含停放车辆。一个行人站之间的车辆。这行人显示为一个点在X = 60米左右。

由于车辆2和车辆之间的短距离1,大多数车辆2雷达传感器覆盖阻挡车辆1。因此,大多数的跟踪跟踪车辆2保持熔化炉首先初始化跟踪广播从车辆1。

%创建drivingScenario对象和两辆车[场景、vehicle1 vehicle2] = createDrivingScenario;%创建所有的传感器(传感器、numSensors attachedVehicle) = createSensors(场景);%创建显示[f,策划者]= createV2VDisplay(场景、传感器、attachedVehicle);

以下追逐情节从的角度看第二辆车。箭头指示的位置几乎完全闭塞的行人停车辆和车辆。

TrackToTrackChasePlot.png

%定义每个车辆作为一个演员的组合,传感器,一个追踪者、策划者v1 =结构(“演员”{vehicle1},“传感器”,{传感器(attachedVehicle = = 1)},“追踪”{v1Tracker},“DetPlotter”{plotters.veh1DetPlotter},“TrkPlotter”,{plotters.veh1TrkPlotter});v2 =结构(“演员”{vehicle2},“传感器”,{传感器(attachedVehicle = = 2)},“追踪”{{}},“DetPlotter”{{}},“TrkPlotter”,{plotters.veh2TrkPlotter});%没有检测或跟踪车辆2

运行仿真

下面的代码运行仿真。

运行= true;%的可重复的结果,设置随机数种子s =提高;rng (2019) snaptimes =(0.5, 2.8, 4.4, 6.3,正);照片=细胞(元素个数(snaptimes 1));i = 1;f。可见=“上”;运行& & ishghandle (f)时间= scenario.SimulationTime;%的探测和跟踪车辆的水平[tracks1, wasTracker1Updated] = detectAndTrack (v1、时间posSelector);[tracks2, wasTracker2Updated] = detectAndTrack (v2、时间posSelector);从先前的熔化炉更新%保持跟踪oldFusedTracks1 = fusedTracks1;oldFusedTracks2 = fusedTracks2;%更新熔化炉如果wasTracker1Updated | | wasFuser2Updated tracksToFuse1 = [tracks1; oldFusedTracks2];如果isLocked (v1Fuser) | | ~ isempty (tracksToFuse1) [fusedTracks1, ~, ~, info1] = v1Fuser (tracksToFuse1、时间);wasFuser1Updated = true;pos = getTrackPositions (fusedTracks1 posSelector);字符串id = ((fusedTracks1.TrackID) ');plotTrack (plotters.veh1FusePlotter、pos、ids);其他的wasFuser1Updated = false;fusedTracks1 = objectTrack.empty (0,1);结束其他的wasFuser1Updated = false;fusedTracks1 = objectTrack.empty (0,1);结束如果wasTracker2Updated | | wasFuser1Updated tracksToFuse2 = [tracks2; oldFusedTracks1];如果isLocked (v2Fuser) | | ~ isempty (tracksToFuse2) [fusedTracks2, ~, ~, info2] = v2Fuser (tracksToFuse2、时间);wasFuser2Updated = true;pos = getTrackPositions (fusedTracks2 posSelector);字符串id = ((fusedTracks2.TrackID) ');plotTrack (plotters.veh2FusePlotter、pos、ids);其他的wasFuser2Updated = false;fusedTracks2 = objectTrack.empty (0,1);结束其他的wasFuser2Updated = false;fusedTracks2 = objectTrack.empty (0,1);结束%更新显示updateV2VDisplay(策划者、场景、传感器、attachedVehicle)%的场景一次一步,如果场景完成退出循环运行=进步(场景);%捕获在指定的时间框架的一个图像如果时间> = snaptimes (i)拍摄{我}= takesnap (f);我=我+ 1;结束结束

图包含2轴uipanel类型的对象和其他对象。坐标轴对象1包含X (m), ylabel Y (m)包含11块类型的对象,线,文本。一个或多个行显示的值只使用这些对象标记代表雷达、视觉,检测,当地的追踪,熔化炉的踪迹。坐标轴对象2包含X (m), ylabel Y (m)包含8块类型的对象,线,文本。一个或多个行显示的值只使用这些对象标记代表雷达,当地的追踪,熔化炉的踪迹。

图中显示的场景和跟踪结果结束时的场景。后续部分的这个例子分析在关键时刻跟踪结果。

在仿真开始分析跟踪

仿真开始时,车辆1检测车辆停在街道的右边。然后,车辆1追踪确认相关的跟踪停放车辆。此时,唯一的对象检测和跟踪车辆2追踪车辆1,立即在它前面。一旦车辆1跟踪熔化炉确认轨道,它广播,车辆2跟踪熔化炉融合。因此,汽车2就会意识到停的车辆才能检测到它们。

showsnap(四合扣,1)

图拍# 1包含2轴uipanel类型的对象和其他对象。坐标轴对象1包含X (m), ylabel Y (m)包含9块类型的对象,线,文本。一个或多个行显示的值只使用这些对象标记代表雷达、视觉,检测,当地的追踪,熔化炉的踪迹。坐标轴对象2包含X (m), ylabel Y (m)包含7块类型的对象,线,文本。一个或多个行显示的值只使用这些对象标记代表雷达,当地的追踪,熔化炉的踪迹。

分析跟踪行人在街的一面

随着仿真的继续,车辆2是能够探测和跟踪车辆停在一边,融合来自车辆的跟踪1。车辆2是能够探测和跟踪行人大约4秒模拟,和车辆与行人相关2融合跟踪约4.4秒模拟(见快照2)。然而,它需要车辆2大约两秒才能探测和跟踪行人的传感器(见快照3)。检测行人在街上两秒前可以显著提高安全。

showsnap(四合扣,2)

图拍# 2包含2轴uipanel类型的对象和其他对象。坐标轴对象1包含X (m), ylabel Y (m)包含11块类型的对象,线,文本。一个或多个行显示的值只使用这些对象标记代表雷达、视觉,检测,当地的追踪,熔化炉的踪迹。坐标轴对象2包含X (m), ylabel Y (m)包含9块类型的对象,线,文本。一个或多个行显示的值只使用这些对象标记代表雷达,当地的追踪,熔化炉的踪迹。

showsnap(四合扣,3)

图拍# 3包含2轴uipanel类型的对象和其他对象。坐标轴对象1包含X (m), ylabel Y (m)包含13个对象类型的补丁,行文本。一个或多个行显示的值只使用这些对象标记代表雷达、视觉,检测,当地的追踪,熔化炉的踪迹。坐标轴对象2包含X (m), ylabel Y (m)包含12块类型的对象,线,文本。一个或多个行显示的值只使用这些对象标记代表雷达,当地的追踪,熔化炉的踪迹。

避免谣言传播

当两辆车轨道相互沟通,有可能他们将继续沟通对象的信息不再检测通过重复其他车辆交流什么。这种情况被称为谣言传播。

车辆通过的对象,这些对象出去他们的视野,相关的融合跟踪这些对象都下降了追踪器(见4)快照。下降轨道表明两者之间的融合跟踪广播来回车辆不习惯传播谣言。

showsnap(断了,4)

图拍# 4包含2轴uipanel类型的对象和其他对象。坐标轴对象1包含X (m), ylabel Y (m)包含11块类型的对象,线,文本。一个或多个行显示的值只使用这些对象标记代表雷达、视觉,检测,当地的追踪,熔化炉的踪迹。坐标轴对象2包含X (m), ylabel Y (m)包含8块类型的对象,线,文本。一个或多个行显示的值只使用这些对象标记代表雷达,当地的追踪,熔化炉的踪迹。

%重启驾驶场景演员回到初始位置重启(场景);%释放所有传感器对象,这样他们就可以被再次使用sensorIndex = 1: numSensors发布(传感器{sensorIndex});结束%返回随机种子其先前的值rng (s)

总结

在本例中,您看到了如何进行航迹融合可以提高态势感知能力,提高汽车的安全的应用程序。您看到了如何设置一个trackFuser执行进行航迹融合和如何定义来源是内部或外部使用fuserSourceConfiguration对象。通过这样做,可以避免谣言传播,只保留融合跟踪真正观察到每个车辆维护。

引用

[1]Duraisamy B。,T. Schwarz, and C. Wohler. “Track Level Fusion Algorithms for Automotive Safety Applications.” In2013年国际会议上信号处理、图像处理和模式识别,179 - 84年,2013年。https://doi.org/10.1109/ICSIPR.2013.6497983

金宝app支持功能

createDrivingScenario

创建一个驾驶场景中定义驾驶场景设计师应用程序。

函数[场景、egoVehicle secondVehicle] = createDrivingScenario%建立drivingScenario对象场景= drivingScenario (“SampleTime”,0.1);%添加所有路段roadCenters = (50.8 - 0.5 0;253.4 - 1.5 0);roadWidth = 12;路(场景、roadCenters roadWidth);roadCenters = (100.7 - -100.6 0;100.7 - 103.7 0);路(场景,roadCenters);roadCenters = (201.1 - -99.2 0;199.7 - 99.5 0);路(场景,roadCenters);%增加自我的车辆egoVehicle =车辆(场景中,“ClassID”,1“位置”(65.1 - -0.9 0),“PlotColor”0.7410 - 0.4470 [0]);路点= [71 -0.5 0;148.7 - -0.5 0);速度= 12;轨迹(egoVehicle、锚点、速度);%添加第二辆车secondVehicle =车辆(场景中,“ClassID”,1“位置”55.1 - -0.9 [0]);路点= [61 -0.5 0;138.7 - -0.5 0);速度= 12;轨迹(secondVehicle、锚点、速度);%添加停放的汽车车辆(场景中,“ClassID”,1“位置”111.0 - -3.6 [0]);车辆(场景中,“ClassID”,1“位置”140.6 - -3.6 [0]);车辆(场景中,“ClassID”,1“位置”182.6 - -3.6 [0]);车辆(场景中,“ClassID”,1“位置”211.3 - -4.1 [0]);%增加行人演员(场景中,“ClassID”4“长度”,0.5,“宽度”,0.5,“高度”,1.7,“位置”(130.3 - -2.7 0),“RCSPattern”,8 8 8;8);%添加停放车车辆(场景中,“ClassID”2,“长度”,8.2,“宽度”,2.5,“高度”,3.5,“位置”117.5 - -3.5 [0]);结束

createSensors

创建的场景中使用的传感器和车辆的附件列表。

函数(传感器、numSensors attachedVehicle) = createSensors(场景)% createSensors返回所有传感器生成探测对象%用于createSensors和createDrivingScenario单位%的距离/米的位置%速度米/秒%角(度% (dBsm RCS模式%分配到每个传感器的物理和雷达资料对所有演员概要文件= actorProfiles(场景);% 1车辆雷达集群检测报告传感器{1}= radarDataGenerator (“没有扫描”,“SensorIndex”,1“UpdateRate”10“MountingLocation”(3.7 0 0.2),“RangeLimits”,50 [0],“FieldOfView”60,[5],“RangeResolution”,2.5,“AzimuthResolution”4“配置文件”配置文件,“HasOcclusion”,真的,“HasFalseAlarms”假的,“TargetReportFormat”,“集群检测”);%车辆2雷达跟踪报道传感器{2}= radarDataGenerator (“没有扫描”,“SensorIndex”2,“UpdateRate”10“MountingLocation”(3.7 0 0.2),“RangeLimits”120年[0],“FieldOfView”30 [5],“RangeResolution”,2.5,“AzimuthResolution”4“配置文件”配置文件,“HasOcclusion”,真的,“HasFalseAlarms”假的,“TargetReportFormat”,“跟踪”,“DeletionThreshold”3 [3]);% 1车辆视觉传感器检测报告传感器{3}= visionDetectionGenerator (“SensorIndex”3,“MaxRange”,100,“SensorLocation”1.9 [0],“DetectorOutput”,“只将对象”,“ActorProfiles”,概要文件);attachedVehicle = [1, 2, 1];numSensors =元素个数(传感器);结束

scenarioToEgo

进行坐标变换从场景到自我坐标。

trackInScenarioStateParameters自我定义为从场景坐标变换坐标。

状态使用恒定速度模型[x, vx; y; v; z; vz]。

函数trackInEgo = scenarioToEgo (trackInScenario) egoPosInScenario = trackInScenario.StateParameters.OriginPosition;egoVelInScenario = trackInScenario.StateParameters.OriginVelocity;stateInScenario = trackInScenario.State;stateShift = [egoPosInScenario (1); egoVelInScenario (1); egoPosInScenario (2); egoVelInScenario (2); egoPosInScenario (3); egoVelInScenario (3)];stateInEgo = stateInScenario - stateShift;trackInEgo = objectTrack (“UpdateTime”trackInScenario.UpdateTime,“状态”stateInEgo,“StateCovariance”trackInScenario.StateCovariance,“StateParameters”,trackInScenario.StateParameters);结束

egoToScenario

从自我执行坐标变换场景坐标。

trackInEgoStateParameters定义为从自我坐标变换场景坐标。

状态使用恒定速度模型[x, vx; y; v; z; vz]。

函数trackInScenario = egoToScenario (trackInEgo) egoPosInScenario = trackInEgo.StateParameters.OriginPosition;egoVelInScenario = trackInEgo.StateParameters.OriginVelocity;stateInScenario = trackInEgo.State;stateShift = [egoPosInScenario (1); egoVelInScenario (1); egoPosInScenario (2); egoVelInScenario (2); egoPosInScenario (3); egoVelInScenario (3)];stateInEgo = stateInScenario + stateShift;trackInScenario = objectTrack (“UpdateTime”trackInEgo.UpdateTime,“状态”stateInEgo,“StateCovariance”trackInEgo.StateCovariance,“StateParameters”,trackInEgo.StateParameters);结束

detectAndTrack

这个函数是用于收集所有的检测传感器在一个车辆和更新追踪。

代理是一个结构,包含演员信息和传感器,跟踪,绘图机绘制检测和车辆跟踪。

函数[追踪,wasTrackerUpdated] = detectAndTrack(代理,时间,posSelector)%建立车辆的检测提出了= targetPoses (agent.Actor);[检测,isValid] = vehicleDetections (agent.Actor.Position agent.Sensors,姿势、时间agent.DetPlotter);%更新跟踪器跟踪传感器的检测报告如果isValid agent.Tracker。StateParameters= struct(“帧”,“矩形”,“OriginPosition”agent.Actor.Position,“OriginVelocity”,agent.Actor.Velocity);跟踪= agent.Tracker(检测、时间);tracksInScenario =跟踪;i = 1:元素个数(跟踪)tracksInScenario (i) = egoToScenario(跟踪(i));结束pos = getTrackPositions (tracksInScenario posSelector);plotTrack (agent.TrkPlotter pos) wasTrackerUpdated = true;其他的跟踪= objectTrack.empty (0,1);wasTrackerUpdated = false;结束%从跟踪传感器获得额外的跟踪[sensorTracks, wasSensorTrackerUpdated] = vehicleTracks (agent.Actor agent.Sensors,姿势、时间agent.TrkPlotter);跟踪= vertcat(跟踪、sensorTracks);wasTrackerUpdated = wasTrackerUpdated | | wasSensorTrackerUpdated;结束

vehicleDetections

收集检测的传感器连接到这个车返回检测。

函数[objectDetections, isValid] = vehicleDetections(位置、传感器、姿势、时间、绘图仪)numSensors =元素个数(传感器);objectDetections = {};isValidTime = false (1、numSensors);%为每个生成检测传感器sensorIndex = 1: numSensors传感器=传感器{sensorIndex};如果isa(传感器,“visionDetectionGenerator”)| | ~ strcmpi (sensor.TargetReportFormat“跟踪”~)[objectDets, sensorConfig] =传感器(姿势、时间);如果islogical (sensorConfig) isValidTime (sensorIndex) = sensorConfig;其他的isValidTime (sensorIndex) = sensorConfig.IsValidTime;结束objectDets = cellfun (@ (d) setAtt (d), objectDets,“UniformOutput”、假);numObjects =元素个数(objectDets);objectDetections = [objectDetections;objectDets (1: numObjects)];% #好< AGROW >结束结束isValid = (isValidTime);%绘制检测如果元素个数(objectDetections) > 0 detPos = cellfun (@ (d) d.Measurement (1:2), objectDetections,“UniformOutput”、假);detPos = cell2mat (detPos ') ' +位置(1:2);plotDetection(绘图仪,detPos);结束结束函数d = setAtt (d)%将属性设置为一个结构d。ObjectAttributes =结构;%只保留位置测量速度和删除如果元素个数(d.Measurement) = = 6 d。测量= d.Measurement (1:3);d。MeasurementNoise = d.MeasurementNoise (1:3, 1:3);d.MeasurementParameters {1}。HasVelocity = false;结束结束

vehicleTracks

收集所有的跟踪传感器,跟踪报告。

函数[追踪,wasTrackerUpdated] = vehicleTracks(演员、传感器、姿势、时间、绘图仪)%建立车辆的检测numSensors =元素个数(传感器);跟踪= objectTrack.empty;isValidTime = false (1、numSensors);%为每个生成检测传感器sensorIndex = 1: numSensors传感器=传感器{sensorIndex};如果isa(传感器,“radarDataGenerator”)& & strcmpi (sensor.TargetReportFormat“跟踪”~)[sensorTracks, sensorConfig] =传感器(姿势、时间);如果islogical (sensorConfig) isValidTime (sensorIndex) = sensorConfig;其他的isValidTime (sensorIndex) = sensorConfig.IsValidTime;结束numObjects =元素个数(sensorTracks);跟踪=[跟踪;sensorTracks (1: numObjects)];% #好< AGROW >结束结束wasTrackerUpdated = (isValidTime);如果~ wasTrackerUpdated%没有车辆跟踪传感器udpated返回结束%添加车辆的位置和速度跟踪状态参数i = 1:元素个数(跟踪)跟踪.StateParameters(我)。.StateParameters OriginPosition =歌曲(我)。OriginPosition + actor.Position ';跟踪.StateParameters(我)。.StateParameters OriginVelocity =歌曲(我)。OriginVelocity + actor.Velocity ';结束%的阴谋跟踪如果元素个数(跟踪)> 0 trPos = arrayfun (@ (t) t.State ([1,3]),“UniformOutput”、假);trPos = cell2mat (trPos ') ' + actor.Position (1:2);plotTrack(绘图仪,trPos);结束结束