HAPSRG / Mbed 2 deprecated HAPStail

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

Committer:
osaka
Date:
Fri Jan 07 09:49:19 2022 +0000
Revision:
87:981895e1d4f2
Parent:
85:0b14a2a600fc
Child:
88:0fc5df2fddcb
GPS & mag fuse OK

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();
osaka 85:0b14a2a600fc 18 rpy.x = euler(1,1);
osaka 85:0b14a2a600fc 19 rpy.y = euler(2,1);
osaka 85:0b14a2a600fc 20 rpy.z = euler(3,1);
osaka 85:0b14a2a600fc 21
NaotoMorita 57:923e3df16159 22 // 自身の位置に応じてエレベータ舵角を決定する
NaotoMorita 71:62eb45ecffe9 23 float derc = rc[1];
NaotoMorita 71:62eb45ecffe9 24 float darc = rc[0]-rc[1];
cocorlow 63:851e96f54a86 25 deobj = 0.0f;
NaotoMorita 57:923e3df16159 26 switch(pos_tail)
NaotoMorita 57:923e3df16159 27 {
NaotoMorita 57:923e3df16159 28 case 0: //left
osaka 87:981895e1d4f2 29 deobj = derc+darc;
NaotoMorita 57:923e3df16159 30 break;
NaotoMorita 57:923e3df16159 31 case 1: //center
NaotoMorita 71:62eb45ecffe9 32 deobj = derc;
NaotoMorita 57:923e3df16159 33 break;
NaotoMorita 57:923e3df16159 34 case 2: //right
osaka 87:981895e1d4f2 35 deobj = derc-darc;
NaotoMorita 57:923e3df16159 36 break;
NaotoMorita 57:923e3df16159 37 default: // error situation
NaotoMorita 57:923e3df16159 38 deobj = 0.0f;
NaotoMorita 57:923e3df16159 39 break;
NaotoMorita 57:923e3df16159 40 }
NaotoMorita 74:af3b7cedff56 41
NaotoMorita 74:af3b7cedff56 42
NaotoMorita 74:af3b7cedff56 43 float objgain = 15.0f*M_PI/180.0f;
NaotoMorita 74:af3b7cedff56 44 float pitchobj = objgain * (deobj+updateValues.de_command);
NaotoMorita 57:923e3df16159 45 //ゲインの係数をrc8で変更
NaotoMorita 75:7fa924da9d32 46 float gaincoef = 1.0f;
NaotoMorita 74:af3b7cedff56 47 if(gaincoef<0.0f){gaincoef = 0.0f;}
NaotoMorita 74:af3b7cedff56 48 if(gaincoef>1.0f){gaincoef = 1.0f;}
NaotoMorita 75:7fa924da9d32 49 pitchPID.setGain(6.36, 10.6*gaincoef*0.0f,0.0);
NaotoMorita 74:af3b7cedff56 50 pitchratePID.setGain(0.9540,0.0,0.0);
osaka 78:2b9f268ad84c 51 pitchPID.setProcessValue(-rpy.y);
osaka 78:2b9f268ad84c 52 pitchratePID.setProcessValue(-gyro.y);
NaotoMorita 57:923e3df16159 53 //目標値のセット
NaotoMorita 57:923e3df16159 54 pitchPID.setSetPoint(pitchobj); //目標の設定
NaotoMorita 71:62eb45ecffe9 55
cocorlow 63:851e96f54a86 56 de = pitchPID.compute()+pitchratePID.compute();
NaotoMorita 74:af3b7cedff56 57 if(de<-1.0f){de = -1.0f;}
NaotoMorita 74:af3b7cedff56 58 if(de>1.0f){de = 1.0f;}
osaka 82:3daf57031f65 59
osaka 82:3daf57031f65 60 scaledServoOut[0]=de;
cocorlow 56:888379912f81 61
cocorlow 56:888379912f81 62 float LP_servo = 0.2;
cocorlow 56:888379912f81 63 for(int i = 0; i < sizeof(servoOut)/sizeof(servoOut[0]); i++)
cocorlow 56:888379912f81 64 {
cocorlow 56:888379912f81 65 servoOut[i] = LP_servo*(mapfloat(scaledServoOut[i],-1,1,servoPwmMin,servoPwmMax))+(1.0-LP_servo)*servoOut[i];
cocorlow 56:888379912f81 66 if(servoOut[i]<servoPwmMin)
cocorlow 56:888379912f81 67 {
cocorlow 56:888379912f81 68 servoOut[i] = servoPwmMin;
cocorlow 56:888379912f81 69 }
cocorlow 56:888379912f81 70 if(servoOut[i]>servoPwmMax)
cocorlow 56:888379912f81 71 {
cocorlow 56:888379912f81 72 servoOut[i] = servoPwmMax;
cocorlow 56:888379912f81 73 }
cocorlow 56:888379912f81 74 }
cocorlow 56:888379912f81 75
cocorlow 56:888379912f81 76 servo.pulsewidth_us(servoOut[0]);
NaotoMorita 73:be7a8b8188de 77 send2center();
cocorlow 56:888379912f81 78 }