6 %Arasaratnam, Ienkaran, and Simon Haykin.
"Cubature kalman filters." IEEE Transactions on automatic control 54.6 (2009): 1254-1269.
10 mult_constant = pi/180;
11 unknown_turn_rate = -3 *mult_constant;
12 dt_between_measurements = 1;
15 M = [dt_between_measurements^3/3, dt_between_measurements^2/2;...
16 dt_between_measurements^2/2, dt_between_measurements];
22 Q(5,5) = q_2*dt_between_measurements;
26 sigma_theta = sqrt(10)*0.001;
27 R = diag([sigma_radius^2,sigma_theta^2]);
29 %measurement of radius and angle
30 C = @(x) [sqrt(x(1)^2 + x(3)^2); atan2(x(3),x(1))];
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;...
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]);
46 ideal_data = zeros(5,outputs);
48 real_data = zeros(5,outputs);
50 measurements = zeros(2,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);
60 %x and y coordinates of measurements
64 xx = [xx,measurements(1,i)*cos(measurements(2,i))];
65 yy = [yy,measurements(1,i)*sin(measurements(2,i))];
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); 78 C = @(x,k) C(x) + 0.*k; 81 [estimates_ukf, covariances_ukf] = ukf(next_func, state_count, sensor_count, outputs,C,Q,R,P_0,x_0, measurements); 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
') 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)