Hello dear members,
I believe that the time has come, where I have to ask you guys for some support over here.
And I also hope that this will help other people with similar projects.
However, I’m up for doing a tricopter. And right now I’m in the phase where I need you guys to confirm if my algorithm for stabilizing is correct.
I’ll post a picture to illustrate my thought. As they say, a picture can tell you more a thousand words (If you'd like to see the picture, go to the end of the post).
- Read values from transmitter (throttle will give from 0 - ~180, the rest of the sticks gives ~90 in middle)
- Read values from sensor (180 degrees if plan)
- PID CONTROL
- Combine PID outputs with throttle value
- Output the values to the motors
For the PID configs
PID myPID_Roll_Plus( &Input_Roll_Plus, &Output_Roll_Plus, &Setpoint_Roll_Plus, 1.5, 0.1, 0.5, DIRECT);
PID myPID_Roll_Minus( &Input_Roll_Minus, &Output_Roll_Minus, &Setpoint_Roll_Minus, 1.5, 0.1, 0.5, REVERSE);
PID myPID_Pitch_Plus( &Input_Pitch_Plus, &Output_Pitch_Plus, &Setpoint_Pitch_Plus, 1.5, 0.1, 0.5, DIRECT);
PID myPID_Pitch_Minus( &Input_Pitch_Minus, &Output_Pitch_Minus, &Setpoint_Pitch_Minus, 1.5, 0.1, 0.5, REVERSE);
Setting the values for the variables (OBS. setpoint is set to 90, because the sticks from the transmitter outputs 90 if not touched)
//////////////////////////////////////////////
///// PID SETTINGS /////
/////////////////////////////////////////////
void PID_SETTINGS(){
myPID_Pitch_Plus.SetMode(AUTOMATIC);
myPID_Pitch_Plus.SetOutputLimits(0,180);
Setpoint_Pitch_Plus = 90;
myPID_Pitch_Minus.SetMode(AUTOMATIC);
myPID_Pitch_Minus.SetOutputLimits(0,180);
Setpoint_Pitch_Minus = 90;
myPID_Roll_Plus.SetMode(AUTOMATIC);
myPID_Roll_Plus.SetOutputLimits(0,180);
Setpoint_Roll_Plus = 90;
myPID_Roll_Minus.SetMode(AUTOMATIC);
myPID_Roll_Minus.SetOutputLimits(0,180);
Setpoint_Roll_Minus = 90;
}
PID calculations (As I said before, the setpoint is set to 90. Thats why Im subtracting with 90. 180 - 90 = 90.
Input_Pitch_Plus = kalAngleY-90;
myPID_Pitch_Plus.Compute();
Input_Pitch_Minus = kalAngleY-90;
myPID_Pitch_Minus.Compute();
Input_Roll_Plus = kalAngleX-90;
myPID_Roll_Plus.Compute();
Input_Roll_Minus = kalAngleX-90;
myPID_Roll_Minus.Compute();
The outputs for the motors
THROTTLE_PID_BACK = RECEIVER_THROTTLE_VAL + Output_Pitch_Plus;
THROTTLE_PID_FRONT_LEFT = RECEIVER_THROTTLE_VAL + Output_Roll_Plus + Output_Pitch_Minus;
THROTTLE_PID_FRONT_RIGHT = RECEIVER_THROTTLE_VAL + Output_Roll_Minus + Output_Pitch_Minus;
Here is the picture:
This will explain much better than the text above.
Ive also made a page on github, If ud like too see the whole code.
https://github.com/freak174/Tricopter--Build-phase-.git
Edit:
Forgot to mention that I am only trying to stabilize the tricopter by the throttle, which means Ive excluded all other sticks from the transmitter.