主要内容

将检测转换为objectDetection格式

这些示例展示了如何将传感器的本地格式的实际检测转换为objectDetection对象。objectDetection是工具箱中大多数跟踪过滤器和跟踪器的标准输入格式。这六个示例逐步展示了如何进行设置objectDetection具有各种跟踪场景。

  • 示例1在固定的矩形帧中配置检测。

  • 示例2在移动的矩形帧中配置检测。

  • 示例3在移动的球面框架中配置检测。

  • 示例4演示如何表示通过连续旋转获得的检测结果。

  • 示例5演示如何配置3d检测。

  • 例子6显示如何配置分类检测。

一个objectDetection报告必须包含检测的基本信息:时间测量.它还可以包含其他关键属性,包括MeasurementNoiseSensorIndexObjectClassIDObjectClassParametersObjectAttributes,MeasurementParameters.设置MeasurementParameters正确地使过滤器或跟踪器能够解释测量在创建中至关重要objectDetection.第一个示例显示了一个的基本设置objectDetection.示例2到5着重于如何正确设置MeasurementParameters.最后一个示例展示了如何进行设置ObjectClassParameters

例1:在静止矩形帧中转换检测

考虑一个带有固定塔和卡车的二维跟踪场景。位于场景框架原点的塔上装有雷达传感器。在 t = 0秒,(10,20,0)米位置的卡车正行驶 X 方向,速度为5m /s。

雷达传感器在场景框架中输出三维位置和速度测量值,因此测量值可写为:

测量1 = [10;20;0;5;0;0];% (x, y, z, vx; v; vz]

您可以指定其他属性,例如MeasurmentNoiseSensorIndexObjectClassID,ObjectAttributesobjectDetection对象。例如,假设位置和速度测量噪声的标准差分别为10m和1m /s,则可以定义测量误差协方差矩阵为:

measurementNoise1 = diag([10*ones(3,1);ones(3,1)]);

创建一个objectDetection使用这些值。

Time1 = 0;检测时间%detect1 = objectDetection(time1,measurement1,“MeasurementNoise”measurementNoise1)
detect1 = objectDetection with properties: Time: 0 Measurement: [6x1 double] MeasurementNoise: [6x6 double] SensorIndex: 1 ObjectClassID: 0 objectclasparameters: [] MeasurementParameters: {} ObjectAttributes: {}

例2:在移动矩形帧中转换检测

考虑一个2d跟踪场景,其中有一辆小轿车和一辆卡车。在 t = 0秒时,汽车相对于场景框架位于(20,10,0)米处。汽车以5米/秒的速度在 Y 场景框架的方向。小车的局部(向前)车架,{ x y },从场景框架旋转90度角。在前面的例子中,一辆位于(10,20,0)米位置的卡车正行驶 X 方向,速度为5m /s。

与此同时,自我汽车在自己的局部框架内观察卡车, x y }。在实际应用中,您可以直接从ego汽车的传感器系统中获得测量结果。由图可知,卡车的尺寸为[10;10;0 5;5;0]相对于{ x y }帧按[的顺序排列x, y, z, vx; v,登陆]。

测量2 = [10;10;0;5;5;0);% (x, y, z, vx; v; vz]

要指定对象检测,需要指定从场景矩形框架{的坐标转换 X Y }到局部矩形框架{ x y }。你可以使用MeasurementParameters的属性objectDetection来指定这些转换参数。在转换中,场景框架是车架,和小我车的局部车架是一样的孩子框架。

  • 框架属性将子框架类型设置为'矩形的(在这个例子中)或球形的

  • OriginPosition属性设置子框架相对于父框架的原点位置。

  • OriginVelocity属性设置子框架相对于父框架的原点速度。

MP2 = struct();MP2。帧=“矩形”;MP2。OriginPosition = [20;10;0);MP2。OriginVelocity = [0;5;0);

使用从欧拉角转换的旋转矩阵指定旋转。集IsParentToChild为true表示从父帧到子帧的旋转。

rotAngle2 = [90 0 0];%(偏航、俯仰、行)rotAngle2 =四元数;“Eulerd”“ZYX股票”“帧”);rotMatrix2 = rotmat(rotQuat2,“帧”);MP2。Orientation = rotMatrix2;MP2。IsParentToChild = true;

指定的测量。

  • HasElevationHasAzimuth,因为子框架是矩形的。

  • HasRange真正的启用位置测量。

  • HasVelocity真正的启用速度测量。

MP2。HasElevation = false;MP2。HasAzimuth = false;MP2。HasRange = true;MP2。HasVelocity = true;

创建objectDetection对象,并指定MeasurementParameters财产。

