Eigen

Dependencies:   Eigen

Dependents:   optWingforHAPS_Eigen hexaTest_Eigen

Revision:
47:2467de40951f
Parent:
46:15988dc41923
Child:
48:06ed39e3376e
Child:
50:dadad0567349
--- a/solaESKF.cpp	Thu Oct 28 09:44:34 2021 +0000
+++ b/solaESKF.cpp	Fri Oct 29 13:30:03 2021 +0000
@@ -24,20 +24,22 @@
     
     
     nState = errState.getRows();
+    
     setBlockDiag(Phat,0.1f,1,3);//position
     setBlockDiag(Phat,0.1f,4,6);//velocity
     setBlockDiag(Phat,0.1f,7,9);//angle error
-    setBlockDiag(Phat,0.01f,10,12);//acc bias
-    setBlockDiag(Phat,0.01f,13,15);//gyro bias
-    setBlockDiag(Phat,0.00001f,16,18);//gravity 
-    setBlockDiag(Q,0.0001f,4,6);//velocity
-    setBlockDiag(Q,0.00001f,7,9);//angle error
+    setBlockDiag(Phat,0.1f,10,12);//acc bias
+    setBlockDiag(Phat,0.1f,13,15);//gyro bias
+    setBlockDiag(Phat,0.00000001f,16,18);//gravity 
+    setBlockDiag(Q,0.00025f,4,6);//velocity
+    setBlockDiag(Q,0.005f/57.0,7,9);//angle error
     setBlockDiag(Q,0.001f,10,12);//acc bias
     setBlockDiag(Q,0.001f,13,15);//gyro bias  //positionとgravityはQ項なし
     
     
 }
 
+
 void solaESKF::updateNominal(Matrix acc, Matrix gyro,float att_dt)
 {
     Matrix gyrom = gyro  - gyroBias;
@@ -64,85 +66,43 @@
     
     Matrix dcm(3,3);
     computeDcm(dcm, qhat);
-    Matrix a2v = -dcm*MatrixMath::Matrixcross(accm(1,1),accm(2,1),accm(3,1))*att_dt;
-    Matrix a2v2 = 0.5f*a2v*att_dt;
+    Matrix a2v = -dcm*MatrixMath::Matrixcross(accm(1,1),accm(2,1),accm(3,1));
     
-    Matrix Fx(nState,nState);
+    Matrix A(nState,nState);
     //position
-    Fx(1,1) =  1.0f;
-    Fx(2,2) =  1.0f;
-    Fx(3,3) =  1.0f;
-    Fx(1,4) =  1.0f*att_dt;
-    Fx(2,5) =  1.0f*att_dt;
-    Fx(3,6) =  1.0f*att_dt;
+    A(1,4) =  1.0f;
+    A(2,5) =  1.0f;
+    A(3,6) =  1.0f;
+    
+    //velocity
     for (int i = 1; i < 4; i++){
         for (int j = 1; j < 4; j++){
-            Fx(i,j+6) = a2v2(i,j);
-            Fx(i,j+9) = -0.5f*dcm(i,j)*att_dt*att_dt;
-        }
-        Fx(i,i+15) = 0.5f*att_dt*att_dt;
-    }
-    
-    
-    //velocity
-    Fx(4,4) =  1.0f;
-    Fx(5,5) =  1.0f;
-    Fx(6,6) =  1.0f;
-    for (int i = 1; i < 4; i++){
-        for (int j = 1; j < 4; j++){
-            Fx(i+3,j+6) = a2v(i,j);
-            Fx(i+3,j+9) = -dcm(i,j)*att_dt;
-            Fx(i+3,j+12) = -a2v2(i,j);
+            A(i+3,j+6) = a2v(i,j);
+            A(i+3,j+9) = -dcm(i,j);
+
         }
     }
-    Fx(4,16) =  1.0f*att_dt;
-    Fx(5,17) =  1.0f*att_dt;
-    Fx(6,18) =  1.0f*att_dt;
+    A(4,16) =  1.0f;
+    A(5,17) =  1.0f;
+    A(6,18) =  1.0f;
     
     //angulat error
-    Fx(7,7) =  1.0f;
-    Fx(8,8) =  1.0f;
-    Fx(9,9) =  1.0f;
-    Fx(7,8) =  gyrom(3,1)*att_dt;
-    Fx(7,9) = -gyrom(2,1)*att_dt;
-    Fx(8,7) = -gyrom(3,1)*att_dt;
-    Fx(8,9) =  gyrom(1,1)*att_dt;
-    Fx(9,7) =  gyrom(2,1)*att_dt;
-    Fx(9,8) = -gyrom(1,1)*att_dt;
-    Fx(7,13) =  -1.0f*att_dt;
-    Fx(8,14) =  -1.0f*att_dt;
-    Fx(9,15) =  -1.0f*att_dt;
+    A(7,8) =  gyrom(3,1);
+    A(7,9) = -gyrom(2,1);
+    A(8,7) = -gyrom(3,1);
+    A(8,9) =  gyrom(1,1);
+    A(9,7) =  gyrom(2,1);
+    A(9,8) = -gyrom(1,1);
+    A(7,13) =  -1.0f;
+    A(8,14) =  -1.0f;
+    A(9,15) =  -1.0f;
     
-    //acc bias
-    Fx(10,10) =  1.0f;
-    Fx(11,11) =  1.0f;
-    Fx(12,12) =  1.0f;
-    
-    //gyro bias
-    Fx(13,13) =  1.0f;
-    Fx(14,14) =  1.0f;
-    Fx(15,15) =  1.0f;
-    
-    //gravity bias
-    Fx(16,16) =  1.0f;
-    Fx(17,17) =  1.0f;
-    Fx(18,18) =  1.0f;
+
+    Matrix Fx = MatrixMath::Eye(nState) + A * att_dt;// + (0.5f*att_dt*att_dt) * A * A;
+    Matrix Qd = Q * att_dt + 0.5f*A*Q * att_dt * att_dt+ 0.5f*Q*MatrixMath::Transpose(A) * att_dt * att_dt;
     
     errState = Fx * errState;
-    Matrix Qi(nState,nState);
-    for (int i = 1; i < 4; i++){
-        Qi(i,i) = 0.0f;
-    }
-    for (int i = 4; i < 10; i++){
-        Qi(i,i) = Q(i,i)*att_dt*att_dt;
-    }
-    for (int i = 10; i < 16; i++){
-        Qi(i,i) = Q(i,i)*att_dt;
-    }
-    for (int i = 16; i < 19; i++){
-        Qi(i,i) = 0.0f;
-    }  
-    Phat = Fx*Phat*MatrixMath::Transpose(Fx)+Qi;
+    Phat = Fx*Phat*MatrixMath::Transpose(Fx)+Qd;
 }
 
 void solaESKF::updateAccConstraints(Matrix acc,Matrix R)
