前言:
眼前朋友们对“最近邻点法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代码