solaESKF_EIGEN
Dependencies: mbed LPS25HB_I2C LSM9DS1 PIDcontroller LoopTicker GPSUBX_UART_Eigen SBUS_without_mainfile MedianFilter Eigen UsaPack solaESKF_Eigen Vector3 CalibrateMagneto FastPWM
servo.cpp
- Committer:
- NaotoMorita
- Date:
- 22 months ago
- Revision:
- 144:b3a713b4f1c4
- Parent:
- 143:53808e4e684c
File content as of revision 144:b3a713b4f1c4:
#include "global.hpp" // 割り込まれた時点での出力(computeの結果)を返す関数 void calcServoOut() { // sbusデータの読み込み for (int i =0 ; i < 16;i ++){ 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 } //姿勢角の所得 euler = eskf.computeAngles(); euler(1) -= 3.0f*M_PI_F/180.0f; Vector3f gyroBias = eskf.getGyroBias(); //PIDへの状態量のセット pitchPID.setProcessValue(euler(1)); pitchratePID.setProcessValue(gyro(1)-gyroBias(1)); rollPID.setProcessValue(euler(0)); rollratePID.setProcessValue(gyro(0)-gyroBias(0)); yawratePID.setProcessValue(gyro(2)-gyroBias(2)); vxPID.setGain(0.005f,0.0f,0.0f); vyPID.setGain(0.005f,0.0f,0.0f); pitchPID.setGain(20.0f,0.0f,0.0f); pitchratePID.setGain(0.18f,0.0f,0.0f); rollPID.setGain(20.0f,0.0f,0.0f); rollratePID.setGain(0.18f,0.0f,0.0f); Vector3f Vb = eskf.calcVb(); Vector3f dynAcc = eskf.calcDynAcc(acc); vxPID.setProcessValue(dynAcc(0)); vxPID.setSetPoint(0.0f); vyPID.setProcessValue(dynAcc(1)); vyPID.setSetPoint(0.0f); vzPID.setProcessValue(Vb(2)); vzPID.setSetPoint(0.0f); //dT = -vzPID.compute()+rc[2]; dT = +rc[2]; float pitchobj = rc[1]* 30.0f*M_PI_F/180.0f; float rollobj = rc[0] * 30.0f*M_PI_F/180.0f; yawratePID.setSetPoint(0.0f); rollPID.setSetPoint(rollobj); pitchPID.setSetPoint(pitchobj); float pitchrateobj = pitchPID.compute()* 30.0f*M_PI_F/180.0f; float rollrateobj = rollPID.compute()* 30.0f*M_PI_F/180.0f; pitchratePID.setSetPoint(pitchrateobj); rollratePID.setSetPoint(rollrateobj); de = pitchratePID.compute(); da = rollratePID.compute(); dr = -0.1f*rc[3]+yawratePID.compute(); scaledMotorOut[0]= dT+de-dr; scaledMotorOut[1]= dT+0.866f*de-0.866f*da+dr; scaledMotorOut[2]= dT-0.866f*de-0.866f*da-dr; scaledMotorOut[3]= dT-de+dr; scaledMotorOut[4]= dT-0.866f*de+0.866f*da-dr; scaledMotorOut[5]= dT+0.866f*de+0.866f*da+dr; float minArmThrottle = 0.25f; for(int i = 0;i<sizeof(scaledMotorOut)/sizeof(scaledMotorOut[0]) ;i++){ if(scaledMotorOut[i]<-1.0f+minArmThrottle) { scaledMotorOut[i] = -1.0f+minArmThrottle; } } //pc.serial.printf("%f %f %f %f\r\n",dT,rpy.x*180.0f/M_PI,rpy.y*180.0f/M_PI,rpy.z*180.0f/M_PI); float LP_motor = 1.0f; for(int i = 0;i<6 ;i++){ motorOut[i] = (mapfloat(scaledMotorOut[i],-1.0f,1.0f,motorPwmMin,motorPwmMax)); if(motorOut[i]<motorPwmMin) { motorOut[i] = motorPwmMin; }; if(motorOut[i]>motorPwmMax) { motorOut[i] = motorPwmMax; }; } if(rc[7]>0.3f){ motor1.pulsewidth_us(motorOut[0]); motor2.pulsewidth_us(motorOut[1]); motor3.pulsewidth_us(motorOut[2]); motor4.pulsewidth_us(motorOut[3]); motor5.pulsewidth_us(motorOut[4]); motor6.pulsewidth_us(motorOut[5]); }else{ motor1.pulsewidth_us(motorPwmMin); motor2.pulsewidth_us(motorPwmMin); motor3.pulsewidth_us(motorPwmMin); motor4.pulsewidth_us(motorPwmMin); motor5.pulsewidth_us(motorPwmMin); motor6.pulsewidth_us(motorPwmMin); } sendData2PC(); writeSDcard(); if(loop_count >= 5) { sendTelemetry(); loop_count = 1; } else { loop_count +=1; } }