主要内容

只用距离测量进行跟踪

该示例说明使用粒子滤波器和高斯 - 和滤波器使用仅限范围测量来跟踪单个对象。

介绍

只能观察范围信息的传感器无法从单个检测方面完全了解对象状态。另外,仅在笛卡尔坐标帧中表示的仅限范围测量的不确定性是非高斯和创造凹形。对于仅具有窄视场(FOV)的传感器(FOV),角度不确定性小,并且可以由椭圆体近似,即高斯分布。然而,对于具有宽FOV的仅限范围传感器,当在笛卡尔框架中表示时的不确定性被凹环形状描述,该凹环形状不能容易地由椭圆体近似。这在下面所示的图像中示出。

该现象也观察到长距离雷达,其提供方位角和范围信息。当每个方位角分辨率单元的FOV跨越空间中的大区域时,状态的分布变为非高斯。像远程校正等技术通常用于利用像扩展卡尔曼滤波器一样使用高斯滤波器(trackingEKF)和Unscented卡尔曼滤波器(trackingUKF)在这些场景中。这将在其中详细说明多平台雷达探测融合的例子。

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

定义方案

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

s =提高;rng (2018);exPath = fullfile (matlabroot,“例子”“融合”“主要”);addpath(expath);[场景,theaterdisplay] = HelpercreaterangeOnlySensorscenario;showscenario(theaterdisplay)

ShowGrabs(TheaterDisplay,[]);

轨道使用粒子过滤器

在本节中,粒子过滤器,trackingPF用于跟踪对象。跟踪是由一个单假设跟踪器使用trackerGNN.跟踪器负责维护轨道,同时减少误报的数量。

这个函数initRangeOnlyCVPF初始化匀速粒子过滤器。函数类似于initcvpf.功能,但限制角度[-180 -180]在方位角和[-90 -90]在仰角initcvpf.在这个问题中给了已知的传感器FOV。

%追踪跟踪器= trackergnn('filterinitializationfcn',@ initrangeonlycvpf,'maxnumtracks'5);%更新显示以绘制粒子数据theaterdisplay.filtertype =.'trackingpf';%预先场景和跟踪对象推进(场景)% 当前时间Time = Scene.simulationtime;%生成检测[detections, configs] = generateRangeDetections(scene);通过检测到跟踪器如果~isempty(detections) [confTracks,~,allTracks] = tracker(detections,time);eleesif.Islocked(跟踪器)Conftracks = PredictTrackStotime(跟踪器,“确认”,时间);结束%更新显示TheaterDisplay(检测,Configs,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] = tracker(detections,time);eleesif.Islocked(跟踪器)Conftracks = PredictTrackStotime(跟踪器,“确认”,时间);结束%更新显示TheaterDisplay(检测,Configs,Conftracks,跟踪器);结束

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

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.

金宝app支持功能

生成方式edetections.这个函数只产生距离检测

函数[detections,config] = generateRangeDetections(scene) detections = [];配置= [];Time = Scene.simulationtime;为了i = 1:numel(scene.平台)[thisDet, thisConfig] = detectOnlyRange(scene.平台{i},时间);配置=[配置;thisConfig];% #好< AGROW >检测=[检测;thisDet];% #好< AGROW >结束结束

detectOnlyRange该功能从球面检测中移除AZ和EL

函数[rangedetections,config] =检测(观察者,时间)[FULLDETECTES,NUMDETECTIONS,CONFIG] =检测(观察者,时间);为了i = 1:元素个数(配置)%正确填充配置以进行绘图config(i).fieldofview = Observer.Sensors {i} .fieldofview;配置(i).measurementParameters(1).originPosition = Observer.Sensors {i} .mountingLocation(:);配置(i).measurementparameters(1).orientation = rotmat(四元数(Observer.sensors {i} .mountingangles(:)','eulerd''Zyx''框架'),'框架');配置(i).measurementparameters(1)。sisparenttochild = true;结束%删除除范围信息外的所有信息rangedetections = fulldetections;为了i = 1:numdetections rangedetections {i} .measurement =范围{i} .measurement(END);范围{i} .measurementnoise =范围{i} .measurementnoise(结束);范围{i} .measurementparameters(1).hasazimuth = false;范围{i} .measurementparameters(1).haselevation = false;结束结束

initRangeOnlyGSF此函数初始化一个角度参数化高斯和滤波器。它使用[-3030]的角度限制来指定FOV,并将过滤器的数量设置为10.它还修改了2-D中的慢动移动对象的状态协方差和过程噪声。

函数过滤器= initRangeOnlyGSF(检测)滤波器= INEAPKF(检测,10,[ -  30 30]);为了i = 1:numel(filter.trackingfilters)filterk = filter.trackingfilters {i};filterk.processnoise = 0.01 *眼睛(3);filterk.processnoise(3,3)= 0;%小协方差为缓慢移动的目标filterK.StateCovariance (2, 2) = 0.1;filterK.StateCovariance (4, 4) = 0.1;Z为Z为v = 0的%低标准偏差;filterK.StateCovariance (6,6) = 0.01;结束结束

initRangeOnlyCVPF这个函数初始化一个恒定速度的粒子过滤器,其中粒子的视场限制在[-30 -30]。

函数filter = initRangeOnlyCVPF(检测);在FOV中%统一AZaz = -pi/6 + pi/3*rand(1,filter.NumParticles);%没有高程;el = 0(1、filter.NumParticles);%从高斯距离测量的距离样本r =检测。测量+√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 = detection.MeasurementParameters (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 * (3);%零z速度filter.particles(6,:) = 0;filter.processnoise(3,3)= 0;结束