@@ -165,11 +125,13 @@
     H(2,11) =  -1.0f;
     H(3,12) =  -1.0f;
     
-    Matrix A = H*Phat*MatrixMath::Transpose(H)+R;
-    Matrix K = (Phat*MatrixMath::Transpose(H))*(MatrixMath::Inv(MatrixMath::Transpose(A)*A+10.0f*MatrixMath::Eye(3))*MatrixMath::Transpose(A));
-    
+    //Matrix A = H*Phat*MatrixMath::Transpose(H)+R;
+    //Matrix K = (Phat*MatrixMath::Transpose(H))*(MatrixMath::Inv(MatrixMath::Transpose(A)*A+10.0f*MatrixMath::Eye(3))*MatrixMath::Transpose(A));
+    Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
     Matrix z = -accm-tdcm*gravity;
     errState =  K * z;
+    //Phat = (MatrixMath::Eye(nState)-K*H)*Phat;
+    //Phat = Phat-K*(H*Phat*MatrixMath::Transpose(H)+R)*MatrixMath::Transpose(K);
     Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*R*MatrixMath::Transpose(K);
 }
 
@@ -188,13 +150,16 @@
         }
     }
     
-    Matrix A = H*Phat*MatrixMath::Transpose(H)+R;
-    Matrix K = (Phat*MatrixMath::Transpose(H))*(MatrixMath::Inv(MatrixMath::Transpose(A)*A+10.0f*MatrixMath::Eye(2))*MatrixMath::Transpose(A));
+    //Matrix A = H*Phat*MatrixMath::Transpose(H)+R;
+    //Matrix K = (Phat*MatrixMath::Transpose(H))*(MatrixMath::Inv(MatrixMath::Transpose(A)*A+10.0f*MatrixMath::Eye(2))*MatrixMath::Transpose(A));
+    Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
     
     Matrix z3 = -dcm*gyrom;
     Matrix z(2,1);
     z << z3(1,1) << z3(2,1);
     errState =  K * z;
+    //Phat = (MatrixMath::Eye(nState)-K*H)*Phat;
+    //Phat = Phat-K*(H*Phat*MatrixMath::Transpose(H)+R)*MatrixMath::Transpose(K);
     Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*R*MatrixMath::Transpose(K);
 }
 
@@ -207,11 +172,13 @@
     H(2,5)  = 1.0f;
     H(3,6)  = 1.0f;
     