Time2 = 0;detection2 = objectDetection(时间2,测量2,“MeasurementParameters”, MP2)
detection2 = objectDetection with properties: Time: 0 Measurement: [6x1 double] MeasurementNoise: [6x6 double] SensorIndex: 1 ObjectClassID: 0 objectclasparameters: [] MeasurementParameters: [1x1 struct] ObjectAttributes: {}

要验证对象检测,可以使用cvmeas度量函数,用于重新生成度量。的cvmeas函数可以以目标的实际状态和测量参数作为输入。的状态输入cvmeas的顺序为[x, vx; y, v, z,登陆]。如下输出所示,结果与measurement2

state2 =[10; 5、20 0,0,0);%卡车状态[x;vx;y;vy;z;vz]cvmeas2 = cvmeas(state2,MP2)%测量单位[x;y;z;vx;vy;vz]
cvmeas2 =6×110.0000 10.0000 0 -5.0000 0

示例3:在移动球面框架中转换检测

考虑前面的跟踪场景,只有现在测量是由具有球形输出帧的扫描雷达获得的。雷达的视轴方向与 Y 方向(同 x 方向) t = 0秒。

由于卡车和汽车之间的相对速度是在视线方向上的,测量结果,其顺序为[方位角;海拔高度;范围;Range-rate],可得:

measurement3 = [45;0;10 /信德(45);5 /信德(45)];% (az; el rng; rr)。单位是度。

指定测量参数。

MP3 = struct();MP3。帧=“球”;子框架是球形的。MP3。OriginPosition = [20;10;0);MP3。OriginVelocity = [0;5;0);%指定旋转。rotAngle3 = [90 0 0];(rotAngle3;“Eulerd”“ZYX股票”“帧”);rotMatrix3 = rotmat(rotQuat3,“帧”);MP3。Orientation = rotMatrix3;MP3。IsParentToChild = true;

HasElevationHasAzimuth真正的在球形子框架中输出方位角和仰角。集HasRangeHasVelocity真正的分别输出距离和距离速率。

MP3。HasElevation = true;MP3。HasAzimuth = true;MP3。HasRange = true;MP3。HasVelocity = true;

创建objectDetection对象。

Time3 = 0;detection3 = objectDetection(时间3,测量3,“MeasurementParameters”、MP3)
detection3 = objectDetection with properties: Time: 0 Measurement: [4x1 double] MeasurementNoise: [4x4 double] SensorIndex: 1 ObjectClassID: 0 objectclasparameters: [] MeasurementParameters: [1x1 struct] ObjectAttributes: {}

使用以下命令验证结果cvmeas.结果与measurement3

State3 = [10;5;20;0;0];% [x, vx; y; v; z; vz]cvmeas3 = cvmeas(state3,MP3)% (az; el rng; rr)
cvmeas3 =4×145.0000 14.1421 -7.0711

例4:在三帧之间转换检测

考虑前面的跟踪场景,现在雷达的轴视方向从旋转45度 x 汽车的局部框架方向。

新的测量,用新的球框架表示{ x y },有:

测量4 = [0;0;10 /信德(45);5 /信德(45)];% (az; el rng; rr)

对于测量参数,可以将旋转指定为从场景框架到新球面框架的135度旋转。或者,您可以将其指定为两个连续的旋转: X Y }到矩形{ x y }和矩形{ x y }到球形{ x y }。控件支持的多帧转换特性万博1manbetxMeasurementParameters属性,本例使用后一种方法。

第一组测量参数与MP2中使用的示例2MP2从矩形{的旋转 X Y }到矩形{ x y }。对于第二组测量参数,MP4,则只需要指定从矩形{旋转45度 x y }到球面{ x y }。

MP4 = struct();MP4。帧=“球”;MP4。OriginPosition = [0;0;0);%并置位置。MP4。OriginVelocity = [0;0;0);相同的起始速度。%指定旋转。rotAngle4 = [45 0 0];(rotAngle4;“Eulerd”“ZYX股票”“帧”);rotMatrix4 = rotmat(rotQuat4,“帧”);MP4。Orientation = rotMatrix4;MP4。IsParentToChild = true;在球形子框架中指定输出。MP4。HasElevation = true;MP4。HasAzimuth = true;MP4。HasRange = true;MP4。HasVelocity = true;

创建组合MeasurementParameters输入,货币政策委员会

MPc =[MP4 MP2];

请注意,测量参数的顺序在这里很重要。指定的货币政策委员会表示首先执行的坐标变换对应于MP2然后进行坐标变换对应于MP4

接下来,创建objectDetection对象。

