KalmanFilter
target_tracking.m
Go to the documentation of this file.
1 clear all;
2 close all;
3 addpath('..');
4 
5 %see paper
6 %Arasaratnam, Ienkaran, and Simon Haykin. "Cubature kalman filters." IEEE Transactions on automatic control 54.6 (2009): 1254-1269.
7 %for further details
8 
9 %parameters
10 mult_constant = pi/180;
11 unknown_turn_rate = -3 *mult_constant;
12 dt_between_measurements = 1;
13 q_1 = 0.1;
14 q_2 = 1.75*10^(-4);
15 M = [dt_between_measurements^3/3, dt_between_measurements^2/2;...
16  dt_between_measurements^2/2, dt_between_measurements];
17 
18 %process noise
19 Q = zeros(5,5);
20 Q(1:2,1:2) = q_1*M;
21 Q(3:4,3:4) = q_2*M;
22 Q(5,5) = q_2*dt_between_measurements;
23 
24 %sensor noise
25 sigma_radius = 10;
26 sigma_theta = sqrt(10)*0.001;
27 R = diag([sigma_radius^2,sigma_theta^2]);
28 
29 %measurement of radius and angle
30 C = @(x) [sqrt(x(1)^2 + x(3)^2); atan2(x(3),x(1))];
31 
32 %transition function
33 next_func = @(x,k) [1,sin(mult_constant*unknown_turn_rate*dt_between_measurements)/unknown_turn_rate,0,-( (1-cos(mult_constant*unknown_turn_rate*dt_between_measurements))/unknown_turn_rate),0;...
34  0, cos(mult_constant*unknown_turn_rate*dt_between_measurements), 0, -sin(mult_constant*unknown_turn_rate*dt_between_measurements),0;...
35  0, (1-cos(mult_constant*unknown_turn_rate*dt_between_measurements))/unknown_turn_rate, 1, sin(mult_constant*unknown_turn_rate*dt_between_measurements)/unknown_turn_rate,0;...
36  0, sin(mult_constant*unknown_turn_rate*dt_between_measurements),0,cos(mult_constant*unknown_turn_rate*dt_between_measurements),0;...
37  0,0,0,0,1]*x;
38 
39 %initial estimate and covariance
40 x_0 = [1000;300;1000;0;-3*mult_constant];
41 P_0 = diag([100,10,100,10,100*0.001]);
42 
43 outputs = 5000;
44 
45 ideal_x=x_0;
46 ideal_data = zeros(5,outputs);
47 real_x=x_0;
48 real_data = zeros(5,outputs);
49 time = 0;
50 measurements = zeros(2,outputs);
51 for i=1:outputs
52  time = time + dt_between_measurements;
53  ideal_x = next_func(ideal_x,time);
54  ideal_data(:,i) = ideal_x;
55  real_x = next_func(real_x,time) + chol(Q)'*randn(5,1) ;
56  real_data(:,i) = real_x;
57  measurements(:,i) = C(real_x) + chol(R)'*randn(2,1);
58 end
59 
60 %x and y coordinates of measurements
61 xx = [];
62 yy = [];
63 for i=1:outputs
64  xx = [xx,measurements(1,i)*cos(measurements(2,i))];
65  yy = [yy,measurements(1,i)*sin(measurements(2,i))];
66 end
67 
68 
69 t_start = 0;
70 state_count = 5;
71 sensor_count = 2;
72 
73 %run cubature
74 [estimates_cubature, covariances_cubature] = cubature(next_func,dt_between_measurements,t_start,state_count,sensor_count,...
75  outputs,C,chol(Q)',chol(R)',chol(P_0)',x_0, measurements);
76 
77 %run ukf
78 C = @(x,k) C(x) + 0.*k;
79 Q = @(k) Q;
80 R = @(k) R;
81 [estimates_ukf, covariances_ukf] = ukf(next_func, state_count, sensor_count, outputs,C,Q,R,P_0,x_0, measurements);
82 
83 
84 h = figure;
85 hold on;
86 plot(estimates_cubature(1,:),estimates_cubature(3,:),'r','LineWidth',4)
87 plot(estimates_ukf(1,:),estimates_ukf(3,:),'g','LineWidth',4)
88 plot(real_data(1,:),real_data(3,:),'k','LineWidth',2);
89 legend('Cubature estimate','UKF estimates','Real position')
90 xlabel('x')
91 ylabel('y')
function cubature(in f_func, in dt_between_measurements, in start_time, in state_count, in sensor_count, in measurement_count, in C_func, in Q_root, in R_root, in P_0_root, in x_0, in measurements)