HAPSRG / Mbed 2 deprecated HAPStail

Dependencies:   mbed MatrixMath LPS25HB_I2C LSM9DS1 Matrix2 PIDcontroller LoopTicker SBUS_without_mainfile UsaPack solaESKF_wind Vector3 CalibrateMagneto FastPWM

Committer:
NaotoMorita
Date:
Tue Mar 01 06:53:06 2022 +0000
Revision:
104:f81befbc5ab7
Parent:
103:34e911b94440
Child:
105:aaaed895ffaf
debugging

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cocorlow 56:888379912f81 1 #include "global.hpp"
cocorlow 56:888379912f81 2
cocorlow 56:888379912f81 3 void run()
cocorlow 56:888379912f81 4 {
osaka 85:0b14a2a600fc 5
NaotoMorita 104:f81befbc5ab7 6 preflightCalibration();
NaotoMorita 69:0caaad87cf1d 7
osaka 84:028bd650e8bc 8 //ESKFの共分散設定
osaka 84:028bd650e8bc 9 eskf.setGravity(0.0f,0.0f,9.8f);
NaotoMorita 101:d9895b8eb49f 10 eskf.setPhatPosition(0.1f);
NaotoMorita 101:d9895b8eb49f 11 eskf.setPhatVelocity(0.1f);
NaotoMorita 101:d9895b8eb49f 12 eskf.setPhatAngleError(0.5f);
NaotoMorita 101:d9895b8eb49f 13 eskf.setPhatAccBias(0.001f);
NaotoMorita 101:d9895b8eb49f 14 eskf.setPhatGyroBias(0.001f);
osaka 84:028bd650e8bc 15 eskf.setPhatGravity(0.0000001f);
NaotoMorita 101:d9895b8eb49f 16
osaka 84:028bd650e8bc 17 eskf.setQVelocity(0.001f);
osaka 84:028bd650e8bc 18 eskf.setQAngleError(0.0000025f);
osaka 84:028bd650e8bc 19 eskf.setQAccBias(0.000001f);
osaka 84:028bd650e8bc 20 eskf.setQGyroBias(0.000001f);
osaka 84:028bd650e8bc 21
osaka 84:028bd650e8bc 22 Matrix Rgps(5,5);
osaka 84:028bd650e8bc 23 setDiag(Rgps,0.05f);
osaka 84:028bd650e8bc 24 Rgps(4,4) = 0.1f;
osaka 84:028bd650e8bc 25 Rgps(5,5) = 0.1f;
osaka 84:028bd650e8bc 26
osaka 84:028bd650e8bc 27 float dynAccCriteria = 0.4f;
osaka 84:028bd650e8bc 28 Matrix Racc(3,3);
osaka 84:028bd650e8bc 29 setDiag(Racc,100.0f);
osaka 84:028bd650e8bc 30 Matrix RaccDyn(3,3);
osaka 84:028bd650e8bc 31 setDiag(RaccDyn,5000.0f);
osaka 84:028bd650e8bc 32
osaka 84:028bd650e8bc 33 Matrix Rheading(1,1);
osaka 84:028bd650e8bc 34 Rheading(1,1) = 0.01f;
osaka 84:028bd650e8bc 35
NaotoMorita 71:62eb45ecffe9 36 wait(0.5);
NaotoMorita 104:f81befbc5ab7 37
NaotoMorita 69:0caaad87cf1d 38 _t.start();
NaotoMorita 73:be7a8b8188de 39 tail.Subscribe(tail_address[pos_tail], &(updateValues));
cocorlow 56:888379912f81 40
NaotoMorita 104:f81befbc5ab7 41 preflightCheck();
osaka 91:393b9ae62681 42
cocorlow 56:888379912f81 43 LoopTicker PIDtick;
cocorlow 56:888379912f81 44 PIDtick.attach(calcServoOut,PID_dt);
cocorlow 56:888379912f81 45
osaka 84:028bd650e8bc 46 float tgps = _t.read();
osaka 84:028bd650e8bc 47 float theading = _t.read();
cocorlow 56:888379912f81 48
cocorlow 56:888379912f81 49 while(1)
cocorlow 56:888379912f81 50 {
NaotoMorita 104:f81befbc5ab7 51 tstart = _t.read();
osaka 84:028bd650e8bc 52 //センサの値を取得
cocorlow 56:888379912f81 53 getIMUval();
osaka 103:34e911b94440 54 calcOpticalVel();
osaka 84:028bd650e8bc 55
osaka 84:028bd650e8bc 56 //ekfの更新
osaka 84:028bd650e8bc 57 eskf.updateNominal(MatrixMath::Vector2mat(acc),MatrixMath::Vector2mat(gyro),att_dt);
osaka 84:028bd650e8bc 58 eskf.updateErrState(MatrixMath::Vector2mat(acc),MatrixMath::Vector2mat(gyro),att_dt);
osaka 84:028bd650e8bc 59
NaotoMorita 90:0b1f62f7a83a 60 //キャリブレーション中
NaotoMorita 90:0b1f62f7a83a 61 if(updateValues.calibrationFlag == 1111){
NaotoMorita 104:f81befbc5ab7 62 mainloopCalibration();
osaka 84:028bd650e8bc 63 }else{
NaotoMorita 90:0b1f62f7a83a 64 gpsUpdateFlag = false;
NaotoMorita 101:d9895b8eb49f 65 //pc.printf("%d %d \r\n",updateValues.gps_itow,updateValues.gps_fix );
NaotoMorita 90:0b1f62f7a83a 66 if((gpsitow != updateValues.gps_itow) && (updateValues.gps_fix == 0x03)){
NaotoMorita 90:0b1f62f7a83a 67 gpsUpdateFlag = true;
NaotoMorita 90:0b1f62f7a83a 68 gpsitow = updateValues.gps_itow;
NaotoMorita 90:0b1f62f7a83a 69 tgps = _t.read();
NaotoMorita 90:0b1f62f7a83a 70 }
NaotoMorita 90:0b1f62f7a83a 71
NaotoMorita 90:0b1f62f7a83a 72 headingUpdateFlag = false;
NaotoMorita 90:0b1f62f7a83a 73 if(tstart-theading>0.05f){
NaotoMorita 90:0b1f62f7a83a 74 Matrix euler = eskf.computeAngles();
NaotoMorita 90:0b1f62f7a83a 75 if(fabsf(euler(2,1))<30.0f*M_PI/180.0f){
NaotoMorita 90:0b1f62f7a83a 76 headingUpdateFlag = true;
NaotoMorita 90:0b1f62f7a83a 77 theading = _t.read();
NaotoMorita 90:0b1f62f7a83a 78 }
NaotoMorita 90:0b1f62f7a83a 79 }
NaotoMorita 90:0b1f62f7a83a 80
NaotoMorita 90:0b1f62f7a83a 81 if(gpsUpdateFlag==true){
NaotoMorita 90:0b1f62f7a83a 82 Vector3 pi(updateValues.pi[0], updateValues.pi[1], updateValues.pi[2]);
NaotoMorita 90:0b1f62f7a83a 83 Vector3 vi(updateValues.vi[0], updateValues.vi[1], updateValues.vi[2]);
osaka 98:39e4d1844a24 84 Rgps(1, 1) = (updateValues.gps_acc * 0.849f) * (updateValues.gps_acc * 0.849f);
osaka 98:39e4d1844a24 85 Rgps(2, 2) = (updateValues.gps_acc * 0.849f) * (updateValues.gps_acc * 0.849f);
NaotoMorita 90:0b1f62f7a83a 86 eskf.updateGPS(MatrixMath::Vector2mat(pi),palt,MatrixMath::Vector2mat(vi),Rgps);
NaotoMorita 101:d9895b8eb49f 87 pc.printf("gps\r\n");
NaotoMorita 90:0b1f62f7a83a 88 }else if(headingUpdateFlag == true){
NaotoMorita 90:0b1f62f7a83a 89 float heading = atan2f(-mag.y,mag.x);
NaotoMorita 90:0b1f62f7a83a 90 eskf.updateHeading(heading,Rheading);
osaka 84:028bd650e8bc 91 }else{
NaotoMorita 90:0b1f62f7a83a 92 Matrix dynacc = eskf.calcDynAcc(MatrixMath::Vector2mat(acc));
NaotoMorita 90:0b1f62f7a83a 93 dynaccnorm2 = dynacc(1,1)*dynacc(1,1)+dynacc(2,1)*dynacc(2,1)+dynacc(3,1)*dynacc(3,1);
NaotoMorita 90:0b1f62f7a83a 94 if(dynaccnorm2 > dynAccCriteria*dynAccCriteria){
NaotoMorita 90:0b1f62f7a83a 95 eskf.updateAcc(MatrixMath::Vector2mat(acc),RaccDyn);
NaotoMorita 90:0b1f62f7a83a 96 }else{
NaotoMorita 90:0b1f62f7a83a 97 eskf.updateAcc(MatrixMath::Vector2mat(acc),Racc);
NaotoMorita 90:0b1f62f7a83a 98 }
osaka 84:028bd650e8bc 99 }
osaka 84:028bd650e8bc 100 }
osaka 87:981895e1d4f2 101
cocorlow 56:888379912f81 102 PIDtick.loop();
cocorlow 56:888379912f81 103
osaka 84:028bd650e8bc 104 //制御時間を計測
cocorlow 56:888379912f81 105 float tend = _t.read();
cocorlow 56:888379912f81 106 att_dt = (tend-tstart);
cocorlow 56:888379912f81 107 }
cocorlow 56:888379912f81 108 }