主要内容

仅距离测量跟踪

这个例子说明了使用粒子滤波器和高斯和滤波器来跟踪单个对象,只使用距离测量。

简介

仅能观测距离信息的传感器不能从一次探测中提供对目标状态的完整理解。此外,当在笛卡尔坐标系中表示时,纯距离测量的不确定度是非高斯的,并创建凹形状。对于窄视场(FOV)的纯距离传感器,角度不确定性很小,可以近似为椭球,即高斯分布。然而,对于具有宽视场的距离传感器,当在笛卡尔坐标系中表示时,不确定性是由凹环形状描述的,这不能很容易地用椭球来近似。如下图所示。

这种现象也在提供方位角和距离信息的远程雷达上观察到。当每个方位分辨率单元的视场范围在空间上跨越较大区域时,状态分布变为非高斯分布。像远距离校正这样的技术经常被用于使用高斯滤波器,如扩展卡尔曼滤波器(trackingEKF)和Unscented卡尔曼滤波器(trackingUKF)。详细演示了这一点多平台雷达探测融合的例子。

在本例中,您将学习如何使用粒子滤波器和高斯和滤波器来表示由大视场传感器的距离测量引起的状态中的非高斯不确定性。

定义场景

该场景模拟了一个物体在X-Y平面上以恒定速度运动。物体穿过三个等距传感器的覆盖区域,视场为方位角60度。传感器FOV重叠,增强了物体穿过重叠区域时的可观测性。每个传感器报告距离测量,测量精度为5厘米。

S = rng;rng (2018);path = fullfile(matlabroot,“例子”“融合”“主要”);目录exPath);[scene,theaterDisplay] = helperCreateRangeOnlySensorScenario;showScenario (theaterDisplay)

showGrabs (theaterDisplay []);

使用粒子过滤器跟踪

在本节中,粒子滤波器,trackingPF用于跟踪对象。跟踪由单假设跟踪器执行trackerGNN.跟踪器负责维护跟踪,同时减少误报的数量。

这个函数initRangeOnlyCVPF初始化一个等速粒子滤波器。函数类似于initcvpf函数,但限制方位角从[-180 -180]和仰角从[-90 -90]initcvpf到已知的传感器视场。

%追踪跟踪器= trackerGNN(“FilterInitializationFcn”@initRangeOnlyCVPF,“MaxNumTracks”5);%更新显示以绘制粒子数据theaterDisplay。FilterType =“trackingPF”%高级场景和跟踪对象推进(场景)%当前时间time = scene.SimulationTime;%生成检测[detections, configs] = generateRangeDetections(scene);将检测传递给跟踪器如果~isempty(detections) [confTracks,~,allTracks] =跟踪器(检测,时间);elseifisLocked(跟踪器)confTracks = predictTracksToTime(跟踪器,“确认”、时间);结束%更新显示theaterDisplay(检测、配置、confTracks追踪);结束

请注意,粒子在沿距离测量弧的状态中具有非高斯不确定性,直到下一个传感器检测到目标。当目标通过传感器覆盖区域的边界移动时,与其他粒子相比,边界上粒子的可能性增加。这种可能性的增加触发了粒子滤波器中的重新采样步骤,粒子坍缩到真正的目标位置。

showGrabs (theaterDisplay [1 - 2]);

使用粒子过滤器,跟踪器在场景的持续时间内保持跟踪。

showGrabs (theaterDisplay 3);

使用高斯和滤波器跟踪

在本节中,一个高斯和滤波器,trackingGSF,用于跟踪对象。对于仅限范围的测量,可以初始化trackingGSF使用initapekf.的initapekf函数初始化角度参数化扩展卡尔曼滤波器。这个函数initRangeOnlyGSF属性的定义initapekf函数跟踪缓慢移动的对象。

%重启场景重启(现场);释放(theaterDisplay);%追踪跟踪器= trackerGNN(“FilterInitializationFcn”, @initRangeOnlyGSF);更新显示以绘制高斯和分量theaterDisplay。FilterType =“trackingGSF”推进(场景)%当前时间time = scene.SimulationTime;%生成检测[detections, configs] = generateRangeDetections(scene);将检测传递给跟踪器如果~isempty(detections) [confTracks,~,allTracks] =跟踪器(检测,时间);elseifisLocked(跟踪器)confTracks = predictTracksToTime(跟踪器,“确认”、时间);结束%更新显示theaterDisplay(检测、配置、confTracks追踪);结束

您可以使用TrackingFilters的属性trackingGSF来查看每个扩展卡尔曼滤波器的状态。下图中的“单个滤波器”表示,注意滤波器是如何沿着距离测量生成的弧对齐的,直到目标到达重叠区域。在越过边界后,边界处的滤波器的可能性增加,轨道收敛到那个单独的滤波器。重量,ModelProbabilities,与最接近边界的滤波器相比,其他单个滤波器的值下降,并且它们对状态估计的贡献减少。

showGrabs (theaterDisplay [4 - 5]);

使用高斯和滤波器,跟踪器在场景的持续时间内保持跟踪。

