Eigen Revision

Dependencies:   mbed LPS25HB_I2C LSM9DS1 PIDcontroller Autopilot_Eigen LoopTicker GPSUBX_UART_Eigen SBUS_without_mainfile MedianFilter Eigen UsaPack solaESKF_Eigen Vector3 CalibrateMagneto FastPWM

Committer:
NaotoMorita
Date:
Fri Jun 24 05:44:34 2022 +0000
Revision:
143:53808e4e684c
Parent:
141:725321fe2949
complete

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cocorlow 140:53dbdb207542 1 #include "global.hpp"
cocorlow 140:53dbdb207542 2
cocorlow 140:53dbdb207542 3 // 割り込まれた時点での出力(computeの結果)を返す関数
cocorlow 140:53dbdb207542 4 void calcServoOut()
cocorlow 140:53dbdb207542 5 {
cocorlow 140:53dbdb207542 6 // sbusデータの読み込み
cocorlow 140:53dbdb207542 7 for (int i =0 ; i < 16;i ++){
cocorlow 141:725321fe2949 8 rc[i] = 0.65f * mapfloat(float(sbus.getData(i)),368.0f,1680.0f,-1.0f,1.0f) + (1.0f - 0.65f) * rc[i]; // mapped input
cocorlow 140:53dbdb207542 9 }
cocorlow 140:53dbdb207542 10
cocorlow 140:53dbdb207542 11
cocorlow 140:53dbdb207542 12 //姿勢角の所得
cocorlow 140:53dbdb207542 13 euler = eskf.computeAngles();
NaotoMorita 143:53808e4e684c 14
NaotoMorita 143:53808e4e684c 15 Vector3f vihat = eskf.getVihat();
NaotoMorita 143:53808e4e684c 16 Vector3f gyroBias = eskf.getGyroBias();
cocorlow 140:53dbdb207542 17 //PIDへの状態量のセット
NaotoMorita 143:53808e4e684c 18 pitchPID.setProcessValue(euler(1));
NaotoMorita 143:53808e4e684c 19 pitchratePID.setProcessValue(gyro(1)-gyroBias(1));
NaotoMorita 143:53808e4e684c 20 rollPID.setProcessValue(euler(0));
NaotoMorita 143:53808e4e684c 21 rollratePID.setProcessValue(gyro(0)-gyroBias(0));
NaotoMorita 143:53808e4e684c 22 yawratePID.setProcessValue(gyro(2)-gyroBias(2));
NaotoMorita 143:53808e4e684c 23 climbratePID.setProcessValue(vihat(2));
cocorlow 140:53dbdb207542 24
cocorlow 140:53dbdb207542 25 dT = rc[2];
cocorlow 140:53dbdb207542 26
NaotoMorita 143:53808e4e684c 27 // ゲイン切り替え
NaotoMorita 143:53808e4e684c 28 float vihat_norm = vihat.squaredNorm();
NaotoMorita 143:53808e4e684c 29 if (rc[5] < 0.3f){
NaotoMorita 143:53808e4e684c 30 // Hinf
NaotoMorita 143:53808e4e684c 31 hinf_flag = true;
NaotoMorita 143:53808e4e684c 32 if (vihat_norm < 9.0f || rc[2] < -0.8f){
NaotoMorita 143:53808e4e684c 33 pitchPID.setGain(4.55f, 0.0f, 0.0f);
NaotoMorita 143:53808e4e684c 34 pitchratePID.setGain(0.363f, 0.0f, 0.0f);
NaotoMorita 143:53808e4e684c 35 rollPID.setGain(1.34f, 0.0f, 0.0f);
NaotoMorita 143:53808e4e684c 36 rollratePID.setGain(0.219f, 0.0f,0.0f);
NaotoMorita 143:53808e4e684c 37 pitchPID.resetIntError();
NaotoMorita 143:53808e4e684c 38 rollPID.resetIntError();
NaotoMorita 143:53808e4e684c 39 }else{
NaotoMorita 143:53808e4e684c 40 pitchPID.setGain(4.55f, 9.7f, 0.0f);
NaotoMorita 143:53808e4e684c 41 pitchratePID.setGain(0.363f, 0.0f, 0.0f);
NaotoMorita 143:53808e4e684c 42 rollPID.setGain(1.34f, 0.007f, 0.0f);
NaotoMorita 143:53808e4e684c 43 rollratePID.setGain(0.219f, 0.0f,0.0f);
NaotoMorita 143:53808e4e684c 44 }
NaotoMorita 143:53808e4e684c 45 }else{
NaotoMorita 143:53808e4e684c 46 // 従来
NaotoMorita 143:53808e4e684c 47 hinf_flag = false;
NaotoMorita 143:53808e4e684c 48 if (vihat_norm < 9.0f || rc[2] < -0.8f){
NaotoMorita 143:53808e4e684c 49 pitchPID.setGain(10.0f, 0.0f, 0.0f);
NaotoMorita 143:53808e4e684c 50 pitchratePID.setGain(1.0f, 0.0f, 0.0f);//rad/s
NaotoMorita 143:53808e4e684c 51 rollPID.setGain(5.0f, 0.0f, 0.0f);
NaotoMorita 143:53808e4e684c 52 rollratePID.setGain(0.05f, 0.0f, 0.0f);//rad/s
NaotoMorita 143:53808e4e684c 53 pitchPID.resetIntError();
NaotoMorita 143:53808e4e684c 54 rollPID.resetIntError();
NaotoMorita 143:53808e4e684c 55 }else{
NaotoMorita 143:53808e4e684c 56 pitchPID.setGain(10.0f, 0.0f, 0.0f);
NaotoMorita 143:53808e4e684c 57 pitchratePID.setGain(1.0f, 0.0f, 0.0f);//rad/s
NaotoMorita 143:53808e4e684c 58 rollPID.setGain(5.0f, 0.0f, 0.0f);
NaotoMorita 143:53808e4e684c 59 rollratePID.setGain(0.05f, 0.0f, 0.0f);//rad/s
NaotoMorita 143:53808e4e684c 60 }
NaotoMorita 143:53808e4e684c 61 }
NaotoMorita 143:53808e4e684c 62
cocorlow 140:53dbdb207542 63 if (rc[4]>-0.3f && rc[6] < -0.3f)
cocorlow 140:53dbdb207542 64 {
cocorlow 140:53dbdb207542 65 //level_flight();
cocorlow 140:53dbdb207542 66 //point_guide();
NaotoMorita 143:53808e4e684c 67 //climb();
NaotoMorita 143:53808e4e684c 68
NaotoMorita 143:53808e4e684c 69 turning();
cocorlow 140:53dbdb207542 70 rollPID.setSetPoint(roll_obj);
cocorlow 140:53dbdb207542 71 pitchPID.setSetPoint(pitch_obj);
cocorlow 140:53dbdb207542 72 dT += dT_obj;
NaotoMorita 143:53808e4e684c 73 de = pitchPID.compute()-(rc[0]-rc[1])/2.0f;
NaotoMorita 143:53808e4e684c 74 da = rollPID.compute() -(rc[0]+rc[1])/2.0f;
cocorlow 140:53dbdb207542 75 }else{
NaotoMorita 143:53808e4e684c 76 yawratePID.setSetPoint(0.0f);
NaotoMorita 143:53808e4e684c 77 roll_obj = yawratePID.compute()*30.0f*M_PI/180.0f;
NaotoMorita 143:53808e4e684c 78 rollPID.setSetPoint(roll_obj);
NaotoMorita 143:53808e4e684c 79 climbratePID.setSetPoint(0.0f);
NaotoMorita 143:53808e4e684c 80 pitch_obj = -climbratePID.compute()*10.0f*M_PI/180.0f;
NaotoMorita 143:53808e4e684c 81 pitchPID.setSetPoint(pitch_obj);
NaotoMorita 143:53808e4e684c 82 de = pitchPID.compute() -(rc[0]-rc[1])/2.0f*2.0f;
NaotoMorita 143:53808e4e684c 83 da = rollPID.compute() -(rc[0]+rc[1])/2.0f*3.0f;
cocorlow 140:53dbdb207542 84 }
cocorlow 140:53dbdb207542 85
cocorlow 140:53dbdb207542 86 //舵角計算
cocorlow 140:53dbdb207542 87 if(rc[4]<-0.3f){
NaotoMorita 143:53808e4e684c 88 de = -(rc[0]-rc[1])/2.0f;
NaotoMorita 143:53808e4e684c 89 da = -(rc[0]+rc[1])/2.0f;
cocorlow 140:53dbdb207542 90 }
cocorlow 140:53dbdb207542 91
NaotoMorita 143:53808e4e684c 92 scaledServoOut[0]=-de-da;
NaotoMorita 143:53808e4e684c 93 scaledServoOut[1]=de-da;
cocorlow 140:53dbdb207542 94 scaledMotorOut[0]= dT;
cocorlow 140:53dbdb207542 95
NaotoMorita 143:53808e4e684c 96 float LP_servo = 1.0f;
NaotoMorita 143:53808e4e684c 97 float LP_motor = 0.2f;
cocorlow 140:53dbdb207542 98 for(int i = 0; i < sizeof(servoOut)/sizeof(servoOut[0]); i++)
cocorlow 140:53dbdb207542 99 {
NaotoMorita 143:53808e4e684c 100 servoOut[i] = LP_servo*(mapfloat(scaledServoOut[i],-1,1,servoPwmMin,servoPwmMax))+(1.0-LP_servo)*servoOut[i];
cocorlow 140:53dbdb207542 101 if(servoOut[i]<servoPwmMin)
cocorlow 140:53dbdb207542 102 {
cocorlow 140:53dbdb207542 103 servoOut[i] = servoPwmMin;
cocorlow 140:53dbdb207542 104 }
cocorlow 140:53dbdb207542 105 if(servoOut[i]>servoPwmMax)
cocorlow 140:53dbdb207542 106 {
cocorlow 140:53dbdb207542 107 servoOut[i] = servoPwmMax;
cocorlow 140:53dbdb207542 108 }
cocorlow 140:53dbdb207542 109 }
cocorlow 140:53dbdb207542 110
cocorlow 140:53dbdb207542 111 for(int i = 0;i<sizeof(motorOut)/sizeof(motorOut[0]) ;i++){
NaotoMorita 143:53808e4e684c 112 motorOut[i] = LP_motor*(mapfloat(scaledMotorOut[i],-1,1,motorPwmMin,motorPwmMax))+(1.0-LP_motor)*motorOut[i];
cocorlow 140:53dbdb207542 113 if(motorOut[i]<motorPwmMin) {
cocorlow 140:53dbdb207542 114 motorOut[i] = motorPwmMin;
cocorlow 140:53dbdb207542 115 };
cocorlow 140:53dbdb207542 116 if(motorOut[i]>motorPwmMax) {
cocorlow 140:53dbdb207542 117 motorOut[i] = motorPwmMax;
cocorlow 140:53dbdb207542 118 };
cocorlow 140:53dbdb207542 119 }
cocorlow 140:53dbdb207542 120 servoRight.pulsewidth_us(servoOut[0]);
cocorlow 140:53dbdb207542 121 servoLeft.pulsewidth_us(servoOut[1]);
cocorlow 140:53dbdb207542 122 servoThrust.pulsewidth_us(motorOut[0]);
cocorlow 140:53dbdb207542 123
NaotoMorita 143:53808e4e684c 124
cocorlow 140:53dbdb207542 125 sendData2PC();
cocorlow 140:53dbdb207542 126 writeSDcard();
cocorlow 140:53dbdb207542 127
cocorlow 140:53dbdb207542 128 if(loop_count >= 5)
cocorlow 140:53dbdb207542 129 {
cocorlow 140:53dbdb207542 130 sendTelemetry();
cocorlow 140:53dbdb207542 131 loop_count = 1;
cocorlow 140:53dbdb207542 132
cocorlow 140:53dbdb207542 133 }
cocorlow 140:53dbdb207542 134 else
cocorlow 140:53dbdb207542 135 {
cocorlow 140:53dbdb207542 136 loop_count +=1;
cocorlow 140:53dbdb207542 137 }
cocorlow 140:53dbdb207542 138 }