Eigen

Dependencies:   Eigen

Dependents:   optWingforHAPS_Eigen hexaTest_Eigen

Committer:
NaotoMorita
Date:
Wed Sep 29 04:50:42 2021 +0000
Revision:
32:321a756e12ad
Parent:
31:e655d4d8e4d6
Child:
34:dec4b37db3f1
Child:
36:b1d107b00351
Child:
37:7873fe37b425
newer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NaotoMorita 19:3fae66745363 1 #include "ScErrStateEKF.hpp"
NaotoMorita 19:3fae66745363 2 #include "Matrix.h"
NaotoMorita 19:3fae66745363 3 #include "MatrixMath.h"
NaotoMorita 19:3fae66745363 4 #include <cmath>
NaotoMorita 19:3fae66745363 5 #include "Vector3.hpp"
NaotoMorita 19:3fae66745363 6
NaotoMorita 19:3fae66745363 7
NaotoMorita 19:3fae66745363 8 using namespace std;
NaotoMorita 19:3fae66745363 9
NaotoMorita 19:3fae66745363 10 ScErrStateEKF::ScErrStateEKF()
NaotoMorita 31:e655d4d8e4d6 11 :qhat(4,1),vihat(3,1), errState(9,1), bgState(3,1), Phat(9,9), Q(9,9),Phatbg(3,3),Qbg(3,3), Ra(3,3), Rgps(3,3),Rsr(1,1), Rm(3,3), Qab(3,3),Rgsc(2,2),Rvsc(2,2),accBias(0.0f,0.0f,0.0f),gyroBias(0.0f,0.0f,0.0f)
NaotoMorita 19:3fae66745363 12 {
NaotoMorita 21:d6079def0473 13 nState = errState.getRows();
NaotoMorita 19:3fae66745363 14 qhat << 1.0f << 0.0f << 0.0f << 0.0f;
NaotoMorita 19:3fae66745363 15
NaotoMorita 21:d6079def0473 16 setDiag(Phat,0.1f);
NaotoMorita 31:e655d4d8e4d6 17 setDiag(Phatbg,0.1f);
NaotoMorita 21:d6079def0473 18 setQqerr(0.000005f);
NaotoMorita 32:321a756e12ad 19 setQgbias(0.001f);
NaotoMorita 31:e655d4d8e4d6 20 setQabias(0.00001f);
NaotoMorita 32:321a756e12ad 21 setQv(0.0001f);
NaotoMorita 19:3fae66745363 22
NaotoMorita 20:37d3c3ee36e9 23 //加速度の観測
NaotoMorita 23:1509648c2318 24 setDiag(Ra,0.005f);
NaotoMorita 32:321a756e12ad 25 setDiag(Qab,10.0f);
NaotoMorita 20:37d3c3ee36e9 26
NaotoMorita 20:37d3c3ee36e9 27 //ジャイロバイアスに関する制約
NaotoMorita 22:7d84b8bc20b4 28 setDiag(Rgsc,500.0f);
NaotoMorita 20:37d3c3ee36e9 29
NaotoMorita 21:d6079def0473 30 setDiag(Rm,5.0f);
NaotoMorita 19:3fae66745363 31
NaotoMorita 31:e655d4d8e4d6 32 setDiag(Rgps,5.5f);
NaotoMorita 31:e655d4d8e4d6 33 setDiag(Rsr,5.5f);
NaotoMorita 26:73c3f58b9d70 34
NaotoMorita 19:3fae66745363 35 for(int i = 0; i<10;i++){
NaotoMorita 19:3fae66745363 36 histffunc[i] = 0.0f;
NaotoMorita 19:3fae66745363 37 }
NaotoMorita 19:3fae66745363 38 histffuncindex = 0 ;
NaotoMorita 19:3fae66745363 39 sigma2a = 0.000020f;
NaotoMorita 19:3fae66745363 40
NaotoMorita 19:3fae66745363 41
NaotoMorita 19:3fae66745363 42 }
NaotoMorita 19:3fae66745363 43
NaotoMorita 23:1509648c2318 44 void ScErrStateEKF::updateNominal(Vector3 gyro, Vector3 acc, Vector3 accref, float att_dt)
NaotoMorita 19:3fae66745363 45 {
NaotoMorita 19:3fae66745363 46 gyro -= gyroBias;
NaotoMorita 23:1509648c2318 47 acc -= accBias;
NaotoMorita 19:3fae66745363 48 Matrix A(4,4);
NaotoMorita 19:3fae66745363 49 A << 0.0f << -0.5f*gyro.x <<-0.5f*gyro.y <<-0.5f*gyro.z
NaotoMorita 19:3fae66745363 50 << 0.5f*gyro.x << 0.0f << 0.5f*gyro.z <<-0.5f*gyro.y
NaotoMorita 19:3fae66745363 51 << 0.5f*gyro.y << -0.5f*gyro.z << 0.0f << 0.5f*gyro.x
NaotoMorita 19:3fae66745363 52 << 0.5f*gyro.z << 0.5f*gyro.y <<-0.5f*gyro.x << 0.0f ;
NaotoMorita 19:3fae66745363 53
NaotoMorita 20:37d3c3ee36e9 54 Matrix phi = MatrixMath::Eye(4) + A * att_dt + (0.5f*att_dt*att_dt) * A * A;
NaotoMorita 19:3fae66745363 55 qhat = phi * qhat;
NaotoMorita 19:3fae66745363 56 float qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qhat),qhat));
NaotoMorita 19:3fae66745363 57 qhat *= (1.0f/ qnorm);
NaotoMorita 23:1509648c2318 58
NaotoMorita 23:1509648c2318 59 Matrix dcm(3,3);
NaotoMorita 23:1509648c2318 60 computeDcm(dcm, qhat);
NaotoMorita 23:1509648c2318 61 vihat += (MatrixMath::Transpose(dcm)*MatrixMath::Vector2mat(acc)-MatrixMath::Vector2mat(accref))*att_dt*9.8f;
NaotoMorita 19:3fae66745363 62 }
NaotoMorita 19:3fae66745363 63
NaotoMorita 23:1509648c2318 64 void ScErrStateEKF::updateErrState(Vector3 gyro,Vector3 acc, float att_dt)
NaotoMorita 23:1509648c2318 65 {
NaotoMorita 23:1509648c2318 66 gyro -= gyroBias;
NaotoMorita 23:1509648c2318 67 acc -= accBias;
NaotoMorita 23:1509648c2318 68 Matrix A(nState,nState);
NaotoMorita 23:1509648c2318 69 A(1,2) = gyro.z;
NaotoMorita 23:1509648c2318 70 A(1,3) = -gyro.y;
NaotoMorita 23:1509648c2318 71 A(2,1) = -gyro.z;
NaotoMorita 23:1509648c2318 72 A(2,3) = gyro.x;
NaotoMorita 23:1509648c2318 73 A(3,1) = gyro.y;
NaotoMorita 23:1509648c2318 74 A(3,2) = -gyro.x;
NaotoMorita 23:1509648c2318 75
NaotoMorita 23:1509648c2318 76 Matrix dcm(3,3);
NaotoMorita 23:1509648c2318 77 computeDcm(dcm, qhat);
NaotoMorita 23:1509648c2318 78 Matrix qeterm = -2.0f*9.8f*MatrixMath::Transpose(dcm)*MatrixMath::Matrixcross(acc.x,acc.y,acc.z);
NaotoMorita 23:1509648c2318 79 Matrix baterm = -9.8f*MatrixMath::Transpose(dcm);
NaotoMorita 23:1509648c2318 80 for (int i = 1; i < 4; i++){
NaotoMorita 23:1509648c2318 81 for (int j = 1; i < 4; i++){
NaotoMorita 31:e655d4d8e4d6 82 A(i+6,j) = qeterm(i,j);
NaotoMorita 31:e655d4d8e4d6 83 A(i+6,j+3) = baterm(i,j);
NaotoMorita 23:1509648c2318 84 }
NaotoMorita 23:1509648c2318 85 }
NaotoMorita 23:1509648c2318 86
NaotoMorita 23:1509648c2318 87 Matrix phi = MatrixMath::Eye(nState) + A * att_dt + (0.5f*att_dt*att_dt) * A * A;
NaotoMorita 23:1509648c2318 88 Matrix Qd = Q * att_dt + 0.5f*A*Q * att_dt * att_dt+ 0.5f*Q*MatrixMath::Transpose(A) * att_dt * att_dt;
NaotoMorita 23:1509648c2318 89 errState = phi * errState;
NaotoMorita 23:1509648c2318 90 Phat = phi*Phat*MatrixMath::Transpose(phi)+Qd;
NaotoMorita 23:1509648c2318 91 }
NaotoMorita 20:37d3c3ee36e9 92 void ScErrStateEKF::setQqerr(float val){
NaotoMorita 20:37d3c3ee36e9 93 Q(1,1) = val;
NaotoMorita 20:37d3c3ee36e9 94 Q(2,2) = val;
NaotoMorita 20:37d3c3ee36e9 95 Q(3,3) = val;
NaotoMorita 20:37d3c3ee36e9 96 }
NaotoMorita 20:37d3c3ee36e9 97
NaotoMorita 20:37d3c3ee36e9 98 void ScErrStateEKF::setQgbias(float val){
NaotoMorita 31:e655d4d8e4d6 99 Qbg(1,1) = val;
NaotoMorita 31:e655d4d8e4d6 100 Qbg(2,2) = val;
NaotoMorita 31:e655d4d8e4d6 101 Qbg(2,2) = val;
NaotoMorita 31:e655d4d8e4d6 102 }
NaotoMorita 31:e655d4d8e4d6 103 void ScErrStateEKF::setQabias(float val){
NaotoMorita 20:37d3c3ee36e9 104 Q(4,4) = val;
NaotoMorita 20:37d3c3ee36e9 105 Q(5,5) = val;
NaotoMorita 20:37d3c3ee36e9 106 Q(6,6) = val;
NaotoMorita 20:37d3c3ee36e9 107 }
NaotoMorita 31:e655d4d8e4d6 108 void ScErrStateEKF::setQv(float val){
NaotoMorita 20:37d3c3ee36e9 109 Q(7,7) = val;
NaotoMorita 20:37d3c3ee36e9 110 Q(8,8) = val;
NaotoMorita 20:37d3c3ee36e9 111 Q(9,9) = val;
NaotoMorita 20:37d3c3ee36e9 112 }
NaotoMorita 21:d6079def0473 113
NaotoMorita 20:37d3c3ee36e9 114 void ScErrStateEKF::setQab(float val){
NaotoMorita 21:d6079def0473 115 setDiag(Qab,val);
NaotoMorita 20:37d3c3ee36e9 116 }
NaotoMorita 20:37d3c3ee36e9 117
NaotoMorita 23:1509648c2318 118
NaotoMorita 20:37d3c3ee36e9 119 void ScErrStateEKF::setRsoftconst(float Vgsc,float Vvsc){
NaotoMorita 21:d6079def0473 120 setDiag(Rgsc,Vgsc);
NaotoMorita 23:1509648c2318 121 setDiag(Rvsc,Vvsc);
NaotoMorita 20:37d3c3ee36e9 122 }
NaotoMorita 20:37d3c3ee36e9 123
NaotoMorita 21:d6079def0473 124 void ScErrStateEKF::setDiag(Matrix& mat, float val){
NaotoMorita 21:d6079def0473 125 for (int i = 1; i < mat.getCols()+1; i++){
NaotoMorita 21:d6079def0473 126 mat(i,i) = val;
NaotoMorita 21:d6079def0473 127 }
NaotoMorita 21:d6079def0473 128 }
NaotoMorita 20:37d3c3ee36e9 129
NaotoMorita 25:07ac5c6cd61c 130 void ScErrStateEKF::getQhat(float (&res)[4]){
NaotoMorita 25:07ac5c6cd61c 131 for (int i = 0; i < 4; i++){
NaotoMorita 25:07ac5c6cd61c 132 res[i] = qhat(i+1,1);
NaotoMorita 25:07ac5c6cd61c 133 }
NaotoMorita 25:07ac5c6cd61c 134 }
NaotoMorita 25:07ac5c6cd61c 135
NaotoMorita 25:07ac5c6cd61c 136 void ScErrStateEKF::getVihat(float (&res)[3]){
NaotoMorita 25:07ac5c6cd61c 137 for (int i = 0; i < 3; i++){
NaotoMorita 25:07ac5c6cd61c 138 res[i] = vihat(i+1,1);
NaotoMorita 25:07ac5c6cd61c 139 }
NaotoMorita 25:07ac5c6cd61c 140 }
NaotoMorita 25:07ac5c6cd61c 141
NaotoMorita 25:07ac5c6cd61c 142 void ScErrStateEKF::getGyroBias(float (&resVal)[3], float (&resCov)[6]){
NaotoMorita 25:07ac5c6cd61c 143 resVal[0] = gyroBias.x;
NaotoMorita 25:07ac5c6cd61c 144 resVal[1] = gyroBias.y;
NaotoMorita 25:07ac5c6cd61c 145 resVal[2] = gyroBias.z;
NaotoMorita 31:e655d4d8e4d6 146 resCov[0] = Phatbg(1,1);
NaotoMorita 31:e655d4d8e4d6 147 resCov[1] = Phatbg(1,2);
NaotoMorita 31:e655d4d8e4d6 148 resCov[2] = Phatbg(1,3);
NaotoMorita 31:e655d4d8e4d6 149 resCov[3] = Phatbg(2,2);
NaotoMorita 31:e655d4d8e4d6 150 resCov[4] = Phatbg(2,3);
NaotoMorita 31:e655d4d8e4d6 151 resCov[5] = Phatbg(3,3);
NaotoMorita 25:07ac5c6cd61c 152
NaotoMorita 25:07ac5c6cd61c 153 }
NaotoMorita 25:07ac5c6cd61c 154
NaotoMorita 25:07ac5c6cd61c 155 void ScErrStateEKF::getAccBias(float (&resVal)[3], float (&resCov)[6]){
NaotoMorita 25:07ac5c6cd61c 156 resVal[0] = accBias.x;
NaotoMorita 25:07ac5c6cd61c 157 resVal[1] = accBias.y;
NaotoMorita 25:07ac5c6cd61c 158 resVal[2] = accBias.z;
NaotoMorita 31:e655d4d8e4d6 159 resCov[0] = Phat(4,4);
NaotoMorita 31:e655d4d8e4d6 160 resCov[1] = Phat(4,5);
NaotoMorita 31:e655d4d8e4d6 161 resCov[2] = Phat(4,6);
NaotoMorita 31:e655d4d8e4d6 162 resCov[3] = Phat(5,5);
NaotoMorita 31:e655d4d8e4d6 163 resCov[4] = Phat(5,6);
NaotoMorita 31:e655d4d8e4d6 164 resCov[5] = Phat(6,6);
NaotoMorita 25:07ac5c6cd61c 165
NaotoMorita 25:07ac5c6cd61c 166 }
NaotoMorita 25:07ac5c6cd61c 167
NaotoMorita 19:3fae66745363 168
NaotoMorita 19:3fae66745363 169 void ScErrStateEKF::updateAccMeasures(Vector3 acc, Vector3 accref)
NaotoMorita 19:3fae66745363 170 {
NaotoMorita 21:d6079def0473 171 acc -= accBias;
NaotoMorita 20:37d3c3ee36e9 172 Matrix dcm(3,3);
NaotoMorita 20:37d3c3ee36e9 173 computeDcm(dcm, qhat);
NaotoMorita 20:37d3c3ee36e9 174 Vector3 gvec(dcm(1,3)*accref.z, dcm(2,3)*accref.z, dcm(3,3)*accref.z);
NaotoMorita 21:d6079def0473 175 Matrix H(3,nState);
NaotoMorita 20:37d3c3ee36e9 176 H(1,2) = -2.0f*gvec.z;
NaotoMorita 20:37d3c3ee36e9 177 H(1,3) = 2.0f*gvec.y;
NaotoMorita 20:37d3c3ee36e9 178 H(2,1) = 2.0f*gvec.z;
NaotoMorita 20:37d3c3ee36e9 179 H(2,3) = -2.0f*gvec.x;
NaotoMorita 20:37d3c3ee36e9 180 H(3,1) = -2.0f*gvec.y;
NaotoMorita 20:37d3c3ee36e9 181 H(3,2) = 2.0f*gvec.x;
NaotoMorita 31:e655d4d8e4d6 182 H(1,4) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 183 H(2,5) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 184 H(3,6) = 1.0f;
NaotoMorita 20:37d3c3ee36e9 185 Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+Ra+Qab);
NaotoMorita 21:d6079def0473 186 Matrix z = MatrixMath::Vector2mat(acc)-dcm*MatrixMath::Vector2mat(accref);
NaotoMorita 20:37d3c3ee36e9 187 Matrix corrVal = K * (z-H*errState);
NaotoMorita 20:37d3c3ee36e9 188 errState = errState + corrVal;
NaotoMorita 21:d6079def0473 189 Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*(Ra+Qab)*MatrixMath::Transpose(K);
NaotoMorita 20:37d3c3ee36e9 190 }
NaotoMorita 20:37d3c3ee36e9 191
NaotoMorita 20:37d3c3ee36e9 192 void ScErrStateEKF::updateGyroBiasConstraints(Vector3 gyro)
NaotoMorita 20:37d3c3ee36e9 193 {
NaotoMorita 21:d6079def0473 194 gyro -= gyroBias;
NaotoMorita 23:1509648c2318 195 Matrix dcm(3,3);
NaotoMorita 23:1509648c2318 196 computeDcm(dcm, qhat);
NaotoMorita 31:e655d4d8e4d6 197 Matrix H(2,3);
NaotoMorita 31:e655d4d8e4d6 198 H(1,1) = 1.0f*(dcm(1,1));
NaotoMorita 31:e655d4d8e4d6 199 H(1,2) = 1.0f*(dcm(2,1));
NaotoMorita 31:e655d4d8e4d6 200 H(1,3) = 1.0f*(dcm(3,1));
NaotoMorita 31:e655d4d8e4d6 201 H(2,1) = 1.0f*(dcm(1,2));
NaotoMorita 31:e655d4d8e4d6 202 H(2,2) = 1.0f*(dcm(2,2));
NaotoMorita 31:e655d4d8e4d6 203 H(2,3) = 1.0f*(dcm(3,2));
NaotoMorita 23:1509648c2318 204
NaotoMorita 31:e655d4d8e4d6 205 Matrix K = (Phatbg*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phatbg*MatrixMath::Transpose(H)+Rgsc);
NaotoMorita 31:e655d4d8e4d6 206 Matrix z(2,1);
NaotoMorita 31:e655d4d8e4d6 207 z <<dcm(1,1)*gyro.x+dcm(2,1)*gyro.y+dcm(3,1)*gyro.z<< dcm(1,2)*gyro.x+dcm(2,2)*gyro.y+dcm(3,2)*gyro.z;
NaotoMorita 31:e655d4d8e4d6 208 Matrix corrVal = K * (z-H*bgState);
NaotoMorita 31:e655d4d8e4d6 209 bgState = bgState + corrVal;
NaotoMorita 31:e655d4d8e4d6 210 Phatbg = (MatrixMath::Eye(3)-K*H)*Phatbg*MatrixMath::Transpose(MatrixMath::Eye(3)-K*H)+K*(Rgsc)*MatrixMath::Transpose(K);
NaotoMorita 23:1509648c2318 211 }
NaotoMorita 23:1509648c2318 212
NaotoMorita 23:1509648c2318 213
NaotoMorita 19:3fae66745363 214 void ScErrStateEKF::updateStaticAccMeasures(Vector3 acc, Vector3 accref)
NaotoMorita 19:3fae66745363 215 {
NaotoMorita 19:3fae66745363 216 Matrix dcm(3,3);
NaotoMorita 19:3fae66745363 217 computeDcm(dcm, qhat);
NaotoMorita 19:3fae66745363 218 Vector3 gvec(dcm(1,3)*accref.z, dcm(2,3)*accref.z, dcm(3,3)*accref.z);
NaotoMorita 21:d6079def0473 219 Matrix H(3,nState);
NaotoMorita 19:3fae66745363 220 H(1,2) = -2.0f*gvec.z;
NaotoMorita 19:3fae66745363 221 H(1,3) = 2.0f*gvec.y;
NaotoMorita 19:3fae66745363 222 H(2,1) = 2.0f*gvec.z;
NaotoMorita 19:3fae66745363 223 H(2,3) = -2.0f*gvec.x;
NaotoMorita 19:3fae66745363 224 H(3,1) = -2.0f*gvec.y;
NaotoMorita 19:3fae66745363 225 H(3,2) = 2.0f*gvec.x;
NaotoMorita 19:3fae66745363 226 Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+Ra*100.0f);
NaotoMorita 19:3fae66745363 227 Matrix accmat(3,1);
NaotoMorita 19:3fae66745363 228 accmat << acc.x << acc.y << acc.z;
NaotoMorita 19:3fae66745363 229 Matrix gref(3,1);
NaotoMorita 19:3fae66745363 230 gref << 0.0f << 0.0f << accref.z;
NaotoMorita 19:3fae66745363 231 Matrix z = accmat-dcm*gref;
NaotoMorita 19:3fae66745363 232 errState = errState + K * (z-H*errState);
NaotoMorita 21:d6079def0473 233 Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*(Ra*100.0f)*MatrixMath::Transpose(K);
NaotoMorita 19:3fae66745363 234 }
NaotoMorita 19:3fae66745363 235
NaotoMorita 32:321a756e12ad 236 void ScErrStateEKF::updateGPSVelocity(float vi_x, float vi_y, float sinkRate,Vector3 acc, Vector3 accref)
NaotoMorita 19:3fae66745363 237 {
NaotoMorita 31:e655d4d8e4d6 238 acc -= accBias;
NaotoMorita 31:e655d4d8e4d6 239 Matrix dcm(3,3);
NaotoMorita 31:e655d4d8e4d6 240 computeDcm(dcm, qhat);
NaotoMorita 31:e655d4d8e4d6 241 Vector3 gvec(dcm(1,3)*accref.z, dcm(2,3)*accref.z, dcm(3,3)*accref.z);
NaotoMorita 32:321a756e12ad 242 Matrix H(6,nState);
NaotoMorita 31:e655d4d8e4d6 243 H(1,2) = -2.0f*gvec.z;
NaotoMorita 31:e655d4d8e4d6 244 H(1,3) = 2.0f*gvec.y;
NaotoMorita 31:e655d4d8e4d6 245 H(2,1) = 2.0f*gvec.z;
NaotoMorita 31:e655d4d8e4d6 246 H(2,3) = -2.0f*gvec.x;
NaotoMorita 31:e655d4d8e4d6 247 H(3,1) = -2.0f*gvec.y;
NaotoMorita 31:e655d4d8e4d6 248 H(3,2) = 2.0f*gvec.x;
NaotoMorita 31:e655d4d8e4d6 249 H(1,4) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 250 H(2,5) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 251 H(3,6) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 252 H(4,7) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 253 H(5,8) = 1.0f;
NaotoMorita 32:321a756e12ad 254 H(6,9) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 255
NaotoMorita 32:321a756e12ad 256 Matrix R(6,6);
NaotoMorita 31:e655d4d8e4d6 257 R(1,1) = Ra(1,1)+Qab(1,1);
NaotoMorita 31:e655d4d8e4d6 258 R(2,2) = Ra(2,2)+Qab(2,2);
NaotoMorita 31:e655d4d8e4d6 259 R(3,3) = Ra(3,3)+Qab(3,3);
NaotoMorita 31:e655d4d8e4d6 260 R(4,4) = Rgps(1,1);
NaotoMorita 31:e655d4d8e4d6 261 R(5,5) = Rgps(2,2);
NaotoMorita 32:321a756e12ad 262 R(6,6) = Rsr(1,1);
NaotoMorita 31:e655d4d8e4d6 263
NaotoMorita 31:e655d4d8e4d6 264 Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
NaotoMorita 31:e655d4d8e4d6 265 Matrix zacc = MatrixMath::Vector2mat(acc)-dcm*MatrixMath::Vector2mat(accref);
NaotoMorita 32:321a756e12ad 266 Matrix z(6,1);
NaotoMorita 32:321a756e12ad 267 z << zacc(1,1)<< zacc(2,1)<< zacc(3,1) << vi_x - vihat(1,1) << vi_y-vihat(2,1) << sinkRate - vihat(3,1);;
NaotoMorita 26:73c3f58b9d70 268 Matrix corrVal = K * (z-H*errState);
NaotoMorita 26:73c3f58b9d70 269 errState = errState + corrVal;
NaotoMorita 31:e655d4d8e4d6 270 Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*(R)*MatrixMath::Transpose(K);
NaotoMorita 19:3fae66745363 271 }
NaotoMorita 19:3fae66745363 272
NaotoMorita 31:e655d4d8e4d6 273 void ScErrStateEKF::updateSinkRate(float sinkRate,Vector3 acc, Vector3 accref)
NaotoMorita 30:ff884e9b2e30 274 {
NaotoMorita 31:e655d4d8e4d6 275 acc -= accBias;
NaotoMorita 31:e655d4d8e4d6 276 Matrix dcm(3,3);
NaotoMorita 31:e655d4d8e4d6 277 computeDcm(dcm, qhat);
NaotoMorita 31:e655d4d8e4d6 278 Vector3 gvec(dcm(1,3)*accref.z, dcm(2,3)*accref.z, dcm(3,3)*accref.z);
NaotoMorita 31:e655d4d8e4d6 279 Matrix H(4,nState);
NaotoMorita 31:e655d4d8e4d6 280 H(1,2) = -2.0f*gvec.z;
NaotoMorita 31:e655d4d8e4d6 281 H(1,3) = 2.0f*gvec.y;
NaotoMorita 31:e655d4d8e4d6 282 H(2,1) = 2.0f*gvec.z;
NaotoMorita 31:e655d4d8e4d6 283 H(2,3) = -2.0f*gvec.x;
NaotoMorita 31:e655d4d8e4d6 284 H(3,1) = -2.0f*gvec.y;
NaotoMorita 31:e655d4d8e4d6 285 H(3,2) = 2.0f*gvec.x;
NaotoMorita 31:e655d4d8e4d6 286 H(1,4) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 287 H(2,5) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 288 H(3,6) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 289 H(4,9) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 290
NaotoMorita 31:e655d4d8e4d6 291 Matrix R(4,4);
NaotoMorita 31:e655d4d8e4d6 292 R(1,1) = Ra(1,1)+Qab(1,1);
NaotoMorita 31:e655d4d8e4d6 293 R(2,2) = Ra(2,2)+Qab(2,2);
NaotoMorita 31:e655d4d8e4d6 294 R(3,3) = Ra(3,3)+Qab(3,3);
NaotoMorita 31:e655d4d8e4d6 295 R(4,4) = Rsr(1,1);
NaotoMorita 31:e655d4d8e4d6 296
NaotoMorita 31:e655d4d8e4d6 297 Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
NaotoMorita 31:e655d4d8e4d6 298 Matrix zacc = MatrixMath::Vector2mat(acc)-dcm*MatrixMath::Vector2mat(accref);
NaotoMorita 31:e655d4d8e4d6 299 Matrix z(4,1);
NaotoMorita 31:e655d4d8e4d6 300 z << zacc(1,1)<< zacc(2,1)<< zacc(3,1) << sinkRate - vihat(3,1);
NaotoMorita 30:ff884e9b2e30 301 Matrix corrVal = K * (z-H*errState);
NaotoMorita 30:ff884e9b2e30 302 errState = errState + corrVal;
NaotoMorita 31:e655d4d8e4d6 303 Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*(R)*MatrixMath::Transpose(K);
NaotoMorita 30:ff884e9b2e30 304 }
NaotoMorita 30:ff884e9b2e30 305
NaotoMorita 25:07ac5c6cd61c 306 void ScErrStateEKF::updateCenteredGyroBiasCorrection(float (&cBg)[3])
NaotoMorita 25:07ac5c6cd61c 307 {
NaotoMorita 25:07ac5c6cd61c 308
NaotoMorita 25:07ac5c6cd61c 309 Matrix RgyroBias(3,3);
NaotoMorita 25:07ac5c6cd61c 310 for(int i = 1;i<4;i++){
NaotoMorita 25:07ac5c6cd61c 311 RgyroBias(i,i) = 0.1f;
NaotoMorita 25:07ac5c6cd61c 312 }
NaotoMorita 25:07ac5c6cd61c 313
NaotoMorita 31:e655d4d8e4d6 314 Matrix H(3,3);
NaotoMorita 31:e655d4d8e4d6 315 H(1,1) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 316 H(2,2) = 1.0f;
NaotoMorita 31:e655d4d8e4d6 317 H(3,3) = 1.0f;
NaotoMorita 25:07ac5c6cd61c 318
NaotoMorita 31:e655d4d8e4d6 319 Matrix K = (Phatbg*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phatbg*MatrixMath::Transpose(H)+RgyroBias);
NaotoMorita 25:07ac5c6cd61c 320 Matrix z(3,1);
NaotoMorita 25:07ac5c6cd61c 321 z <<cBg[0]-gyroBias.x <<cBg[1]-gyroBias.y <<cBg[2]-gyroBias.z;
NaotoMorita 31:e655d4d8e4d6 322 Matrix corrVal = K * (z-H*bgState);
NaotoMorita 31:e655d4d8e4d6 323 bgState = bgState + corrVal;
NaotoMorita 31:e655d4d8e4d6 324 Phatbg = (MatrixMath::Eye(3)-K*H)*Phatbg*MatrixMath::Transpose(MatrixMath::Eye(3)-K*H)+K*(RgyroBias)*MatrixMath::Transpose(K);
NaotoMorita 25:07ac5c6cd61c 325
NaotoMorita 25:07ac5c6cd61c 326 }
NaotoMorita 25:07ac5c6cd61c 327
NaotoMorita 19:3fae66745363 328 void ScErrStateEKF::resetBias()
NaotoMorita 19:3fae66745363 329 {
NaotoMorita 31:e655d4d8e4d6 330 gyroBias.x = gyroBias.x + bgState(1,1)*1.0f;
NaotoMorita 31:e655d4d8e4d6 331 gyroBias.y = gyroBias.y + bgState(2,1)*1.0f;
NaotoMorita 31:e655d4d8e4d6 332 gyroBias.z = gyroBias.z + bgState(3,1)*1.0f;
NaotoMorita 31:e655d4d8e4d6 333 bgState(1,1) = 0.0f;
NaotoMorita 31:e655d4d8e4d6 334 bgState(2,1) = 0.0f;
NaotoMorita 31:e655d4d8e4d6 335 bgState(3,1) = 0.0f;
NaotoMorita 31:e655d4d8e4d6 336 accBias.x = accBias.x + errState(4,1);
NaotoMorita 31:e655d4d8e4d6 337 accBias.y = accBias.y + errState(5,1);
NaotoMorita 31:e655d4d8e4d6 338 accBias.z = accBias.z + errState(6,1);
NaotoMorita 19:3fae66745363 339 errState(4,1) = 0.0f;
NaotoMorita 19:3fae66745363 340 errState(5,1) = 0.0f;
NaotoMorita 19:3fae66745363 341 errState(6,1) = 0.0f;
NaotoMorita 19:3fae66745363 342 }
NaotoMorita 19:3fae66745363 343
NaotoMorita 19:3fae66745363 344 void ScErrStateEKF::computeAngles(Vector3& rpy,Vector3 rpy_align)
NaotoMorita 19:3fae66745363 345 {
NaotoMorita 19:3fae66745363 346 Matrix qerr(4,1);
NaotoMorita 19:3fae66745363 347 qerr << 1.0f << errState(1,1) << errState(2,1) << errState(3,1);
NaotoMorita 19:3fae66745363 348 //float qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qerr),qerr));
NaotoMorita 19:3fae66745363 349 //qerr *= (1.0f/ qnorm);
NaotoMorita 19:3fae66745363 350 Matrix qest = quatmultiply(qhat, qerr);
NaotoMorita 19:3fae66745363 351 float qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qest),qest));
NaotoMorita 19:3fae66745363 352 qest *= (1.0f/ qnorm);
NaotoMorita 19:3fae66745363 353 float q0 = qest( 1, 1 );
NaotoMorita 19:3fae66745363 354 float q1 = qest( 2, 1 );
NaotoMorita 19:3fae66745363 355 float q2 = qest( 3, 1 );
NaotoMorita 19:3fae66745363 356 float q3 = qest( 4, 1 );
NaotoMorita 19:3fae66745363 357 rpy.x = atan2f(q0*q1 + q2*q3, 0.5f - q1*q1 - q2*q2)-rpy_align.x;
NaotoMorita 19:3fae66745363 358 rpy.y = asinf(-2.0f * (q1*q3 - q0*q2))-rpy_align.y;
NaotoMorita 19:3fae66745363 359 rpy.z = atan2f(q1*q2 + q0*q3, 0.5f - q2*q2 - q3*q3);
NaotoMorita 19:3fae66745363 360
NaotoMorita 19:3fae66745363 361 }
NaotoMorita 19:3fae66745363 362
NaotoMorita 21:d6079def0473 363
NaotoMorita 21:d6079def0473 364 void ScErrStateEKF::fuseErr2Nominal()
NaotoMorita 19:3fae66745363 365 {
NaotoMorita 19:3fae66745363 366 Matrix qerr(4,1);
NaotoMorita 19:3fae66745363 367 qerr << 1.0f << errState(1,1) << errState(2,1) << errState(3,1);
NaotoMorita 19:3fae66745363 368 //float qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qerr),qerr));
NaotoMorita 19:3fae66745363 369 //qerr *= (1.0f/ qnorm);
NaotoMorita 19:3fae66745363 370 qhat = quatmultiply(qhat, qerr);
NaotoMorita 19:3fae66745363 371 errState(1,1) = 0.0f;
NaotoMorita 19:3fae66745363 372 errState(2,1) = 0.0f;
NaotoMorita 19:3fae66745363 373 errState(3,1) = 0.0f;
NaotoMorita 19:3fae66745363 374 float qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qhat),qhat));
NaotoMorita 19:3fae66745363 375 qhat *= (1.0f/ qnorm);
NaotoMorita 23:1509648c2318 376
NaotoMorita 31:e655d4d8e4d6 377 vihat(1,1) += errState(7,1);
NaotoMorita 31:e655d4d8e4d6 378 vihat(2,1) += errState(8,1);
NaotoMorita 31:e655d4d8e4d6 379 vihat(3,1) += errState(9,1);
NaotoMorita 31:e655d4d8e4d6 380 errState(7,1) = 0.0f;
NaotoMorita 31:e655d4d8e4d6 381 errState(8,1) = 0.0f;
NaotoMorita 31:e655d4d8e4d6 382 errState(9,1) = 0.0f;
NaotoMorita 19:3fae66745363 383 }
NaotoMorita 19:3fae66745363 384
NaotoMorita 19:3fae66745363 385 Matrix ScErrStateEKF::quatmultiply(Matrix q, Matrix r)
NaotoMorita 19:3fae66745363 386 {
NaotoMorita 19:3fae66745363 387 Matrix qout(4,1);
NaotoMorita 19:3fae66745363 388 qout(1,1) = q(1,1)*r(1,1) - q(2,1)*r(2,1) - q(3,1)*r(3,1) - q(4,1)*r(4,1);
NaotoMorita 19:3fae66745363 389 qout(2,1) = q(1,1)*r(2,1) + r(1,1)*q(2,1) + q(3,1)*r(4,1)-q(4,1)*r(3,1);
NaotoMorita 19:3fae66745363 390 qout(3,1) = q(1,1)*r(3,1) + r(1,1)*q(3,1) + q(4,1)*r(2,1)-q(2,1)*r(4,1);
NaotoMorita 19:3fae66745363 391 qout(4,1) = q(1,1)*r(4,1) + r(1,1)*q(4,1) + q(2,1)*r(3,1)-q(3,1)*r(2,1);
NaotoMorita 19:3fae66745363 392 float qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qout),qout));
NaotoMorita 19:3fae66745363 393 qout *= (1.0f/ qnorm);
NaotoMorita 19:3fae66745363 394 return qout;
NaotoMorita 19:3fae66745363 395 }
NaotoMorita 19:3fae66745363 396
NaotoMorita 19:3fae66745363 397 void ScErrStateEKF::computeDcm(Matrix& dcm, Matrix quat)
NaotoMorita 19:3fae66745363 398 {
NaotoMorita 19:3fae66745363 399
NaotoMorita 19:3fae66745363 400 float q0 = quat( 1, 1 );
NaotoMorita 19:3fae66745363 401 float q1 = quat( 2, 1 );
NaotoMorita 19:3fae66745363 402 float q2 = quat( 3, 1 );
NaotoMorita 19:3fae66745363 403 float q3 = quat( 4, 1 );
NaotoMorita 19:3fae66745363 404
NaotoMorita 19:3fae66745363 405 dcm(1,1) = q0*q0 + q1*q1 - q2*q2 - q3*q3;
NaotoMorita 19:3fae66745363 406 dcm(1,2) = 2*(q1*q2 + q0*q3);
NaotoMorita 19:3fae66745363 407 dcm(1,3) = 2*(q1*q3 - q0*q2);
NaotoMorita 19:3fae66745363 408 dcm(2,1) = 2*(q1*q2 - q0*q3);
NaotoMorita 19:3fae66745363 409 dcm(2,2) = q0*q0 - q1*q1 + q2*q2 - q3*q3;
NaotoMorita 19:3fae66745363 410 dcm(2,3) = 2*(q2*q3 + q0*q1);
NaotoMorita 19:3fae66745363 411 dcm(3,1) = 2*(q1*q3 + q0*q2);
NaotoMorita 19:3fae66745363 412 dcm(3,2) = 2*(q2*q3 - q0*q1);
NaotoMorita 19:3fae66745363 413 dcm(3,3) = q0*q0 - q1*q1 - q2*q2 + q3*q3;
NaotoMorita 19:3fae66745363 414
NaotoMorita 19:3fae66745363 415 }
NaotoMorita 19:3fae66745363 416
NaotoMorita 19:3fae66745363 417 void ScErrStateEKF::defineQhat(Vector3 align){
NaotoMorita 19:3fae66745363 418 float cos_z_2 = cosf(0.5f*align.z);
NaotoMorita 19:3fae66745363 419 float cos_y_2 = cosf(0.5f*align.y);
NaotoMorita 19:3fae66745363 420 float cos_x_2 = cosf(0.5f*align.x);
NaotoMorita 19:3fae66745363 421
NaotoMorita 19:3fae66745363 422 float sin_z_2 = sinf(0.5f*align.z);
NaotoMorita 19:3fae66745363 423 float sin_y_2 = sinf(0.5f*align.y);
NaotoMorita 19:3fae66745363 424 float sin_x_2 = sinf(0.5f*align.x);
NaotoMorita 19:3fae66745363 425
NaotoMorita 19:3fae66745363 426 // and now compute quaternion
NaotoMorita 19:3fae66745363 427 qhat(1,1) = cos_z_2*cos_y_2*cos_x_2 + sin_z_2*sin_y_2*sin_x_2;
NaotoMorita 19:3fae66745363 428 qhat(2,1) = cos_z_2*cos_y_2*sin_x_2 - sin_z_2*sin_y_2*cos_x_2;
NaotoMorita 19:3fae66745363 429 qhat(3,1) = cos_z_2*sin_y_2*cos_x_2 + sin_z_2*cos_y_2*sin_x_2;
NaotoMorita 19:3fae66745363 430 qhat(4,1) = sin_z_2*cos_y_2*cos_x_2 - cos_z_2*sin_y_2*sin_x_2;
NaotoMorita 19:3fae66745363 431 }
NaotoMorita 19:3fae66745363 432
NaotoMorita 23:1509648c2318 433 void ScErrStateEKF::computeVb(Vector3& vb)
NaotoMorita 23:1509648c2318 434 {
NaotoMorita 23:1509648c2318 435 Matrix dcm(3,3);
NaotoMorita 23:1509648c2318 436 computeDcm(dcm, qhat);
NaotoMorita 23:1509648c2318 437 Matrix vbmat = dcm*vihat;
NaotoMorita 23:1509648c2318 438 vb.x = vbmat(1,1);
NaotoMorita 23:1509648c2318 439 vb.y = vbmat(2,1);
NaotoMorita 23:1509648c2318 440 vb.z = vbmat(3,1);
NaotoMorita 23:1509648c2318 441
NaotoMorita 23:1509648c2318 442 }
NaotoMorita 23:1509648c2318 443
NaotoMorita 19:3fae66745363 444
NaotoMorita 19:3fae66745363 445
NaotoMorita 19:3fae66745363 446 Vector3 ScErrStateEKF::calcDynAcc(Vector3 acc, Vector3 accref)
NaotoMorita 19:3fae66745363 447 {
NaotoMorita 19:3fae66745363 448 Matrix dcm(3,3);
NaotoMorita 19:3fae66745363 449 computeDcm(dcm, qhat);
NaotoMorita 19:3fae66745363 450 float _x, _y, _z;
NaotoMorita 19:3fae66745363 451 _x = acc.x-(dcm( 1, 1 )*accref.x+dcm( 1, 2 )*accref.y+dcm( 1, 3 )*accref.z);
NaotoMorita 19:3fae66745363 452 _y = acc.y-(dcm( 2, 1 )*accref.x+dcm( 2, 2 )*accref.y+dcm( 2, 3 )*accref.z);
NaotoMorita 19:3fae66745363 453 _z = acc.z-(dcm( 3, 1 )*accref.x+dcm( 3, 2 )*accref.y+dcm( 3, 3 )*accref.z);
NaotoMorita 19:3fae66745363 454 return Vector3(_x, _y, _z);
NaotoMorita 19:3fae66745363 455 }
NaotoMorita 19:3fae66745363 456
NaotoMorita 19:3fae66745363 457
NaotoMorita 19:3fae66745363 458 bool ScErrStateEKF::determinDynStatus(Vector3 acc, Vector3 accref)
NaotoMorita 19:3fae66745363 459 {
NaotoMorita 19:3fae66745363 460 histffunc[histffuncindex] = acc.Norm()*acc.Norm()-accref.Norm()*accref.Norm()-3.0f*sigma2a;
NaotoMorita 19:3fae66745363 461 if(histffuncindex<9){
NaotoMorita 19:3fae66745363 462 histffuncindex += 1;
NaotoMorita 19:3fae66745363 463 }else{
NaotoMorita 19:3fae66745363 464 histffuncindex =0;
NaotoMorita 19:3fae66745363 465 }
NaotoMorita 19:3fae66745363 466 aveffunc = 0;
NaotoMorita 19:3fae66745363 467 for(int i = 1;i<10;i++){
NaotoMorita 19:3fae66745363 468 aveffunc += 1.0f/10.0f*histffunc[i];
NaotoMorita 19:3fae66745363 469 }
NaotoMorita 19:3fae66745363 470 sigma2f = 1.0f/10.0f*(6.0f*sigma2a*sigma2a+4.0f*accref.Norm()*accref.Norm()*sigma2a);
NaotoMorita 19:3fae66745363 471
NaotoMorita 19:3fae66745363 472
NaotoMorita 19:3fae66745363 473 dynacc = calcDynAcc(acc,accref);
NaotoMorita 19:3fae66745363 474 bool dynCase = true;
NaotoMorita 19:3fae66745363 475 if((dynacc.Norm()<0.005f) && (abs(acc.Norm()-accref.Norm())<0.005f)){dynCase = false;}
NaotoMorita 19:3fae66745363 476 if(aveffunc<sqrt(sigma2f/0.99f) && abs(acc.Norm()-accref.Norm())<0.001f){dynCase = false;}
NaotoMorita 19:3fae66745363 477 return dynCase;
NaotoMorita 19:3fae66745363 478
NaotoMorita 19:3fae66745363 479 }
NaotoMorita 19:3fae66745363 480
NaotoMorita 22:7d84b8bc20b4 481 /*
NaotoMorita 22:7d84b8bc20b4 482 void ScErrStateEKF::updateNominal(Vector3 gyro, Vector3 acc, Vector3 accref, float att_dt)
NaotoMorita 22:7d84b8bc20b4 483 {
NaotoMorita 22:7d84b8bc20b4 484 gyro -= gyroBias;
NaotoMorita 22:7d84b8bc20b4 485 acc -= accBias;
NaotoMorita 22:7d84b8bc20b4 486 Matrix A(4,4);
NaotoMorita 22:7d84b8bc20b4 487 A << 0.0f << -0.5f*gyro.x <<-0.5f*gyro.y <<-0.5f*gyro.z
NaotoMorita 22:7d84b8bc20b4 488 << 0.5f*gyro.x << 0.0f << 0.5f*gyro.z <<-0.5f*gyro.y
NaotoMorita 22:7d84b8bc20b4 489 << 0.5f*gyro.y << -0.5f*gyro.z << 0.0f << 0.5f*gyro.x
NaotoMorita 22:7d84b8bc20b4 490 << 0.5f*gyro.z << 0.5f*gyro.y <<-0.5f*gyro.x << 0.0f ;
NaotoMorita 22:7d84b8bc20b4 491
NaotoMorita 22:7d84b8bc20b4 492 Matrix phi = MatrixMath::Eye(4) + A * att_dt + (0.5f*att_dt*att_dt) * A * A;
NaotoMorita 22:7d84b8bc20b4 493 qhat = phi * qhat;
NaotoMorita 22:7d84b8bc20b4 494 float qnorm = sqrt(MatrixMath::dot(MatrixMath::Transpose(qhat),qhat));
NaotoMorita 22:7d84b8bc20b4 495 qhat *= (1.0f/ qnorm);
NaotoMorita 22:7d84b8bc20b4 496
NaotoMorita 22:7d84b8bc20b4 497 Matrix dcm(3,3);
NaotoMorita 22:7d84b8bc20b4 498 computeDcm(dcm, qhat);
NaotoMorita 22:7d84b8bc20b4 499 vihat += (MatrixMath::Transpose(dcm)*MatrixMath::Vector2mat(acc)-MatrixMath::Vector2mat(accref))*att_dt*9.8f;
NaotoMorita 22:7d84b8bc20b4 500 }
NaotoMorita 19:3fae66745363 501
NaotoMorita 22:7d84b8bc20b4 502 void ScErrStateEKF::updateErrState(Vector3 gyro,Vector3 acc, float att_dt)
NaotoMorita 22:7d84b8bc20b4 503 {
NaotoMorita 22:7d84b8bc20b4 504 gyro -= gyroBias;
NaotoMorita 22:7d84b8bc20b4 505 acc -= accBias;
NaotoMorita 22:7d84b8bc20b4 506 Matrix A(nState,nState);
NaotoMorita 22:7d84b8bc20b4 507 A(1,2) = gyro.z;
NaotoMorita 22:7d84b8bc20b4 508 A(1,3) = -gyro.y;
NaotoMorita 22:7d84b8bc20b4 509 A(2,1) = -gyro.z;
NaotoMorita 22:7d84b8bc20b4 510 A(2,3) = gyro.x;
NaotoMorita 22:7d84b8bc20b4 511 A(3,1) = gyro.y;
NaotoMorita 22:7d84b8bc20b4 512 A(3,2) = -gyro.x;
NaotoMorita 22:7d84b8bc20b4 513 A(1,4) = -0.5f;
NaotoMorita 22:7d84b8bc20b4 514 A(2,5) = -0.5f;
NaotoMorita 22:7d84b8bc20b4 515 A(3,6) = -0.5f;
NaotoMorita 22:7d84b8bc20b4 516
NaotoMorita 22:7d84b8bc20b4 517 Matrix dcm(3,3);
NaotoMorita 22:7d84b8bc20b4 518 computeDcm(dcm, qhat);
NaotoMorita 22:7d84b8bc20b4 519 Matrix qeterm = -2.0f*9.8f*MatrixMath::Transpose(dcm)*MatrixMath::Matrixcross(acc.x,acc.y,acc.z);
NaotoMorita 22:7d84b8bc20b4 520 Matrix baterm = -9.8f*MatrixMath::Transpose(dcm);
NaotoMorita 22:7d84b8bc20b4 521 for (int i = 1; i < 4; i++){
NaotoMorita 22:7d84b8bc20b4 522 for (int j = 1; i < 4; i++){
NaotoMorita 22:7d84b8bc20b4 523 A(i+9,j) = qeterm(i,j);
NaotoMorita 22:7d84b8bc20b4 524 A(i+9,j+6) = baterm(i,j);
NaotoMorita 22:7d84b8bc20b4 525 }
NaotoMorita 22:7d84b8bc20b4 526 }
NaotoMorita 22:7d84b8bc20b4 527
NaotoMorita 22:7d84b8bc20b4 528 Matrix phi = MatrixMath::Eye(nState) + A * att_dt + (0.5f*att_dt*att_dt) * A * A;
NaotoMorita 22:7d84b8bc20b4 529 Matrix Qd = Q * att_dt + 0.5f*A*Q * att_dt * att_dt+ 0.5f*Q*MatrixMath::Transpose(A) * att_dt * att_dt;
NaotoMorita 22:7d84b8bc20b4 530 errState = phi * errState;
NaotoMorita 22:7d84b8bc20b4 531 Phat = phi*Phat*MatrixMath::Transpose(phi)+Qd;
NaotoMorita 22:7d84b8bc20b4 532 }
NaotoMorita 22:7d84b8bc20b4 533
NaotoMorita 22:7d84b8bc20b4 534 void ScErrStateEKF::updateVelocityConstraints()
NaotoMorita 22:7d84b8bc20b4 535 {
NaotoMorita 22:7d84b8bc20b4 536
NaotoMorita 22:7d84b8bc20b4 537 Matrix dcm(3,3);
NaotoMorita 22:7d84b8bc20b4 538 computeDcm(dcm, qhat);
NaotoMorita 22:7d84b8bc20b4 539 Matrix H(2,nState);
NaotoMorita 22:7d84b8bc20b4 540
NaotoMorita 22:7d84b8bc20b4 541 Matrix nomVb = dcm*vihat;
NaotoMorita 22:7d84b8bc20b4 542 Matrix qeterm = -2.0f*MatrixMath::Matrixcross(nomVb(1,1),nomVb(2,1),nomVb(3,1));
NaotoMorita 22:7d84b8bc20b4 543 for(int j = 1;j<4;j++){
NaotoMorita 22:7d84b8bc20b4 544 H(1,j) = -qeterm(1,j);
NaotoMorita 22:7d84b8bc20b4 545 H(2,j) = -qeterm(3,j);
NaotoMorita 22:7d84b8bc20b4 546 //H(3,j) = -qeterm(3,j);
NaotoMorita 22:7d84b8bc20b4 547 H(1,9+j) = -dcm(1,j);
NaotoMorita 22:7d84b8bc20b4 548 H(2,9+j) = -dcm(3,j);
NaotoMorita 22:7d84b8bc20b4 549 //H(3,9+j) = -dcm(3,j);
NaotoMorita 22:7d84b8bc20b4 550 }
NaotoMorita 22:7d84b8bc20b4 551
NaotoMorita 22:7d84b8bc20b4 552 Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+Rvsc);
NaotoMorita 22:7d84b8bc20b4 553 Matrix z(2,1);
NaotoMorita 22:7d84b8bc20b4 554 z << nomVb(1,1) << nomVb(3,1) ;
NaotoMorita 22:7d84b8bc20b4 555 Matrix corrVal = K * (z-H*errState);
NaotoMorita 22:7d84b8bc20b4 556 errState = errState + corrVal;
NaotoMorita 22:7d84b8bc20b4 557 Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*(Rvsc)*MatrixMath::Transpose(K);
NaotoMorita 22:7d84b8bc20b4 558
NaotoMorita 22:7d84b8bc20b4 559 }
NaotoMorita 22:7d84b8bc20b4 560
NaotoMorita 22:7d84b8bc20b4 561 void ScErrStateEKF::updateConstraints(Vector3 gyro)
NaotoMorita 22:7d84b8bc20b4 562 {
NaotoMorita 22:7d84b8bc20b4 563
NaotoMorita 22:7d84b8bc20b4 564 gyro -=gyroBias;
NaotoMorita 22:7d84b8bc20b4 565
NaotoMorita 22:7d84b8bc20b4 566 Matrix dcm(3,3);
NaotoMorita 22:7d84b8bc20b4 567 computeDcm(dcm, qhat);
NaotoMorita 22:7d84b8bc20b4 568
NaotoMorita 22:7d84b8bc20b4 569 Matrix qeterm = -2.0f*MatrixMath::Transpose(dcm)*MatrixMath::Matrixcross(gyro.x,gyro.y,gyro.z);
NaotoMorita 22:7d84b8bc20b4 570 Matrix H(4,nState);
NaotoMorita 22:7d84b8bc20b4 571 for(int i = 1; i<3; i++){
NaotoMorita 22:7d84b8bc20b4 572 for(int j = 1;j<4;j++){
NaotoMorita 22:7d84b8bc20b4 573 H(i,j) = qeterm(i,j);
NaotoMorita 22:7d84b8bc20b4 574 }
NaotoMorita 22:7d84b8bc20b4 575 }
NaotoMorita 22:7d84b8bc20b4 576 H(1,4) = 1.0f*(dcm(1,1));
NaotoMorita 22:7d84b8bc20b4 577 H(1,5) = 1.0f*(dcm(2,1));
NaotoMorita 22:7d84b8bc20b4 578 H(1,6) = 1.0f*(dcm(3,1));
NaotoMorita 22:7d84b8bc20b4 579 H(2,4) = 1.0f*(dcm(1,2));
NaotoMorita 22:7d84b8bc20b4 580 H(2,5) = 1.0f*(dcm(2,2));
NaotoMorita 22:7d84b8bc20b4 581 H(2,6) = 1.0f*(dcm(3,2));
NaotoMorita 22:7d84b8bc20b4 582
NaotoMorita 22:7d84b8bc20b4 583 Matrix nomVb = dcm*vihat;
NaotoMorita 22:7d84b8bc20b4 584 qeterm = -2.0f*MatrixMath::Matrixcross(nomVb(1,1),nomVb(2,1),nomVb(3,1));
NaotoMorita 22:7d84b8bc20b4 585 for(int j = 1;j<4;j++){
NaotoMorita 22:7d84b8bc20b4 586 H(3,j) = -qeterm(1,j);
NaotoMorita 22:7d84b8bc20b4 587 H(4,j) = -qeterm(3,j);
NaotoMorita 22:7d84b8bc20b4 588 //H(3,j) = -qeterm(3,j);
NaotoMorita 22:7d84b8bc20b4 589 H(3,9+j) = -dcm(1,j);
NaotoMorita 22:7d84b8bc20b4 590 H(4,9+j) = -dcm(3,j);
NaotoMorita 22:7d84b8bc20b4 591 //H(3,9+j) = -dcm(3,j);
NaotoMorita 22:7d84b8bc20b4 592 }
NaotoMorita 22:7d84b8bc20b4 593
NaotoMorita 22:7d84b8bc20b4 594 Matrix R(4,4);
NaotoMorita 22:7d84b8bc20b4 595 R(1,1) = Rgsc(1,1);
NaotoMorita 22:7d84b8bc20b4 596 R(2,2) = Rgsc(2,1);
NaotoMorita 22:7d84b8bc20b4 597 R(3,3) = Rvsc(1,1);
NaotoMorita 22:7d84b8bc20b4 598 R(4,4) = Rvsc(2,1);
NaotoMorita 22:7d84b8bc20b4 599 //R(5,5) = Rvsc(3,1);
NaotoMorita 22:7d84b8bc20b4 600 Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+R);
NaotoMorita 22:7d84b8bc20b4 601 Matrix z(4,1);
NaotoMorita 22:7d84b8bc20b4 602 z <<dcm(1,1)*gyro.x+dcm(2,1)*gyro.y+dcm(3,1)*gyro.z<< dcm(1,2)*gyro.x+dcm(2,2)*gyro.y+dcm(3,2)*gyro.z << nomVb(1,1) << nomVb(3,1) ;
NaotoMorita 22:7d84b8bc20b4 603 Matrix corrVal = K * (z-H*errState);
NaotoMorita 22:7d84b8bc20b4 604 errState = errState + corrVal;
NaotoMorita 22:7d84b8bc20b4 605 Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*(R)*MatrixMath::Transpose(K);
NaotoMorita 22:7d84b8bc20b4 606 }
NaotoMorita 22:7d84b8bc20b4 607
NaotoMorita 22:7d84b8bc20b4 608 void ScErrStateEKF::computeVb(Vector3& vb)
NaotoMorita 22:7d84b8bc20b4 609 {
NaotoMorita 22:7d84b8bc20b4 610 Matrix dcm(3,3);
NaotoMorita 22:7d84b8bc20b4 611 computeDcm(dcm, qhat);
NaotoMorita 22:7d84b8bc20b4 612 Matrix vbmat = dcm*vihat;
NaotoMorita 22:7d84b8bc20b4 613 vb.x = vbmat(1,1);
NaotoMorita 22:7d84b8bc20b4 614 vb.y = vbmat(2,1);
NaotoMorita 22:7d84b8bc20b4 615 vb.z = vbmat(3,1);
NaotoMorita 22:7d84b8bc20b4 616
NaotoMorita 22:7d84b8bc20b4 617 }
NaotoMorita 26:73c3f58b9d70 618
NaotoMorita 26:73c3f58b9d70 619 void ScErrStateEKF::updateMagMeasures(Vector3 mag)
NaotoMorita 26:73c3f58b9d70 620 {
NaotoMorita 26:73c3f58b9d70 621 //mag = mag/mag.Norm();
NaotoMorita 26:73c3f58b9d70 622 Matrix dcm(3,3);
NaotoMorita 26:73c3f58b9d70 623 computeDcm(dcm, qhat);
NaotoMorita 26:73c3f58b9d70 624
NaotoMorita 26:73c3f58b9d70 625 Matrix magvec(3,1);
NaotoMorita 26:73c3f58b9d70 626 magvec(1,1) = mag.x;
NaotoMorita 26:73c3f58b9d70 627 magvec(2,1) = mag.y;
NaotoMorita 26:73c3f58b9d70 628 magvec(3,1) = mag.z;
NaotoMorita 26:73c3f58b9d70 629
NaotoMorita 26:73c3f58b9d70 630 Matrix magnedvec = MatrixMath::Transpose(dcm)*magvec;
NaotoMorita 26:73c3f58b9d70 631 Matrix magrefmod(3,1);
NaotoMorita 26:73c3f58b9d70 632 magrefmod(1,1) = sqrt(magnedvec(1,1)*magnedvec(1,1)+magnedvec(2,1)*magnedvec(2,1));
NaotoMorita 26:73c3f58b9d70 633 magrefmod(2,1) = 0.0f;
NaotoMorita 26:73c3f58b9d70 634 magrefmod(3,1) = magnedvec(3,1);
NaotoMorita 26:73c3f58b9d70 635
NaotoMorita 26:73c3f58b9d70 636 Matrix mvec = dcm*magrefmod ;
NaotoMorita 26:73c3f58b9d70 637 Matrix H(3,nState);
NaotoMorita 26:73c3f58b9d70 638 H(1,2) = -2.0f*magvec(3,1);
NaotoMorita 26:73c3f58b9d70 639 H(1,3) = 2.0f*magvec(2,1);
NaotoMorita 26:73c3f58b9d70 640 H(2,1) = 2.0f*magvec(3,1);
NaotoMorita 26:73c3f58b9d70 641 H(2,3) = -2.0f*magvec(1,1);
NaotoMorita 26:73c3f58b9d70 642 H(3,1) = -2.0f*magvec(2,1);
NaotoMorita 26:73c3f58b9d70 643 H(3,2) = 2.0f*magvec(1,1);
NaotoMorita 26:73c3f58b9d70 644 Matrix Pm(nState,nState);
NaotoMorita 26:73c3f58b9d70 645 for(int i = 1; i<4; i++){
NaotoMorita 26:73c3f58b9d70 646 for(int j = 1;j<4;j++){
NaotoMorita 26:73c3f58b9d70 647 Pm(i,j) = Phat(i,j);
NaotoMorita 26:73c3f58b9d70 648 }
NaotoMorita 26:73c3f58b9d70 649 }
NaotoMorita 26:73c3f58b9d70 650 Matrix r3(3,1);
NaotoMorita 26:73c3f58b9d70 651 r3 << dcm(1,3)<< dcm(2,3) << dcm(3,3);
NaotoMorita 26:73c3f58b9d70 652 Matrix kpart = r3*MatrixMath::Transpose(r3);
NaotoMorita 26:73c3f58b9d70 653 Matrix Kmod(nState,nState);
NaotoMorita 26:73c3f58b9d70 654 for(int i = 1; i<4; i++){
NaotoMorita 26:73c3f58b9d70 655 for(int j = 1;j<4;j++){
NaotoMorita 26:73c3f58b9d70 656 Kmod(i,j) = kpart(i,j);
NaotoMorita 26:73c3f58b9d70 657 }
NaotoMorita 26:73c3f58b9d70 658 }
NaotoMorita 26:73c3f58b9d70 659
NaotoMorita 26:73c3f58b9d70 660 Matrix K = Kmod*(Pm*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Pm*MatrixMath::Transpose(H)+Rm);
NaotoMorita 26:73c3f58b9d70 661 Matrix z = magvec-mvec;
NaotoMorita 26:73c3f58b9d70 662 errState = errState + K * (z-H*errState);
NaotoMorita 26:73c3f58b9d70 663 Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*(Rm)*MatrixMath::Transpose(K);
NaotoMorita 26:73c3f58b9d70 664 }
NaotoMorita 26:73c3f58b9d70 665
NaotoMorita 26:73c3f58b9d70 666 void ScErrStateEKF::updateVelocityConstraints()
NaotoMorita 26:73c3f58b9d70 667 {
NaotoMorita 26:73c3f58b9d70 668
NaotoMorita 26:73c3f58b9d70 669 Matrix dcm(3,3);
NaotoMorita 26:73c3f58b9d70 670 computeDcm(dcm, qhat);
NaotoMorita 26:73c3f58b9d70 671 Matrix H(2,nState);
NaotoMorita 26:73c3f58b9d70 672
NaotoMorita 26:73c3f58b9d70 673 Matrix nomVb = dcm*vihat;
NaotoMorita 26:73c3f58b9d70 674 Matrix qeterm = -2.0f*MatrixMath::Matrixcross(nomVb(1,1),nomVb(2,1),nomVb(3,1));
NaotoMorita 26:73c3f58b9d70 675 for(int j = 1;j<4;j++){
NaotoMorita 26:73c3f58b9d70 676 H(1,j) = -qeterm(1,j);
NaotoMorita 26:73c3f58b9d70 677 H(2,j) = -qeterm(3,j);
NaotoMorita 26:73c3f58b9d70 678 //H(3,j) = -qeterm(3,j);
NaotoMorita 26:73c3f58b9d70 679 H(1,9+j) = -dcm(1,j);
NaotoMorita 26:73c3f58b9d70 680 H(2,9+j) = -dcm(3,j);
NaotoMorita 26:73c3f58b9d70 681 //H(3,9+j) = -dcm(3,j);
NaotoMorita 26:73c3f58b9d70 682 }
NaotoMorita 26:73c3f58b9d70 683
NaotoMorita 26:73c3f58b9d70 684 Matrix K = (Phat*MatrixMath::Transpose(H))*MatrixMath::Inv(H*Phat*MatrixMath::Transpose(H)+Rvsc);
NaotoMorita 26:73c3f58b9d70 685 Matrix z(2,1);
NaotoMorita 26:73c3f58b9d70 686 z << nomVb(1,1) << nomVb(3,1) ;
NaotoMorita 26:73c3f58b9d70 687 Matrix corrVal = K * (z-H*errState);
NaotoMorita 26:73c3f58b9d70 688 errState = errState + corrVal;
NaotoMorita 26:73c3f58b9d70 689 Phat = (MatrixMath::Eye(nState)-K*H)*Phat*MatrixMath::Transpose(MatrixMath::Eye(nState)-K*H)+K*(Rvsc)*MatrixMath::Transpose(K);
NaotoMorita 26:73c3f58b9d70 690
NaotoMorita 26:73c3f58b9d70 691 }
NaotoMorita 22:7d84b8bc20b4 692 */
NaotoMorita 22:7d84b8bc20b4 693
NaotoMorita 22:7d84b8bc20b4 694