www.gusucode.com > MATLAB编程毕业设计 EKF SLAM仿真全部源代码 > data_associate.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %获取匹配项目zf,和新项目zn %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [zf,idf,zn]= data_associate(x,P,z,R, gate1, gate2) zf= []; zn= []; idf= []; Nxv= 3; %机器人状态向量的长度(x,y,theta) Nf= (length(x) - Nxv)/2; %机器人库中LM的数目 %i:遍历所有观测到的landmark for i=1:size(z,2) jbest= 0; %无限大 nbest= inf; outer= inf; % search for neighbours %第i号观测到的Landmark与库中的所有landmark进行匹配比较,分别得到nis距离和nd距离 %前提是nis距离小于gate1,在这个前提下选出nd距离最小的作为成功匹配项 %若是没有一个nis距离小于gate1,那么选出nis距离的最小是outer,若是outer足够大... %...表明这个landmark和库中landmark距离最近的值是outer for j=1:Nf [nis, nd]= compute_association(x,P,z(:,i),R, j); if nis < gate1 & nd < nbest %小于阈值 nbest= nd; jbest= j; elseif nis < outer outer= nis; end end % zn的发现 if jbest ~= 0 zf= [zf z(:,i)]; idf= [idf jbest]; elseif outer > gate2 % z太远了,不能够和库中的LM匹配成功,不过远度大于阈值可以认为发现了新LM zn= [zn z(:,i)]; end end function [nis, nd]= compute_association(x,P,z,R,idf) %返回规则化的normalised innovation squared(马氏距离)以及normalised distance [zp,H]= observe_model(x, idf); v= z-zp; v(2)= pi_to_pi(v(2)); S= H*P*H' + R; nis= v'*inv(S)*v; nd= nis + log(det(S));