showGrabs (theaterDisplay 6);rng (s) rmpath (exPath);

总结

在本例中,您学习了如何使用粒子滤波器和高斯和滤波器跟踪仅使用范围测量的对象。粒子滤波器和高斯和滤波器都提供了跟踪非高斯状态分布的对象的功能。高斯和滤波器通过高斯分量的加权和来近似分布,而粒子滤波器通过一组样本来表示这个分布。粒子滤波器提供了一种更自然的方法来表示任意分布,只要可以从中生成样本。然而,为了完美地表示分布,可能需要大量的粒子,这增加了使用滤波器的计算量。由于状态由样本描述,粒子滤波体系结构允许使用任何过程噪声分布以及测量噪声。相比之下,高斯和滤波器对每个分量使用高斯过程和测量噪声。颗粒的主要缺点之一是“样品贫化”问题。在重新采样后,粒子可能会坍缩到高可能性区域,不允许过滤器从“不正确的”关联中恢复。由于高斯和滤波器不进行重采样,且每个状态都是高斯状态,因此高斯和滤波器具有一定的恢复能力。 However, this recovery is often dependent on the weights and covariances of each Gaussian-component.

支持功能

generateRangeDetections此函数生成仅距离检测

函数[detections,config] = generateRangeDetections(scene) detections = [];Config = [];time = scene.SimulationTime;i = 1: number (scene.Platforms) [thisDet, thisConfig] = detectOnlyRange(scene.Platforms{i},time);config = [config;thisConfig];% #好< AGROW >检测=[检测;thisDet];% #好< AGROW >结束结束

detectOnlyRange该函数从球面检测中去除az和el

函数[rangeDetections,config] = detectOnlyRange(observer,time) [fullDetections,numDetections,config] = detect(observer,time);I = 1: number (config)为绘图正确填充配置配置(i)。FieldOfView = observer.Sensors{i}.FieldOfView;配置(i) .MeasurementParameters(1)。OriginPosition = observer.Sensors{i}.MountingLocation(:);配置(i) .MeasurementParameters(1)。定向= rotmat(quaternion(observer.Sensors{i}.MountingAngles(:)',“eulerd”“ZYX股票”“帧”),“帧”);配置(i) .MeasurementParameters(1)。IsParentToChild = true;结束删除除范围信息以外的所有信息rangeDetections = fullDetections;i = 1:numDetections rangeDetections{i}。测量= rangeDetections{i}.测量(结束);rangeDetections{}。MeasurementNoise = rangeDetections{i}.MeasurementNoise(end);rangeDetections{我}.MeasurementParameters(1)。HasAzimuth = false;rangeDetections{我}.MeasurementParameters(1)。HasElevation = false;结束结束

initRangeOnlyGSF这个函数初始化一个角度参数化的高斯和滤波器。它使用角度限制[-30 30]来指定视场,并将滤镜的数量设置为10。对二维慢速运动目标的状态协方差和过程噪声进行了修正。

函数filter = initRangeOnlyGSF(检测)filter = initapekf(检测,10,[-30 30]);i = 1: number (filter.TrackingFilters) filterK = filter.TrackingFilters{i};filterK。ProcessNoise = 0.01*eye(3);filter . processnoise (3,3) = 0;%慢移动目标的小协方差filterK.StateCovariance(2,2) = 0.1;filterK.StateCovariance(4,4) = 0.1;% v = 0时z的低标准差;filterK.StateCovariance(6,6) = 0.01;结束结束

initRangeOnlyCVPF这个函数初始化一个等速粒子过滤器,其中粒子的FOV限制为[-30 30]。

函数filter = initRangeOnlyCVPF(检测)filter = initcvpf(检测);FOV中%均匀azaz = -pi/6 + pi/3*rand(1,filter.NumParticles);%无抬高;el = 0 (1,filter.NumParticles);%来自高斯范围测量的范围样本R =检测。Measurement +√(detection.MeasurementNoise)*randn(1,filter.NumParticles);% x,y,z在传感器帧[x,y,z] = sph2cart(az,el,r);%从传感器旋转到场景帧。senToPlat = detection.MeasurementParameters(1).Orientation';senPosition = detection.MeasurementParameters(1).OriginPosition;platToScenario = detection.MeasurementParameters(2).Orientation';platPosition =检测。测量参数(2).OriginPosition;posPlat = senToPlat*[x;y;z] + senPosition;posScen = platToScenario*posPlat + platPosition;%位置粒子filter.Particles(1,:) = posScen(1,:);filter.Particles(3,:) = posScen(2,:);filter.Particles(5,:) = posScen(3,:);%速度粒子%均匀分布过滤器。粒子([2 4],:)= -1 + 2*rand(2,filter.NumParticles);对于缓慢移动的目标,进程噪声设置为较低的数字。比% GSF为粒子增加更多的噪音,防止它们坍缩。过滤器。ProcessNoise = 0.1*eye(3);%零z速度filter.Particles(6,:) = 0;filter.ProcessNoise(3,3) = 0;结束
Baidu
map