Time4 = 0;detection4 = objectDetection(时间4,测量4,“MeasurementParameters”, MPc)
detection4 = objectDetection with properties: Time: 0 Measurement: [4x1 double] MeasurementNoise: [4x4 double] SensorIndex: 1 ObjectClassID: 0 objectclasparameters: [] MeasurementParameters: [1x2 struct] ObjectAttributes: {}

使用以下命令验证结果cvmeas.结果与measurement4

state = [10;5;20;0;0];% [x, vx; y; v; z; vz]cvmeas4 = cvmeas(statstat4,MPc)% (az; el rr; rrate)
cvmeas4 =4×10.0000 0 14.1421 -7.0711

示例5:转换3D检测

考虑一个无人驾驶飞行器(UAV)监视一个区域。在 t = 0秒时,无人机相对于全球东北向下(NED)框架处于(5,5,-1)km的位置。UAV的速度为(-50,-100,5)m/s。无人机机体框架{的方位 x y z }相对于全局NED框架给出(-120,2,2)偏航,俯仰和横摇度。同时,位于(1,1,0)km位置的汽车正以30米/秒的速度向东移动。无人机使用与车身轴线对齐的雷达系统来测量汽车。

根据这些信息,指定测量转换的运动学参数。

指定无人机机体框架的框架类型、原点位置和原点速度。

MP5 = struct();里。帧=“球”;里。OriginPosition = [5000;5000;-1000);里。OriginVelocity = [-50;-100;5);

指定NED框架到无人机主体框架的旋转。

Rot_angle5 = [-120 2 2];%(偏航、俯仰、滚)Rot_quat5 =四元数(rot_angle;“Eulerd”“ZYX股票”“帧”);Rot_matrix5 = rotmat;“帧”);里。取向= Rot_matrix5;里。IsParentToChild = true;

在球面框架中指定输出测量值。

里。HasElevation = true;里。HasAzimuth = true;里。HasRange = true;里。HasVelocity = true;

您可以直接从无人机上的雷达系统获得测量值。在这里,你使用cvmeas函数,以[方位角;仰角;距离;距离-速率]的顺序获得测量值。

Car_state5 = [1000;0;1000;30;0;0];% [x, vx; y; v; z; vz]。measurement5 = cvmeas(car_state5,MP5);Meas_az5 = measurement5(1)
Meas_az5 = -14.6825
Meas_el5 = measurement5(2)
Meas_el5 = 12.4704
Meas_rng5 = measurement5(3)
Meas_rng5 = 5.7446e+03
Meas_rr5 = measurement5(4)
Meas_rr5 = -126.2063

仰角定义为从x平面到z方向的夹角。这就是为什么相对于无人机来说,地面上的目标仰角是正的。这个约定在整个工具箱中使用。

方位角、仰角、距离、距离率的测量噪声分别为[1,1,20,2]。雷达的索引为2,雷达可以将探测到的目标分类为1,类型为汽车的

Index5 = 2;Covariance5 = diag([1;1;20;2]);class5 = 1;

创建一个objectDetection对象进行检测。

Time5 = 0;detection = objectDetection(时间5,测量5,“SensorIndex”index5,“MeasurementNoise”covariance5,“ObjectClassID”classID5,“MeasurementParameters”里)
detection = objectDetection with properties: Time: 0 Measurement: [4x1 double] MeasurementNoise: [4x4 double] SensorIndex: 2 ObjectClassID: 1 objectclasparameters: [] MeasurementParameters: [1x1 struct] ObjectAttributes: {}

例6:分类检测

考虑一个视觉跟踪场景,其中相机帧馈送到目标检测器。在这种情况下,检测通常提供对象的分类。考虑一个对象检测器,它输出边界框检测并将对象分类为以下类{'”、“行人”、“自行车”}。检测器的统计数据由其混淆矩阵捕获C.创建一个带有边界框测量的检测,行人的分类,以及混淆矩阵C定义如下

C = [0.9 0.05 0.05;0.05 0.9 0.05;0.05 0.05 0.9];分类d = 2;%行人ClassParams = struct(“ConfusionMatrix”C);Boundingbox = [250 140 300 400];左上角宽度高度坐标中的边界框detection = objectDetection(0, boundingbox, ObjectClassID=ClassID, objectclasparameters =struct(“ConfusionMatrix”C))
detection = objectDetection with properties: Time: 0 Measurement: [250 140 300 400] MeasurementNoise: [4x4 double] SensorIndex: 1 ObjectClassID: 2 objectclasparameters: [1x1 struct] MeasurementParameters: {} ObjectAttributes: {}

另请参阅