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:
119:43ac44c68ff0
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 // 割り込まれた時点での出力(computeの結果)を返す関数
cocorlow 56:888379912f81 4 void calcServoOut()
cocorlow 56:888379912f81 5 {
cocorlow 56:888379912f81 6 if(sbus.failSafe == false)
cocorlow 56:888379912f81 7 {
cocorlow 56:888379912f81 8 // sbusデータの読み込み
cocorlow 56:888379912f81 9 for (int i = 0; i < 16;i ++)
cocorlow 56:888379912f81 10 {
cocorlow 56:888379912f81 11 rc[i] = 0.65f * mapfloat(float(sbus.getData(i)),368,1680,-1,1) + (1.0f - 0.65f) * rc[i]; // mapped input
cocorlow 56:888379912f81 12 }
cocorlow 56:888379912f81 13 }
NaotoMorita 62:ef10fd919f7b 14 //pc.printf("rc:%f\r\n",rc[1]);
NaotoMorita 57:923e3df16159 15
osaka 85:0b14a2a600fc 16 //姿勢角の取得
osaka 85:0b14a2a600fc 17 euler = eskf.computeAngles();
NaotoMorita 107:78e6f7bee68e 18 Matrix gyroBias = eskf.getGyroBias();
osaka 85:0b14a2a600fc 19 rpy.x = euler(1,1);
osaka 85:0b14a2a600fc 20 rpy.y = euler(2,1);
osaka 85:0b14a2a600fc 21 rpy.z = euler(3,1);
osaka 85:0b14a2a600fc 22
osaka 88:0fc5df2fddcb 23 if (updateValues.calibrationFlag == 1111)
osaka 88:0fc5df2fddcb 24 {
osaka 88:0fc5df2fddcb 25 alignment();
osaka 88:0fc5df2fddcb 26 }
osaka 88:0fc5df2fddcb 27 else
osaka 88:0fc5df2fddcb 28 {
osaka 88:0fc5df2fddcb 29 rpy.x -= roll_offset;
osaka 88:0fc5df2fddcb 30 rpy.y -= pitch_offset;
osaka 88:0fc5df2fddcb 31 }
osaka 88:0fc5df2fddcb 32
NaotoMorita 57:923e3df16159 33 // 自身の位置に応じてエレベータ舵角を決定する
osaka 115:ceb9ef04bb26 34 float derc = -rc[1];
osaka 115:ceb9ef04bb26 35 //pc.printf("derc: %f\r\n", derc);
osaka 115:ceb9ef04bb26 36 float darc = -rc[0] + rc[1];
osaka 115:ceb9ef04bb26 37 //pc.printf("darc: %f\r\n", darc);
cocorlow 63:851e96f54a86 38 deobj = 0.0f;
NaotoMorita 57:923e3df16159 39 switch(pos_tail)
NaotoMorita 57:923e3df16159 40 {
NaotoMorita 57:923e3df16159 41 case 0: //left
osaka 87:981895e1d4f2 42 deobj = derc+darc;
NaotoMorita 57:923e3df16159 43 break;
NaotoMorita 57:923e3df16159 44 case 1: //center
NaotoMorita 71:62eb45ecffe9 45 deobj = derc;
NaotoMorita 57:923e3df16159 46 break;
NaotoMorita 57:923e3df16159 47 case 2: //right
osaka 87:981895e1d4f2 48 deobj = derc-darc;
NaotoMorita 57:923e3df16159 49 break;
NaotoMorita 57:923e3df16159 50 default: // error situation
NaotoMorita 57:923e3df16159 51 deobj = 0.0f;
NaotoMorita 57:923e3df16159 52 break;
NaotoMorita 57:923e3df16159 53 }
NaotoMorita 74:af3b7cedff56 54
NaotoMorita 119:43ac44c68ff0 55 drobj = rc[3] + updateValues.dr_command;
NaotoMorita 107:78e6f7bee68e 56
NaotoMorita 74:af3b7cedff56 57
NaotoMorita 74:af3b7cedff56 58 float objgain = 15.0f*M_PI/180.0f;
osaka 115:ceb9ef04bb26 59 float pitchobj = objgain * (deobj + updateValues.de_command);
osaka 115:ceb9ef04bb26 60 if (pitchobj > objgain)
osaka 115:ceb9ef04bb26 61 {
osaka 115:ceb9ef04bb26 62 pitchobj = objgain;
osaka 115:ceb9ef04bb26 63 }
osaka 115:ceb9ef04bb26 64 if (pitchobj < -objgain)
osaka 115:ceb9ef04bb26 65 {
osaka 115:ceb9ef04bb26 66 pitchobj = -objgain;
osaka 115:ceb9ef04bb26 67 }
osaka 116:248f2d8cc11e 68 //pc.printf("pitchobj: %f\r\n", pitchobj);
NaotoMorita 118:97ffe77b6f38 69
osaka 116:248f2d8cc11e 70 Matrix vihat = eskf.getVihat();
osaka 116:248f2d8cc11e 71 float vihat_norm = vihat(1, 1) * vihat(1, 1) + vihat(2, 1) * vihat(2, 1) + vihat(3, 1) * vihat(3, 1);
NaotoMorita 122:2e77adcf0c0d 72 if (hilFlag == false){
NaotoMorita 122:2e77adcf0c0d 73 if (vihat_norm > 9.0f || rc[2] > -0.8f)
NaotoMorita 122:2e77adcf0c0d 74 {
NaotoMorita 122:2e77adcf0c0d 75 pitchPID.setGain(6.36f, 10.6f*0.5f,0.0);
NaotoMorita 122:2e77adcf0c0d 76 pitchratePID.setGain(0.9540f,0.0f,0.0f);
NaotoMorita 122:2e77adcf0c0d 77 }else{
NaotoMorita 122:2e77adcf0c0d 78 pitchPID.setGain(6.36f, 0.0f,0.0);
NaotoMorita 122:2e77adcf0c0d 79 pitchPID.resetIntError();
NaotoMorita 122:2e77adcf0c0d 80 pitchratePID.setGain(0.9540f,0.0f,0.0f);
NaotoMorita 122:2e77adcf0c0d 81
NaotoMorita 122:2e77adcf0c0d 82 }
NaotoMorita 118:97ffe77b6f38 83 }else{
NaotoMorita 118:97ffe77b6f38 84 pitchPID.setGain(6.36f, 0.0f,0.0);
NaotoMorita 118:97ffe77b6f38 85 pitchPID.resetIntError();
NaotoMorita 118:97ffe77b6f38 86 pitchratePID.setGain(0.9540f,0.0f,0.0f);
NaotoMorita 118:97ffe77b6f38 87 }
osaka 116:248f2d8cc11e 88
NaotoMorita 109:27ae949bc38e 89 yawratePID.setGain(2.0f,0.0f,0.0f);
NaotoMorita 108:e582f8bd4729 90 pitchPID.setProcessValue(rpy.y);
NaotoMorita 108:e582f8bd4729 91 pitchratePID.setProcessValue((gyro.y-gyroBias(2,1)));
NaotoMorita 107:78e6f7bee68e 92 yawratePID.setProcessValue(gyro.z-gyroBias(3,1));
NaotoMorita 57:923e3df16159 93 //目標値のセット
NaotoMorita 57:923e3df16159 94 pitchPID.setSetPoint(pitchobj); //目標の設定
NaotoMorita 71:62eb45ecffe9 95
cocorlow 63:851e96f54a86 96 de = pitchPID.compute()+pitchratePID.compute();
NaotoMorita 74:af3b7cedff56 97 if(de<-1.0f){de = -1.0f;}
NaotoMorita 74:af3b7cedff56 98 if(de>1.0f){de = 1.0f;}
osaka 116:248f2d8cc11e 99 //pc.printf("%f %f %f %f %f\r\n",pitchobj,deobj,de,drobj,dr);
NaotoMorita 107:78e6f7bee68e 100
NaotoMorita 107:78e6f7bee68e 101 dr = yawratePID.compute()+drobj;
NaotoMorita 107:78e6f7bee68e 102 if(dr<-1.0f){dr = -1.0f;}
NaotoMorita 107:78e6f7bee68e 103 if(dr>1.0f){dr = 1.0f;}
osaka 82:3daf57031f65 104
NaotoMorita 118:97ffe77b6f38 105 dTl = rc[2]+drobj*0.2f+updateValues.dT_command;
NaotoMorita 118:97ffe77b6f38 106 dTr = rc[2]-drobj*0.2f+updateValues.dT_command;
NaotoMorita 118:97ffe77b6f38 107
NaotoMorita 108:e582f8bd4729 108 scaledServoOut[0]=-de;
NaotoMorita 107:78e6f7bee68e 109 scaledServoOut[1]=dr;
NaotoMorita 118:97ffe77b6f38 110 scaledMotorOut[0]= dTl;
NaotoMorita 118:97ffe77b6f38 111 scaledMotorOut[1]= dTr;
cocorlow 56:888379912f81 112
cocorlow 56:888379912f81 113 float LP_servo = 0.2;
cocorlow 56:888379912f81 114 for(int i = 0; i < sizeof(servoOut)/sizeof(servoOut[0]); i++)
cocorlow 56:888379912f81 115 {
cocorlow 56:888379912f81 116 servoOut[i] = LP_servo*(mapfloat(scaledServoOut[i],-1,1,servoPwmMin,servoPwmMax))+(1.0-LP_servo)*servoOut[i];
cocorlow 56:888379912f81 117 if(servoOut[i]<servoPwmMin)
cocorlow 56:888379912f81 118 {
cocorlow 56:888379912f81 119 servoOut[i] = servoPwmMin;
cocorlow 56:888379912f81 120 }
cocorlow 56:888379912f81 121 if(servoOut[i]>servoPwmMax)
cocorlow 56:888379912f81 122 {
cocorlow 56:888379912f81 123 servoOut[i] = servoPwmMax;
cocorlow 56:888379912f81 124 }
cocorlow 56:888379912f81 125 }
cocorlow 56:888379912f81 126
NaotoMorita 107:78e6f7bee68e 127 float LP_motor = 0.2;
NaotoMorita 107:78e6f7bee68e 128 for(int i = 0; i < sizeof(motorOut)/sizeof(motorOut[0]); i++)
NaotoMorita 107:78e6f7bee68e 129 {
NaotoMorita 107:78e6f7bee68e 130 motorOut[i] = LP_motor*(mapfloat(scaledMotorOut[i],-1,1,motorPwmMin,motorPwmMax))+(1.0-LP_motor)*motorOut[i];
NaotoMorita 107:78e6f7bee68e 131 if(motorOut[i]<motorPwmMin)
NaotoMorita 107:78e6f7bee68e 132 {
NaotoMorita 107:78e6f7bee68e 133 motorOut[i] = motorPwmMin;
NaotoMorita 107:78e6f7bee68e 134 }
NaotoMorita 107:78e6f7bee68e 135 if(motorOut[i]>motorPwmMax)
NaotoMorita 107:78e6f7bee68e 136 {
NaotoMorita 107:78e6f7bee68e 137 motorOut[i] = motorPwmMax;
NaotoMorita 107:78e6f7bee68e 138 }
NaotoMorita 107:78e6f7bee68e 139 }
NaotoMorita 107:78e6f7bee68e 140
cocorlow 56:888379912f81 141 servo.pulsewidth_us(servoOut[0]);
NaotoMorita 107:78e6f7bee68e 142 rudServo.pulsewidth_us(servoOut[1]);
NaotoMorita 107:78e6f7bee68e 143 motor1.pulsewidth_us(motorOut[0]);
NaotoMorita 107:78e6f7bee68e 144 motor2.pulsewidth_us(motorOut[1]);
NaotoMorita 73:be7a8b8188de 145 send2center();
NaotoMorita 118:97ffe77b6f38 146 send2pc();
cocorlow 56:888379912f81 147 }