Eigen

Dependencies:   Eigen

Dependents:   optWingforHAPS_Eigen hexaTest_Eigen

Revision:
69:2b2815603e5a
Parent:
68:264a7e0e4a29
--- a/solaESKF.cpp	Thu Nov 18 10:10:07 2021 +0000
+++ b/solaESKF.cpp	Fri Nov 19 05:44:14 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),magBias(3,1),errState(20,1),Phat(20,20),Q(20,20)
+    :pihat(3,1),vihat(3,1),qhat(4,1),accBias(3,1),gyroBias(3,1),gravity(3,1),magBias(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;
@@ -12,7 +12,6 @@
     gyroBias << 0.0f << 0.0f << 0.0f;
     gravity << 0.0f << 0.0f << 9.8f;
     magBias << 0.0f << 0.0f << 0.0f;
-    magRadius = 0.0f;
 
     nState = errState.getRows();
 
@@ -31,13 +30,11 @@
     setBlockDiag(Phat,0.1f,13,15);//gyro bias
     setBlockDiag(Phat,0.00000001f,16,16);//gravity
     setBlockDiag(Phat,0.001f,17,19);//magBias
-    setBlockDiag(Phat,0.001f,20,20);//magRadius
     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
-    setBlockDiag(Q,0.001f,17,19);//magRadius
-    setBlockDiag(Q,0.0001f,20,20);//magRadius  //positionとgravityはQ項なし
+    setBlockDiag(Q,0.001f,17,19);//mag bias //positionとgravityはQ項なし
     
 }
 
@@ -220,7 +217,7 @@
 void solaESKF::updateImuConstraints(Matrix acc,Matrix mag,Matrix R)
 {
     Matrix accm = acc - accBias;
-    Matrix magm = mag;
+    Matrix magm = mag-  magBias;
     Matrix dcm(3,3);
     computeDcm(dcm, qhat);
     Matrix tdcm = MatrixMath::Transpose(dcm);
@@ -228,7 +225,8 @@
     Matrix rotgrav = MatrixMath::Matrixcross(tdcm_g(1,1),tdcm_g(2,1),tdcm_g(3,1));
     Matrix rotmag = -dcm*MatrixMath::Matrixcross(magm(1,1),magm(2,1),magm(3,1));
     
-    Matrix H(5,nState);
+    Matrix H(4,nState);
+    int nH = 4;
     for (int i = 1; i < 4; i++){
         for (int j = 1; j < 4; j++){
             H(i,j+6) =  rotgrav(i,j);
@@ -243,19 +241,19 @@
     Matrix magned = dcm*magm;
     float hx = sqrt(magned(1,1)*magned(1,1)+magned(2,1)*magned(2,1));
     
-    for(int j = 3; j < 4; j++){
-        H(4,j+6) =  rotmag(1,j)-(rotmag(1,j)+rotmag(2,j))/hx;
-        //H(4,j+16) =  -dcm(1,j)+(dcm(1,j)+dcm(2,j))/hx;
-        H(5,j+6) =  rotmag(2,j);
+    H(4,3+6) =  rotmag(1,3)-(rotmag(1,3)+rotmag(2,3))/hx;
+    for(int j = 1; j < 4; j++){
+        H(4,j+16) =  -dcm(1,j)+(dcm(1,j)+dcm(2,j))/hx;
+        //H(5,j+6) =  rotmag(2,j);
         //H(5,j+16) =  -dcm(2,j);
     }
     
     Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
     Matrix zacc = -accm-tdcm*gravity;
     Matrix zmag = dcm*magm;
-    Matrix z(5,1);
-    z << zacc(1,1) << zacc(2,1) << zacc(3,1) << -(zmag(1,1) - hx) << -zmag(2,1);
-    //twelite.printf("%f %f\r\n",hx,(zmag(1,1) - hx));
+    Matrix z(nH,1);
+    z << zacc(1,1) << zacc(2,1) << zacc(3,1) << -(zmag(1,1) - hx);
+    twelite.printf("%f %f\r\n",hx,(zmag(1,1) - hx));
     errState =  K * z;
     Phat = (MatrixMath::Eye(nState)-K*H)*Phat;
     
@@ -263,28 +261,6 @@
 }
 
 
-void solaESKF::updateOtherConstraints(Matrix mag,float palt,Matrix R)
-{
-    Matrix magm = mag - magBias;
-    float a = sqrt(magm(1,1)*magm(1,1)+magm(2,1)*magm(2,1)+magm(3,1)*magm(3,1));
-    Matrix H(2,nState);
-    H(1,20) = -1.0f;
-    H(1,17) = -magm(1,1)/a;
-    H(1,18) = -magm(2,1)/a;
-    H(1,19) = -magm(3,1)/a;
-    H(2,3) = 1.0f;
-
-    Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
-    
-    Matrix z(2,1);
-    z << -(a-magRadius) << palt-pihat(3,1);
-    //twelite.printf("%f %f\r\n",hx,(zmag(1,1) - hx));
-    errState =  K * z;
-    Phat = (MatrixMath::Eye(nState)-K*H)*Phat;
-    
-    fuseErr2Nominal();
-}
-
 
 void solaESKF::updateGPS(Matrix posgps,float palt,Matrix velgps,Matrix R)
 {
@@ -352,7 +328,6 @@
     magBias(1,1) += errState(17,1);
     magBias(2,1) += errState(18,1);
     magBias(3,1) += errState(19,1);
-    magRadius += errState(20,1);
     
     
     for (int i = 1; i < nState+1; i++){
@@ -443,10 +418,6 @@
 {
     return magBias;
 }
-float solaESKF::getMagRadius()
-{
-    return magRadius;
-}
 Matrix solaESKF::getErrState()
 {
     return errState;
@@ -480,10 +451,6 @@
 {
     setBlockDiag(Phat,val,17,19);
 }
-void solaESKF::setPhatMagRadius(float val)
-{
-    setBlockDiag(Phat,val,20,20);
-}
 
 
 void solaESKF::setQVelocity(float val)
@@ -506,10 +473,7 @@
 {
     setBlockDiag(Q,val,17,19);
 }
-void solaESKF::setQMagRadius(float val)
-{
-    setBlockDiag(Q,val,20,20);
-}
+
 
 
 void solaESKF::setDiag(Matrix& mat, float val){