Eigen

Dependencies:   Eigen

Dependents:   optWingforHAPS_Eigen hexaTest_Eigen

Revision:
56:c10f1168bd4a
Parent:
55:21611d4cf7e8
Child:
58:93ba28cf5cb3
--- a/solaESKF.cpp	Mon Nov 08 09:19:55 2021 +0000
+++ b/solaESKF.cpp	Wed Nov 10 05:21:36 2021 +0000
@@ -3,7 +3,7 @@
 
 
 solaESKF::solaESKF()
-    :pihat(3,1),vihat(3,1),qhat(4,1),accBias(3,1),gyroBias(3,1),gravity(3,1),errState(18,1),Phat(18,18),Q(18,18)
+    :pihat(3,1),vihat(3,1),qhat(4,1),accBias(3,1),gyroBias(3,1),gravity(3,1),magField(3,1),errState(19,1),Phat(19,19),Q(19,19)
 { 
     pihat << 0.0f << 0.0f << 0.0f;
     vihat << 0.0f << 0.0f << 0.0f;
@@ -11,10 +11,11 @@
     accBias << 0.0f << 0.0f << 0.0f;
     gyroBias << 0.0f << 0.0f << 0.0f;
     gravity << 0.0f << 0.0f << 9.8f;
+    magField << -0.2f << -0.0f << 0.0f;
     
-    for (int i = 1; i < 19; i++){
+    for (int i = 1; i < 20; i++){
         errState(i,1) = 0.0f;
-        for (int j = 1; j < 19; j++){
+        for (int j = 1; j < 20; j++){
             Phat(i,j) = 0.0f;
             Q(i,j) = 0.0f;
         }
@@ -28,11 +29,13 @@
     setBlockDiag(Phat,0.1f,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(Phat,0.00000001f,16,18);//gravity
+    setBlockDiag(Phat,0.1f,19,19);//gravity 
     setBlockDiag(Q,0.00025f,4,6);//velocity
     setBlockDiag(Q,0.005f/57.0f,7,9);//angle error
     setBlockDiag(Q,0.001f,10,12);//acc bias
-    setBlockDiag(Q,0.001f,13,15);//gyro bias  //positionとgravityはQ項なし
+    setBlockDiag(Q,0.001f,13,15);//gyro bias
+    setBlockDiag(Q,0.001f,19,19);//mag field  //positionとgravityはQ項なし
     
     
 }
@@ -103,149 +106,66 @@
     Phat = Fx*Phat*MatrixMath::Transpose(Fx)+Qd;
 }
 
-void solaESKF::updateAccConstraints(Matrix acc,float palt,Matrix R)
+void solaESKF::updateImuConstraints(Matrix acc,Matrix mag,Matrix R)
 {
     Matrix accm = acc - accBias;
-    Matrix tdcm(3,3);
-    computeDcm(tdcm, qhat);
-    tdcm = MatrixMath::Transpose(tdcm);
+    Matrix dcm(3,3);
+    computeDcm(dcm, qhat);
+    Matrix tdcm = MatrixMath::Transpose(dcm);
     Matrix tdcm_g = tdcm*gravity;
     Matrix a2v = MatrixMath::Matrixcross(tdcm_g(1,1),tdcm_g(2,1),tdcm_g(3,1));
+    Matrix a2v2 = -dcm*MatrixMath::Matrixcross(mag(1,1),mag(2,1),mag(3,1));
     
-    Matrix H(4,nState);
-    for (int i = 1; i < 4; i++){
-        for (int j = 1; j < 4; j++){
+    Matrix H(5,nState);
+    for (int j = 1; j < 4; j++){
+        for (int i = 1; i < 4; i++){
             H(i,j+6) =  a2v(i,j);
             H(i,j+15) = tdcm(i,j);
         }
+        H(4,j+6) =  a2v2(1,j);
+        H(5,j+6) =  a2v2(2,j);
     }
+
     H(1,10) =  -1.0f;
     H(2,11) =  -1.0f;
     H(3,12) =  -1.0f;
-    H(4,3) = 1.0f;
+    H(4,19) = 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 K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
     Matrix zacc = -accm-tdcm*gravity;
-    Matrix z(4,1);
-    z << zacc(1,1) << zacc(2,1) << zacc(3,1) << palt - pihat(3,1);
+    Matrix zmag = -dcm*mag-magField;
+    Matrix z(5,1);
+    z << zacc(1,1) << zacc(2,1) << zacc(3,1) << zmag(1,1) << zmag(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);
+    fuseErr2Nominal();
 }
 
-void solaESKF::updateGyroConstraints(Matrix gyro,Matrix R)
-{
-    Matrix gyrom = gyro - gyroBias;
-    Matrix dcm(3,3);
-    computeDcm(dcm, qhat);
-    Matrix a2v = dcm*MatrixMath::Matrixcross(gyrom(1,1),gyrom(2,1),gyrom(3,1));
-    
-    Matrix H(2,nState);
-    for (int i = 1; i < 3; i++){
-        for (int j = 1; j < 4; j++){
-            H(i,j+6) =  a2v(i,j);
-            H(i,j+12) = -dcm(i,j);
-        }
-    }
-    
-    //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);
-}
-void solaESKF::updateMag(Matrix mag,Matrix R)
-{
-    float magnorm = sqrt(mag(1,1)*mag(1,1)+mag(2,1)*mag(2,1)+mag(3,1)*mag(3,1));
-    Matrix magm = mag;
-    Matrix dcm(3,3);
-    computeDcm(dcm, qhat);
-    Matrix a2v = -dcm*MatrixMath::Matrixcross(magm(1,1),magm(2,1),magm(3,1));
-    
-    Matrix H(2,nState);
-    for (int j = 1; j < 4; j++){
-        H(1,j+6) =  a2v(1,j);
-        H(2,j+6) =  a2v(2,j);
-    }
-    
-    //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 zmag = dcm*magm;
-    Matrix z(2,1);
-    z << 0.5f-zmag(1,1) << -zmag(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);
-}
 
-void solaESKF::updateGPSVelocity(Matrix velgps,Matrix R)
-{
-    
-    Matrix H(3,nState);
-    H(1,4)  = 1.0f;
-    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 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);
-}
-
-void solaESKF::updateGPSPosition(Matrix posgps,Matrix R)
-{
-    Matrix H(2,nState);
-    H(1,1)  = 1.0f;
-    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 z(2,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);
-}
-
-void solaESKF::updateGPS(Matrix posgps,Matrix velgps,Matrix R)
+void solaESKF::updateGPS(Matrix posgps,float palt,Matrix velgps,Matrix R)
 {
     
     Matrix H(5,nState);
     H(1,1)  = 1.0f;
     H(2,2)  = 1.0f;
-    H(3,4)  = 1.0f;
-    H(4,5)  = 1.0f;
-    H(5,6)  = 1.0f;
+    H(3,3)  = 1.0f;
+    H(4,4)  = 1.0f;
+    H(5,5)  = 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 K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
     Matrix z(5,1);
-    z << posgps(1,1) - pihat(1,1) << posgps(2,1)-pihat(2,1) << velgps(1,1) - vihat(1,1) << velgps(2,1)-vihat(2,1) << velgps(3,1) - vihat(3,1);
+    z << posgps(1,1) - pihat(1,1) << posgps(2,1)-pihat(2,1) << palt - pihat(3,1) << velgps(1,1) - vihat(1,1) << velgps(2,1)-vihat(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);
+    fuseErr2Nominal();
 }
 
 Matrix solaESKF::computeAngles()
@@ -293,7 +213,12 @@
     gravity(2,1) += errState(17,1);
     gravity(3,1) += errState(18,1);
     
-    for (int i = 1; i < 19; i++){
+    //gravity bias
+    magField(1,1) += errState(19,1);
+    magField(2,1)  = 0.0f;
+    magField(3,1)  = 0.0f;
+    
+    for (int i = 1; i < 20; i++){
         errState(i,1) = 0.0f;
     }
 
@@ -376,6 +301,10 @@
 {
     return gravity;
 }
+Matrix solaESKF::getMagField()
+{
+    return magField;
+}
 Matrix solaESKF::getErrState()
 {
     return errState;
@@ -405,6 +334,10 @@
 {
     setBlockDiag(Phat,val,16,18);
 }
+void solaESKF::setPhatMagField(float val)
+{
+    setBlockDiag(Phat,val,19,19);
+}
 
 
 void solaESKF::setQVelocity(float val)
@@ -423,6 +356,10 @@
 {
     setBlockDiag(Q,val,13,15);
 }
+void solaESKF::setQMagField(float val)
+{
+    setBlockDiag(Q,val,19,19);
+}
 
 
 void solaESKF::setDiag(Matrix& mat, float val){
@@ -439,5 +376,143 @@
 
 void solaESKF::setPihat(float pi_x, float pi_y, float pi_z)
 {
-    pihat << pi_x << pi_y << pi_z;
-}
\ No newline at end of file
+    pihat(1,1) = pi_x;
+    pihat(2,1) = pi_y;
+    pihat(3,1) = pi_z;
+}
+void solaESKF::setMagField(float hx, float hy, float hz)
+{
+    magField(1,1) = -sqrt(hx*hx+hy*hy);
+    magField(2,1) = 0.0f;
+    magField(3,1) = 0.0f;
+}
+
+/*
+void solaESKF::updateAccConstraints(Matrix acc,float palt,Matrix R)
+{
+    Matrix accm = acc - accBias;
+    Matrix tdcm(3,3);
+    computeDcm(tdcm, qhat);
+    tdcm = MatrixMath::Transpose(tdcm);
+    Matrix tdcm_g = tdcm*gravity;
+    Matrix a2v = MatrixMath::Matrixcross(tdcm_g(1,1),tdcm_g(2,1),tdcm_g(3,1));
+    
+    Matrix H(4,nState);
+    for (int i = 1; i < 4; i++){
+        for (int j = 1; j < 4; j++){
+            H(i,j+6) =  a2v(i,j);
+            H(i,j+15) = tdcm(i,j);
+        }
+    }
+    H(1,10) =  -1.0f;
+    H(2,11) =  -1.0f;
+    H(3,12) =  -1.0f;
+    H(4,3) = 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 K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
+    Matrix zacc = -accm-tdcm*gravity;
+    Matrix z(4,1);
+    z << zacc(1,1) << zacc(2,1) << zacc(3,1) << palt - 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);
+    fuseErr2Nominal();
+}
+
+void solaESKF::updateGyroConstraints(Matrix gyro,Matrix R)
+{
+    Matrix gyrom = gyro - gyroBias;
+    Matrix dcm(3,3);
+    computeDcm(dcm, qhat);
+    Matrix a2v = dcm*MatrixMath::Matrixcross(gyrom(1,1),gyrom(2,1),gyrom(3,1));
+    
+    Matrix H(2,nState);
+    for (int i = 1; i < 3; i++){
+        for (int j = 1; j < 4; j++){
+            H(i,j+6) =  a2v(i,j);
+            H(i,j+12) = -dcm(i,j);
+        }
+    }
+    //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);
+    fuseErr2Nominal();
+}
+void solaESKF::updateMag(Matrix mag, Matrix R)
+{
+    Matrix dcm(3,3);
+    computeDcm(dcm, qhat);
+    Matrix a2v = -dcm*MatrixMath::Matrixcross(mag(1,1),mag(2,1),mag(3,1));
+    
+    Matrix H(2,nState);
+    for (int i = 1; i < 3; i++){
+        for (int j = 1; j < 4; j++){
+            H(i,j+6) =  a2v(i,j);
+        }
+    }
+    H(1,19) = 1.0f;
+    //H(3,20) = 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 K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
+    Matrix zmag = -dcm*mag-magField;
+    Matrix z(2,1);
+    z << zmag(1,1) << zmag(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);
+    fuseErr2Nominal();
+}
+
+void solaESKF::updateGPSVelocity(Matrix velgps,Matrix R)
+{
+    
+    Matrix H(3,nState);
+    H(1,4)  = 1.0f;
+    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 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);
+    fuseErr2Nominal();
+}
+
+void solaESKF::updateGPSPosition(Matrix posgps,Matrix R)
+{
+    Matrix H(2,nState);
+    H(1,1)  = 1.0f;
+    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 z(2,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);
+    fuseErr2Nominal();
+}
+*/
\ No newline at end of file