This are actuallty 2 questions:
1 - can someone recommend some readings about autopilot algorithms and similar stuff?
2 - I wanted a confirmation about something I think I understood, which I explain below.
The super-basic concept behind every kind of stabilization (ex. pitch, roll yaw, or GPS position hold for a helicopter) is that the commands should try to make the readings coming from the gyro/magnotemeter, GPS the same as the intended ones.
And since the there is the inertia of the vehicle, we need a PID controller to make the correction without fluctuation as much as possible.
I know this is a super simplistic view, but is this correct?
Thank you
Simone
Replies
Output = (error * P_GAIN) + (integrated_error * I_GAIN) + (error_rate_of_change * D_GAIN)
You can just start with the P stuff. Error is simply (command - actual), multiply that by a gain, and that's what feeds the output (servo, etc). That will settle at a value that is not quite right. That's where I comes in. It drives the DC (non-changing) error to zero.
Every "update" you integrate your error. So if you computed error like this:
error = command - actual
You can do the integral like this (using euler integration):
integrated_error = integrated_error + (error * dt)
... Where dt is the floating point timestep (ie, .1 for 1/10th of a second). This just happens over and over in the update loop.
The derivitave term is the same deal. That just "backs off" of the output the faster the error is changing. For example, if you are commanding a particular roll angle, and the plane starts to roll hard to correct, this term will grow larger and back off of the output a bit. It helps to prevent overshoot.
I usually just do P and PI loops, throwing in D when there's oscillations.
Here's an example to command a bank angle:
void update_roll_PID( float dt )
{
error = (roll_angle - desired_roll_angle);
integrated error += error * dt
aileron_servo_out = error * P_GAIN + integrated_error * I_GAIN + roll_gyro * D_GAIN;
}
So with these PID loops, I fly my plane with the following loops:
1) Desired heading PID ---> Bank angle PID --> ailerons
2) Altitude PID --> Pitch angle PID --> elevator
3) Airspeed PID --> throttle
So at this point you're commanding airspeed, heading, and desired altitude.
Hope this helps.
You have the right idea about stabilization. Generate an error signal (actual roll - desired roll, for example) and use a PID (or other algorithm) to drive a servo that makes the error go to zero.