0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 sel = [1 1 1 1];
0023
0024
0025
0026 sensors = {};
0027 c = 0;
0028 c = c + 1;
0029 sensors{c} = [-1;-2];
0030 c = c + 1;
0031 sensors{c} = [-1;1];
0032 c = c + 1;
0033 sensors{c} = [1;-2];
0034 c = c + 1;
0035 sensors{c} = [1;1];
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 sensors = [sensors{:}];
0052
0053
0054
0055
0056 N = 10;
0057 sd = 0.01;
0058 dt = 0.01;
0059 nsteps = 500;
0060 ntargets = 4;
0061 states = cell(ntargets,nsteps);
0062 nsens = sum(sel);
0063
0064
0065
0066
0067 h_func = @az_h;
0068 dh_dx_func = @az_dh_dx;
0069 der_check(h_func, dh_dx_func, 1, randn(4,1), sensors);
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079 j = 1;
0080 if sel(j)
0081 a = zeros(1,nsteps);
0082 a(1,50:100) = pi/2/51/dt + 0.01*randn(1,51);
0083 a(1,200:250) = pi/2/51/dt + 0.01*randn(1,51);
0084 a(1,350:400) = pi/2/51/dt + 0.01*randn(1,51);
0085 x = [0;0;1;0];
0086 for i=1:500
0087 F = [0 0 1 0;...
0088 0 0 0 1;...
0089 0 0 0 a(i);...
0090 0 0 -a(i) 0];
0091 x = expm(F*dt)*x;
0092 states{j,i} = x;
0093 end
0094 end
0095
0096
0097
0098
0099
0100
0101
0102 j = 2;
0103 if sel(j)
0104 F = [0 0 1 0; 0 0 0 1; 0 0 0 0; 0 0 0 0];
0105 x = [0;-2;0.1;1];
0106 for i=100:350
0107 x = expm(F*dt)*x;
0108 states{j,i} = x;
0109 end
0110 end
0111
0112
0113
0114
0115
0116
0117
0118 j = 3;
0119 if sel(j)
0120 F = [0 0 1 0; 0 0 0 1; 0 0 0 0; 0 0 0 0];
0121 x = [-1;-1;1;0.1];
0122 for i=100:300
0123 x = expm(F*dt)*x;
0124 states{j,i} = x;
0125 end
0126 end
0127
0128
0129
0130
0131
0132
0133 j = 4;
0134 if sel(j)
0135 w1 = 1;
0136 w2 = 0.01;
0137
0138 F = [0 0 1 0; 0 0 0 1; 0 0 0 w1; 0 0 -w1 0];
0139 x = [-1;0;1;0];
0140 for i=150:400
0141 x = expm(F*dt)*x;
0142 states{j,i} = x;
0143 end
0144 end
0145
0146
0147
0148
0149 Z = {};
0150 sid = {};
0151 T = (0:nsteps-1)*dt;
0152 i = 0;
0153 for k=1:nsteps
0154 Z{k} = [];
0155 sid{k} = [];
0156 for j=1:ntargets
0157 if ~isempty(states{j,k})
0158 for i=1:size(sensors,2)
0159
0160 z = az_h(states{j,k},sensors(:,i)) + sd*randn;
0161 Z{k} = [Z{k} z];
0162 sid{k} = [sid{k} i];
0163 end
0164 end
0165 end
0166 ind = randperm(size(Z{k},2));
0167
0168 Z{k} = Z{k}(:,ind);
0169 sid{k} = sid{k}(:,ind);
0170 end
0171
0172
0173
0174
0175 hold off;
0176 for j=1:4
0177 XX = [];
0178 for k=1:nsteps
0179 if ~isempty(states{j,k})
0180 XX = [XX states{j,k}];
0181 end
0182 end
0183 if ~isempty(XX)
0184 plot(XX(1,:),XX(2,:),'k');
0185 hold on;
0186 end
0187 end
0188
0189
0190 axis([-1.5 1.5 -2.5 1]);
0191 drawnow;
0192
0193
0194
0195
0196
0197 M0 = [0;0;0;0];
0198 P0 = diag([4 4 4 4]);
0199 qx = 0.1;
0200 qy = 0.1;
0201 F = [0 0 1 0;
0202 0 0 0 1;
0203 0 0 0 0;
0204 0 0 0 0];
0205 [A,Q] = lti_disc(F,[],diag([0 0 qx qy]),dt);
0206 R = sd^2;
0207
0208
0209
0210
0211 S = nmcda_init(N,M0,P0,dt);
0212
0213
0214
0215
0216
0217 alpha = 2;
0218 beta = 1;
0219 cd = 1/2/pi;
0220 cp = 0.01;
0221
0222
0223
0224
0225 count = 0;
0226 SS = {};
0227 for k=1:nsteps
0228 [S,W] = ekf_nmcda_predict_dp(S,W,A,Q,[],[],[],T(k),alpha,beta);
0229 for j=1:length(Z{k})
0230 [S,W,E] = ekf_nmcda_update_dp(S,W,Z{k}(j),T(k),dh_dx_func,R,h_func,...
0231 [],cp,cd,[],sensors(:,sid{k}(j)));
0232 count = count + 1;
0233 SS(count,:) = S;
0234 fprintf('%d/%d: %s\n',k,size(Z,2),E{1});
0235 end
0236
0237 if rem(k,1) == 0
0238
0239
0240
0241 hold off;
0242 for j=1:4
0243 XX = [];
0244 for kk=1:nsteps
0245 if ~isempty(states{j,kk})
0246 XX = [XX states{j,kk}];
0247 end
0248 end
0249 if ~isempty(XX)
0250 plot(XX(1,:),XX(2,:),'k');
0251 hold on;
0252 end
0253 end
0254
0255
0256
0257
0258
0259
0260 hold on;
0261 len = 3;
0262 for j=1:length(Z{k})
0263 dx = len*cos(Z{k}(j));
0264 dy = len*sin(Z{k}(j));
0265 sx = sensors(1,sid{k}(j));
0266 sy = sensors(2,sid{k}(j));
0267 h = plot(sx,sy,'^');
0268 set(h,'markersize',10);
0269 plot([sx;sx+dx],[sy;sy+dy],'--');
0270 end
0271
0272
0273
0274
0275 for j=1:4
0276 if ~isempty(states{j,k})
0277 plot(states{j,k}(1),states{j,k}(2),'k*');
0278 end
0279 end
0280 cols='gbkymcgbkymcgbkymcgbkymc';
0281 chars='oooooo******......xxxxxx';
0282 nvis = 100;
0283 for i=1:length(S)
0284 n = round(W(i)*nvis);
0285 if n>0
0286 for j=1:length(S{i}.M)
0287 x = gauss_rnd(S{i}.M{j},S{i}.P{j},n);
0288 h = plot(x(1,:),x(2,:),[cols(j) chars(j)]);
0289 set(h,'markersize',6);
0290 end
0291 end
0292 end
0293 axis([-1.5 1.5 -2.5 1]);
0294 title('Tracking with EKF/NMCDA');
0295 drawnow;
0296 end
0297
0298
0299
0300
0301 W = W./sum(W);
0302 n_eff = eff_particles(W);
0303
0304 if n_eff < N/4
0305 ind = resample(W);
0306 S = S(ind);
0307 SS = SS(:,ind);
0308 W = ones(1,N)/N;
0309 fprintf('Resampling done on time step %d\n',k);
0310 end
0311 end
0312
0313 kf_nmcda_plot2;