龙空技术网

基于Matlab鸟群跟踪仿真

珞瑜之家学习干货基地 135

前言:

眼前朋友们对“最近邻点法matlab代码”大概比较关心,大家都想要剖析一些“最近邻点法matlab代码”的相关知识。那么小编在网络上汇集了一些有关“最近邻点法matlab代码””的相关文章,希望同学们能喜欢,咱们一起来学习一下吧!

此示例演示如何跟踪大量对象。生成一大群鸟类,并使用全局最近邻多目标跟踪器来估计鸟群中每只鸟的运动。

一、方案定义

鸟群运动是使用雷诺兹提出的行为模型模拟。在此示例中,鸟群由 1000 只模拟鸟类(称为 boids)组成,其初始位置和速度之前已保存。它们遵循植绒的三个规则:避免碰撞、速度匹配和植绒居中。每个规则都与一个权重相关联,鸟群的整体行为来自每个规则的相对权重。在这种情况下,选择的权重使鸟群围绕某个点飞行并创建一个密集的中心。其他权重设置可能会导致出现不同的行为。

跟踪如此庞大而密集的鸟群带来了两个挑战:

如何有效地跟踪 1000 个 boid?如何在如此密集的环境中跟踪单个小动物?

以下代码模拟 0.1 秒的 100 步的植群行为。左侧的图显示了整个鸟群,右侧的绘图放大了鸟群中心最密集的部分。

s = rng;   % Keep the current state of the random number generatorrng(2019); % Set the random number generator for repeatable resultsload("initialFlock.mat","x","v");flock = helperFlock("NumBoids",size(x,1),"CollisionAviodanceWeight",0.5,...    "VelocityMatchingWeight",0.1,"FlockCenteringWeight",0.5,"Velocity",v,...    "Position",x,"BoidAcceleration",1);truLabels = string(num2str((1:flock.NumBoids)'));bound = 20;flockCenter = mean(x,1);[tp1,tp2] = helperCreateDisplay(x,bound);% Simulate 100 steps of flockingnumSteps = 100;allx = repmat(x,[1 1 numSteps]);dt = 0.1;for i = 1:numSteps    [x,v] = move(flock,dt);    allx(:,:,i) = x;    plotTrack(tp1.Plotters(1),x)    inView = findInView(x,-bound+flockCenter,bound+flockCenter);    plotTrack(tp2.Plotters(1),x(inView,:),truLabels(inView))    drawnowend
二、跟踪器定义

可以定义跟踪器,如示例如何有效地跟踪大量对象所示。观察到 boid 遵循曲线路径并选择由 定义的恒定转弯模型。initctekf 若要限制计算成本所需的时间,请将粗略成本计算阈值降低到较低的值。AssignmentThreshold 此外,可以选择更高效的赋值算法,而不是默认算法。希望快速确认和删除曲目,并将确认和删除阈值分别设置为 [2 3] 和 [2 2]。最后,知道传感器在任何给定扫描中仅扫描鸟群的一小部分,因此将theto设置为能够将可检测的跟踪ID传递给跟踪器。

三、追踪鸟群

接下来,运行方案并跟踪鸟群。使用支持功能模拟简化的传感器模型。它模拟一个传感器,从左到右扫描鸟群,并在每次扫描中捕获 x 轴上五分之一的鸟群跨度。传感器的检测概率为 0.98,噪声使用正态分布进行模拟,每个位置分量的标准偏差为 0.1 米。detectFlock 传感器报告其边界,用于向跟踪器提供可检测的跟踪 ID。

clear flockTracker_kernelpositionSelector = [1 0 0 0 0 0 0; 0 0 1 0 0 0 0; 0 0 0 0 0 1 0];trackIDs = zeros(0,1,'uint32');trax = zeros(0,3);bounds = inf(3,2);alltrax = zeros(size(allx));allIDs = repmat({},1,numSteps);trup2 = tp2.Plotters(1);trap2 = tp2.Plotters(2);trup2.HistoryDepth = 2*trap2.HistoryDepth;clearPlotterData(tp1)clearPlotterData(tp2)for i = 1:numSteps    t = i*dt;    [detections, currentScan] = detectFlock(allx(:,:,i),t);    bounds(1,:) = currentScan;    tracksInScan = findInView(trax,bounds(:,1),bounds(:,2));    [tracks,info] = flockTracker_kernel(detections,t,trackIDs(tracksInScan,1));    trax = getTrackPositions(tracks,positionSelector);    if ~isempty(tracks)        trackIDs = uint32([tracks.TrackID]');    else        trackIDs = zeros(0,1,'uint32');    end    alltrax(1:size(trax,1),1:3,i) = trax;    allIDs{i} = string(trackIDs);    helperVisualizeDisplay(tp1,tp2,truLabels,allx,allIDs,alltrax,i)endrng(s); % Reset the random number generator to its previous state
四、生成的代码中跟踪器的结果

以下 GIF 显示了 mex 文件中跟踪器的性能。

五、总结

此示例演示了如何在实际方案中跟踪大量对象,其中扫描传感器仅报告每次扫描中的一小部分对象。该示例展示了如何为大量对象设置跟踪器,以及如何使用可检测的轨迹 ID 输入来防止轨迹被删除。

六、参考文献

[1] Craig W. Reynolds,“Flocks, Herds, and Schools: A Behavioral Model”, Computer Graphics, Vol. 21, Number 4, July 1987.

七、程序

程序获取:【程序】基于Matlab鸟群跟踪仿真(附源码)

程序大全:Matlab和Simulink仿真程序汇总(2022年汇总,持续更新中)

标签: #最近邻点法matlab代码