root/applications/dual/vahala/kim/assembDeriv.m @ 1435

Revision 1435, 3.1 kB (checked in by vahalam, 12 years ago)
Line 
1function [A_k, C_k, pre_k, A_l] = assembDeriv(ksi, iab, ksi0, Q, R, ref_ome)   
2    a = 0.9898;
3    b = 0.0072;
4    c = 0.0361;   
5    d = 1.0;
6    e = 0.0149;
7    dt = 0.000125;
8   
9    ome = ksi(1);
10    the = ksi(2);
11    P = [ksi(3), ksi(4); ksi(4), ksi(5)];
12    ia = iab(1);
13    ib = iab(2);
14    A_k = zeros(5);
15    A_l = zeros(6);
16       
17   
18    %puvodni matice derivaci
19    A = [d, -e*(ia*cos(the)+ib*sin(the)); dt, 1.0];
20    C = [b*sin(the), b*ome*cos(the); -b*cos(the), b*ome*sin(the)];
21   
22    %dalsi matice EKF
23    Pp = A*P*A' + Q;
24    S = C*Pp*C' + R;
25    K = Pp*C'/S;
26    Pnew = (eye(2) - K*C)*Pp;   
27   
28    %derivace zakladnich matic EKF stavu
29%     dAdom = zeros(4);
30    dAdth = [0, e*(ia*sin(the)-ib*cos(the)); 0, 0];
31%     dAdP = zeros(4);
32    dCdom = [0, b*cos(the); 0, b*sin(the)];
33    dCdth = [b*cos(the), -b*ome*sin(the); b*sin(the), b*ome*cos(the)];
34%     dCdP = zeros(4);
35%     dPdomth = zeros(4);
36    dPdPo = [1, 0; 0, 0];
37    dPdPot = [0, 1; 1, 0];
38    dPdPt = [0, 0; 0, 1];
39   
40    %derivace dalsich matic EKF stavu
41%     dPpdom = zeros(4);
42    dPpdth = dAdth*P*A' + A*P*dAdth';
43    dPpdPo = A*dPdPo*A';
44    dPpdPot = A*dPdPot*A';
45    dPpdPt = A*dPdPt*A';
46   
47    dSdom = dCdom*Pp*C' + C*Pp*dCdom';
48    dSdth = dCdth*Pp*C' + C*dPpdth*C' + C*Pp*dCdth';
49    dSdPo = C*dPpdPo*C';
50    dSdPot = C*dPpdPot*C';
51    dSdPt = C*dPpdPt*C';
52   
53    dKdom = Pp*dCdom'/S - Pp*C'/S*dSdom/S;
54    dKdth = dPpdth*C'/S + Pp*dCdth'/S - Pp*C'/S*dSdth/S;
55    dKdPo = dPpdPo*C'/S - Pp*C'/S*dSdPo/S;
56    dKdPot = dPpdPot*C'/S - Pp*C'/S*dSdPot/S;
57    dKdPt = dPpdPt*C'/S - Pp*C'/S*dSdPt/S;
58   
59    dPnewdom = - dKdom*C*Pp - K*dCdom*Pp;
60    dPnewdth = dPpdth - dKdth*C*Pp - K*dCdth*Pp - K*C*dPpdth;
61    dPnewdPo = dPpdPo - dKdPo*C*Pp - K*C*dPpdPo;
62    dPnewdPot = dPpdPot - dKdPot*C*Pp - K*C*dPpdPot;
63    dPnewdPt = dPpdPt - dKdPt*C*Pp - K*C*dPpdPt;
64   
65    A_k(1,1) = d;
66    A_k(1,2) = -e*(ia*cos(the)+ib*sin(the));
67%     A_k(1,3) = 0;
68%     A_k(1,4) = 0;
69%     A_k(1,5) = 0;
70   
71    A_k(2,1) = dt;
72    A_k(2,2) = 1.0;
73%     A_k(2,3) = 0;
74%     A_k(2,4) = 0;
75%     A_k(2,5) = 0;
76   
77    A_k(3,1) = dPnewdom(1,1);
78    A_k(3,2) = dPnewdth(1,1);
79    A_k(3,3) = dPnewdPo(1,1);
80    A_k(3,4) = dPnewdPot(1,1);
81    A_k(3,5) = dPnewdPt(1,1);
82   
83    A_k(4,1) = dPnewdom(1,2);
84    A_k(4,2) = dPnewdth(1,2);
85    A_k(4,3) = dPnewdPo(1,2);
86    A_k(4,4) = dPnewdPot(1,2);
87    A_k(4,5) = dPnewdPt(1,2);
88   
89    A_k(5,1) = dPnewdom(2,2);
90    A_k(5,2) = dPnewdth(2,2);
91    A_k(5,3) = dPnewdPo(2,2);
92    A_k(5,4) = dPnewdPot(2,2);
93    A_k(5,5) = dPnewdPt(2,2);
94   
95    phi = zeros(5,1);
96    phi(1) = d*ksi0(1) + e*(ib*cos(ksi0(2)) - ia*sin(ksi0(2)));
97    phi(2) = ksi0(2) + dt*ksi0(1);
98    phi(3) = Pnew(1,1);
99    phi(4) = Pnew(1,2);
100    phi(5) = Pnew(2,2);
101   
102    A_l(1:5,1:5) = A_k;
103    A_l(1:5,6) = phi - A_k*ksi0;
104    A_l(6,6) = 1.0;
105   
106    %%%
107    A_l(1,2) = 0; %maze clen e*(...), ktery se prevede do B
108    A_l(1:2,6) = [0;dt*ref_ome]; %zmena korekce, protoze je to tam uz linearni, ale posun
109    %%%
110   
111    C_k = zeros(2,5);
112    C_k(1:2,1:2) = C;
113   
114    pre_k = zeros(3,1);   
115    pre_k(1) = Pnew(1,1);
116    pre_k(2) = Pnew(1,2);
117    pre_k(3) = Pnew(2,2);   
118end
Note: See TracBrowser for help on using the browser.