-    Matrix A = H*Phat*MatrixMath::Transpose(H)+R;
-    Matrix K = (Phat*MatrixMath::Transpose(H))*(MatrixMath::Inv(MatrixMath::Transpose(A)*A+10.0f*MatrixMath::Eye(3))*MatrixMath::Transpose(A));
+    //Matrix A = H*Phat*MatrixMath::Transpose(H)+R;
+    //Matrix K = (Phat*MatrixMath::Transpose(H))*(MatrixMath::Inv(MatrixMath::Transpose(A)*A+10.0f*MatrixMath::Eye(3))*MatrixMath::Transpose(A));
+    Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
     Matrix z(3,1);
     z << velgps(1,1) - vihat(1,1) << velgps(2,1)-vihat(2,1) << velgps(3,1) - vihat(3,1);
     errState =  K * z;
+    //Phat = (MatrixMath::Eye(nState)-K*H)*Phat;
     //Phat = Phat-K*(H*Phat*MatrixMath::Transpose(H)+R)*MatrixMath::Transpose(K);
     Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*R*MatrixMath::Transpose(K);
 }
@@ -223,12 +190,13 @@
     H(2,2)  = 1.0f;
     H(3,3)  = 1.0f;
     
-    Matrix A = H*Phat*MatrixMath::Transpose(H)+R;
-    Matrix K = (Phat*MatrixMath::Transpose(H))*(MatrixMath::Inv(MatrixMath::Transpose(A)*A+1000.0f*MatrixMath::Eye(3))*MatrixMath::Transpose(A));
-    //Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
+    //Matrix A = H*Phat*MatrixMath::Transpose(H)+R;
+    //Matrix K = (Phat*MatrixMath::Transpose(H))*(MatrixMath::Inv(MatrixMath::Transpose(A)*A+1000.0f*MatrixMath::Eye(3))*MatrixMath::Transpose(A));
+    Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
     Matrix z(3,1);
     z << posgps(1,1) - pihat(1,1) << posgps(2,1)-pihat(2,1) << posgps(3,1) - pihat(3,1);
     errState =  K * z;
+    //Phat = (MatrixMath::Eye(nState)-K*H)*Phat;
     //Phat = Phat-K*(H*Phat*MatrixMath::Transpose(H)+R)*MatrixMath::Transpose(K);
     Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*R*MatrixMath::Transpose(K);
 }
@@ -297,6 +265,10 @@
     gravity(1,1) += errState(16,1);
     gravity(2,1) += errState(17,1);
     gravity(3,1) += errState(18,1);
+    
+    for (int i = 1; i < 19; i++){
+        errState(i,1) = 0.0f;
+    }
 
 }
 
@@ -345,13 +317,85 @@
         qhat(4,1) = sin_z_2*cos_y_2*cos_x_2 - cos_z_2*sin_y_2*sin_x_2;    
 }
 
+
+
 void solaESKF::setGravity(float gx,float gy,float gz)
 {
     gravity(1,1) = gx;
     gravity(2,1) = gy;
     gravity(3,1) = gz;
 }
+Matrix solaESKF::getPihat()
+{
+    return pihat;
+}
+Matrix solaESKF::getVihat()
+{
+    return vihat;
+}
+Matrix solaESKF::getQhat()
+{
+    return qhat;
+}
+Matrix solaESKF::getAccBias()
+{
+    return accBias;
+}
+Matrix solaESKF::getGyroBias()
+{
+    return gyroBias;
+}
+Matrix solaESKF::getGravity()
+{
+    return gravity;
+}
+Matrix solaESKF::getErrState()
+{
+    return errState;
+}
 
+void solaESKF::setPhatPosition(float val)
+{
+    setBlockDiag(Phat,val,1,3);
+}
+void solaESKF::setPhatVelocity(float val)
+{
+    setBlockDiag(Phat,val,4,6);
+}
+void solaESKF::setPhatAngleError(float val)
+{
+    setBlockDiag(Phat,val,7,9);
+}
+void solaESKF::setPhatAccBias(float val)
+{
+    setBlockDiag(Phat,val,10,12);
+}
+void solaESKF::setPhatGyroBias(float val)
+{
+    setBlockDiag(Phat,val,13,15);
+}
+void solaESKF::setPhatGravity(float val)
+{
+    setBlockDiag(Phat,val,16,18);
+}
+
+
+void solaESKF::setQVelocity(float val)
+{
+    setBlockDiag(Q,val,4,6);
+}
+void solaESKF::setQAngleError(float val)
+{
+    setBlockDiag(Q,val,7,9);
+}
+void solaESKF::setQAccBias(float val)
+{
+    setBlockDiag(Q,val,10,12);
+}
+void solaESKF::setQGyroBias(float val)
+{
+    setBlockDiag(Q,val,13,15);
+}
 
 
 void solaESKF::setDiag(Matrix& mat, float val){