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 Apr 05 06:57:21 2022 +0000
Revision:
122:2e77adcf0c0d
Parent:
121:1d5b3e1f0d21
Child:
127:839ae718713b
HIL

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 105:aaaed895ffaf 36 Matrix Ropt(2,2);
NaotoMorita 105:aaaed895ffaf 37 setDiag(Ropt,10.0f);
NaotoMorita 105:aaaed895ffaf 38
NaotoMorita 71:62eb45ecffe9 39 wait(0.5);
NaotoMorita 104:f81befbc5ab7 40
NaotoMorita 69:0caaad87cf1d 41 _t.start();
NaotoMorita 73:be7a8b8188de 42 tail.Subscribe(tail_address[pos_tail], &(updateValues));
NaotoMorita 118:97ffe77b6f38 43 pc.Subscribe(0000,&(rp));
cocorlow 56:888379912f81 44
NaotoMorita 121:1d5b3e1f0d21 45 if(hilFlag == false){
NaotoMorita 121:1d5b3e1f0d21 46 preflightCheck();
NaotoMorita 121:1d5b3e1f0d21 47 }else{
NaotoMorita 121:1d5b3e1f0d21 48 prefligt_finished = true;
NaotoMorita 121:1d5b3e1f0d21 49 };
NaotoMorita 120:9f4725deb5a6 50
osaka 91:393b9ae62681 51
cocorlow 56:888379912f81 52 LoopTicker PIDtick;
cocorlow 56:888379912f81 53 PIDtick.attach(calcServoOut,PID_dt);
cocorlow 56:888379912f81 54
cocorlow 56:888379912f81 55 while(1)
cocorlow 56:888379912f81 56 {
NaotoMorita 104:f81befbc5ab7 57 tstart = _t.read();
osaka 84:028bd650e8bc 58 //センサの値を取得
NaotoMorita 120:9f4725deb5a6 59 if(hilFlag==false){
NaotoMorita 120:9f4725deb5a6 60 getIMUval();
NaotoMorita 120:9f4725deb5a6 61 }else{
NaotoMorita 120:9f4725deb5a6 62 getHilIMUval();
NaotoMorita 120:9f4725deb5a6 63 }
NaotoMorita 120:9f4725deb5a6 64
osaka 103:34e911b94440 65 calcOpticalVel();
osaka 84:028bd650e8bc 66
osaka 84:028bd650e8bc 67 //ekfの更新
osaka 84:028bd650e8bc 68 eskf.updateNominal(MatrixMath::Vector2mat(acc),MatrixMath::Vector2mat(gyro),att_dt);
osaka 84:028bd650e8bc 69 eskf.updateErrState(MatrixMath::Vector2mat(acc),MatrixMath::Vector2mat(gyro),att_dt);
osaka 116:248f2d8cc11e 70 Matrix pihat = eskf.getPihat();
osaka 116:248f2d8cc11e 71 //pc.printf("pihat: %f %f %f\r\n", pihat(1, 1), pihat(2, 1), pihat(3, 1));
osaka 84:028bd650e8bc 72
NaotoMorita 90:0b1f62f7a83a 73 //キャリブレーション中
NaotoMorita 90:0b1f62f7a83a 74 if(updateValues.calibrationFlag == 1111){
NaotoMorita 104:f81befbc5ab7 75 mainloopCalibration();
osaka 84:028bd650e8bc 76 }else{
NaotoMorita 90:0b1f62f7a83a 77 gpsUpdateFlag = false;
NaotoMorita 101:d9895b8eb49f 78 //pc.printf("%d %d \r\n",updateValues.gps_itow,updateValues.gps_fix );
NaotoMorita 120:9f4725deb5a6 79 if(hilFlag==false){
NaotoMorita 120:9f4725deb5a6 80 if((gpsitow != updateValues.gps_itow) && (updateValues.gps_fix == 0x03)){
NaotoMorita 120:9f4725deb5a6 81 getGPSval();
NaotoMorita 120:9f4725deb5a6 82 gpsUpdateFlag = true;
NaotoMorita 120:9f4725deb5a6 83 gpsitow = updateValues.gps_itow;
NaotoMorita 120:9f4725deb5a6 84 tgps = _t.read();
NaotoMorita 120:9f4725deb5a6 85 }
NaotoMorita 120:9f4725deb5a6 86 }else{
NaotoMorita 120:9f4725deb5a6 87 if(tstart-tgps>0.2f){
NaotoMorita 120:9f4725deb5a6 88 getHilGPSval();
NaotoMorita 120:9f4725deb5a6 89 tgps = _t.read();
NaotoMorita 120:9f4725deb5a6 90 gpsUpdateFlag = true;
NaotoMorita 120:9f4725deb5a6 91 }
NaotoMorita 90:0b1f62f7a83a 92 }
NaotoMorita 90:0b1f62f7a83a 93
NaotoMorita 106:36458fb9b5b7 94 sensorUpdateFlag = false;
NaotoMorita 106:36458fb9b5b7 95 if(tstart-tsensors>0.05f){
NaotoMorita 106:36458fb9b5b7 96 sensorUpdateFlag = true;
NaotoMorita 106:36458fb9b5b7 97 tsensors = _t.read();
NaotoMorita 90:0b1f62f7a83a 98 }
NaotoMorita 90:0b1f62f7a83a 99
NaotoMorita 90:0b1f62f7a83a 100 if(gpsUpdateFlag==true){
NaotoMorita 122:2e77adcf0c0d 101 if(hilFlag==false){
NaotoMorita 122:2e77adcf0c0d 102 Rgps(1, 1) = (updateValues.gps_acc * 0.849f) * (updateValues.gps_acc * 0.849f);
NaotoMorita 122:2e77adcf0c0d 103 Rgps(2, 2) = (updateValues.gps_acc * 0.849f) * (updateValues.gps_acc * 0.849f);
NaotoMorita 122:2e77adcf0c0d 104 }else{
NaotoMorita 122:2e77adcf0c0d 105 Rgps(1, 1) = 1.1f;
NaotoMorita 122:2e77adcf0c0d 106 Rgps(2, 2) = 1.1f;
NaotoMorita 122:2e77adcf0c0d 107 }
NaotoMorita 90:0b1f62f7a83a 108 eskf.updateGPS(MatrixMath::Vector2mat(pi),palt,MatrixMath::Vector2mat(vi),Rgps);
NaotoMorita 106:36458fb9b5b7 109 //pc.printf("gps\r\n");
NaotoMorita 106:36458fb9b5b7 110 }else if(sensorUpdateFlag == true){
NaotoMorita 106:36458fb9b5b7 111 if(sensorUpdateID==1){
NaotoMorita 106:36458fb9b5b7 112 Matrix euler = eskf.computeAngles();
NaotoMorita 106:36458fb9b5b7 113 if(fabsf(euler(2,1))<30.0f*M_PI/180.0f){
osaka 114:ba221936d53a 114 //float heading = atan2f(-mag.y,mag.x);
osaka 114:ba221936d53a 115 eskf.updateHeading(updateValues.heading,Rheading);
NaotoMorita 106:36458fb9b5b7 116 //pc.printf("heading\r\n");
NaotoMorita 106:36458fb9b5b7 117 }
NaotoMorita 106:36458fb9b5b7 118 sensorUpdateID += 1;
NaotoMorita 106:36458fb9b5b7 119 }else{
NaotoMorita 109:27ae949bc38e 120 //float vnorm_opt2 = updateValues.vx_opt*updateValues.vx_opt+updateValues.vy_opt*updateValues.vy_opt;
NaotoMorita 109:27ae949bc38e 121 //if(updateValues.dist_ir<1.0f && vnorm_opt2 < 400.0f){
NaotoMorita 109:27ae949bc38e 122 //if(vnorm_opt2 < 0.1f){
NaotoMorita 109:27ae949bc38e 123 //Matrix vbOpt(2,1);
NaotoMorita 109:27ae949bc38e 124 //vbOpt(1,1) = updateValues.vx_opt;
NaotoMorita 109:27ae949bc38e 125 //vbOpt(2,1) = updateValues.vy_opt;
NaotoMorita 109:27ae949bc38e 126 //eskf.updateVb(vbOpt,Ropt*0.1f);
NaotoMorita 109:27ae949bc38e 127 //}else{
NaotoMorita 108:e582f8bd4729 128 //Matrix vbOpt(2,1);
NaotoMorita 108:e582f8bd4729 129 //vbOpt(1,1) = updateValues.vx_opt;
NaotoMorita 108:e582f8bd4729 130 //vbOpt(2,1) = updateValues.vy_opt;
NaotoMorita 108:e582f8bd4729 131 //eskf.updateVb(vbOpt,Ropt);
NaotoMorita 109:27ae949bc38e 132 //}
NaotoMorita 106:36458fb9b5b7 133 //pc.printf("opt\r\n");
NaotoMorita 109:27ae949bc38e 134 //}
NaotoMorita 106:36458fb9b5b7 135 sensorUpdateID=1;
NaotoMorita 106:36458fb9b5b7 136 }
osaka 84:028bd650e8bc 137 }else{
NaotoMorita 90:0b1f62f7a83a 138 Matrix dynacc = eskf.calcDynAcc(MatrixMath::Vector2mat(acc));
NaotoMorita 90:0b1f62f7a83a 139 dynaccnorm2 = dynacc(1,1)*dynacc(1,1)+dynacc(2,1)*dynacc(2,1)+dynacc(3,1)*dynacc(3,1);
NaotoMorita 90:0b1f62f7a83a 140 if(dynaccnorm2 > dynAccCriteria*dynAccCriteria){
NaotoMorita 90:0b1f62f7a83a 141 eskf.updateAcc(MatrixMath::Vector2mat(acc),RaccDyn);
NaotoMorita 106:36458fb9b5b7 142 //pc.printf("dyn acc\r\n");
NaotoMorita 90:0b1f62f7a83a 143 }else{
NaotoMorita 90:0b1f62f7a83a 144 eskf.updateAcc(MatrixMath::Vector2mat(acc),Racc);
NaotoMorita 106:36458fb9b5b7 145 //pc.printf("static acc\r\n");
NaotoMorita 106:36458fb9b5b7 146 }
NaotoMorita 106:36458fb9b5b7 147
osaka 84:028bd650e8bc 148 }
NaotoMorita 106:36458fb9b5b7 149
NaotoMorita 105:aaaed895ffaf 150
osaka 84:028bd650e8bc 151 }
osaka 87:981895e1d4f2 152
cocorlow 56:888379912f81 153 PIDtick.loop();
cocorlow 56:888379912f81 154
osaka 84:028bd650e8bc 155 //制御時間を計測
cocorlow 56:888379912f81 156 float tend = _t.read();
cocorlow 56:888379912f81 157 att_dt = (tend-tstart);
cocorlow 56:888379912f81 158 }
cocorlow 56:888379912f81 159 }