I’m working on a Quadcopter for my senior design in
electrical engineering (this is the last semester). There are two problems with
this, my professors don’t allow me to use an already made code or share my code
so this makes it a little bit difficult to ask for help, but I’m going to try
to explain my program as much as I can. This might also work as a guide to
anyone trying to make their own program. (I’m using an arduino mega)
Right now, I’m having a lot of problems getting my PID
coefficients to work. (I hope that’s the only thing I need)
I’m using http://www.sparkfun.com/products/9431
6 DOF 2 gyros 1 accelerometer to get my pitch and roll angles (I also have a
magnetometer to measure the yaw but I’m not implementing that yet). In order to
get the angles I multiply the gyro reading times the difference of the time and
to get the angles from the accelerometer I use trigonometric functions
(accelerometers give the vector of the acceleration and you have to get the X
and Y angles from that vector).
After calculating the angle from the gyroscope and
accelerometer I use a kalman filter to mix both signals, you need to combine
them because a gyro keeps increasing its error with time and the accelerometer
is too noisy and gives wrong readings in certain occasions. I used to have a
complementary filter but I think the Kalman filter works better, the
complementary filter is only an equation: compAngleX = (0.98*(compAngleX+(gyroXrate*dtime/1000)))+(0.02*(accXangle)).
I’m using almost the same script as this one: http://arduino.cc/forum/index.php/topic,58048.0.html
great project and guy by the way very helpful.
After the kalman filter I’m able to get a pretty accurate
angle in both directions going from -90 to 90 there might be two problems with
this though, I don’t actually know if I’m getting the angle measurements fast
enough because of the sensors or the script and I don’t know if I should use
low pass filters (my sensors are analog not digital). The measurements look
fast enough although my eyes can’t read at 50Hz or more so I have my doubts.
After the kalman filter I use the angles as input for a PID
control, I’m using the arduino PID library for this. This might not be good
enough I really don’t know. I know how a PID is supposed to be but I don’t
think I can do a better PID that the one in the library, the guy who wrote it
did a pretty good job ( here’s the explanation made by the author: http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid...)
These are my settings for the PID:
My set point varies with respect of the receiver signal for
pitch and roll, the set point is 0 when I’m not touching the remote control
stick and it can go up to 35 this means that when I move the stick all the way
the PID will try to set the output (which is the actual angle of the quadcopter)
to 35 degrees in the specified direction.
The PID library is on automatic which I think means that it
will always be working, manual is when you want to turn the PID off at some
My output limits go from -90 to 90 this are the same as the
input angles, I don’t know if this will cause a problem. I didn’t want to have
more than 90 as a limit since the PID might take longer to get to the maximum
and I kind of wanted to keep the value from -90 to 90.
My sample time for the PID is 10 milliseconds which will
give 100 Hz, my ESCs run at 50 Hz so this should be fine? I’m not entirely sure;
maybe the sampling time should run at the exact frequency needed (50 Hz).
Finally, I have two sets of coefficients for the PID one set
of conservative coefficients (really small almost 0) and a set of aggressive
coefficients. The aggressive coefficients are used when the difference of the
angle and the set point is more than 10 degrees and the conservative when it is
less. I haven’t experimented with the two sets of coefficients that much, I
used to have only one set but I found out that with vibrations the sensors can
measure a little less than 10 degrees even when at an actual 0 degrees so
hopefully this will eliminate some noise and increase the speed of the motors when
it actually needs it.
Now, my biggest question comes right after this. Once I have
the value coming out of the PID I add that value (absolute value) to the value
of the throttle (the one that controls the speed of the 4 motors at the same
time) my question is: what is the recommended percentage that the direction and
balancing signals should have with respect of the maximum speed of the motors?
I actually have a potentiometer that changes the value of
the throttle (the value for direction and balancing always go from 0 to 90 when
taking absolute value) this changes the percentage of those signals.
To send the signal to the ESCs I’m using the arduino servo
library this should be working just fine, I used an oscilloscope to check that
the signals coming out of the arduino give the same width (minimum and maximum)
and frequency as my receiver of the remote control, I don’t have the values
right now but it was somewhere close to 50 Hz and 1000ms minimum width and
2000ms maximum width.
I might be calibrating the ESCs the wrong way though, what
you are supposed to do in order to calibrate them is to start the motors having
the throttle in the maximum position then after hearing certain beeps you are
supposed to lower the stick to the lowest position, this makes the ESCs know
what are your maximum and minimum widths and adjusts to make them its maximum
and minimum speed.
To make that work, my maximum value before going to the
servo library is the maximum value of the throttle this presents a problem, if
the throttle is at its maximum the motors won’t have any room to increase their
speed when the PID needs it in order to get the quad to the set point, this
shouldn’t be a big problem at first since I usually never go above the 50% of
the throttle in order to make the quad fly.
Sorry, this is getting quite long for a post. Just to make
it clearer I’m using a + configuration this means that to balance the quad I increase
the speed of the motor that is tilted down and for example when I need to go
forward the motor in the back increases its speed.
To calibrate my PID I start with only one axis (I disconnect
the other two motors and hang them) then
I start calibrating, which I think works pretty well, the working axis
stabilizes really fast actually faster than some that I’ve seen in some videos,
but when I try all the motors at the same time I’m having a lot of problems
getting it off the ground. Let me rephrase that, it does get off the ground
somewhere around 10 cm, sometimes it wobbles a lot but it is still sort of
flying and some other times it looks like it is stable but when I try
increasing the speed a little bit more it just flips quite fast, as if it isn’t
even trying to stabilize after some point but it does stabilize when trying it
on one axis.
To anyone making their own quad you need the PID control it
really changes things I tried it first with no PID and you get an unstable
system and I really mean unstable, instead of decreasing the angle it just
keeps increasing more and more, it’s kind of fun to watch…
Anyways, is there something that I’m missing? Some secret
kind of PID control no one ever talks about or am I making a mistake or having
a wrong approach somewhere?
I hope someone can give me some hints and that this post
helps someone. If anyone has any question I’ll try to answer as fast as I can.
Hey Allen, I saw in one of your threads you had done a presentation at Texas A&M, are you still in school there? I'm a senior here at Texas A&M and was wondering if maybe you knew of any local spots for info on these things. I'm wanting to make a pretty sturdy one for aerial video footage, but I'm not sure about the local laws for something like this. I've done my homework though and (I'm sure you pro's will spit on me for this idea), but I think I want to go with the pre-built dji naza controller (w/ or w/out gps?).
Hey,how have you been?
I finished a lighter stucture last week and im currently working in the Yaw control still... have you had any luck with it? any good ideas on how to calibrate that PID?
I have one question that you might have the answer to. All the quadcopters that Ive seen have the sensors in the middle but wouldnt it be better to have them as far from the center as posible? since a small degree change makes more difference as you go away from the center? maybe im just not thinking right i have to inish this in a few weeks lol...
I've been doing alright, thanks for asking! I did a presentation at Texas A&M's Pathways Symposium last week, and had a good time. The poster presentation itself was in shambles, but I didn't mind at all - its the experiance going there is what counts.
I've haven't had any luck with the system so far... currently the old 0.1 code is officially down the trash bin, and 0.2 C++ code is in the works. Wish I had a couple of more people help with the construction of the system code, but that's basically how it has been since the start.
Bitterness aside, the new code will be in AV/MISRA complient C++ and take advantage of classes and other "non-memory hogging" features as much as possible. The new Vector and Matrix classes are looking promising with their ability to be at any size, but otherwise is another headache within a headache.
The Yaw PID controller should be tuned just like any of the other systems, Zero the I and D and adjust the P until it oscillates or barely decays, and then adjust the I and D terms... ( there should be a detailed guide on how to do this somewhere )
The IMU sensor placement can theoritically be anywhere you want it to be, but keep in mind that the accelerometers are made to sense all linear accelerations. If you have an accelerometer offset from the centor of rotation ( which in our case is the C.G. or C.M. ) then the accelerometer will detect rotational acceleration in addition to gravity and the craft's linear acceleration.
a = g + (radius*w)
a = acceleration sensed by the accelerometer
g = acceleration due to gravity
radius = the distance from the center of rotation
w = the angular acceleration about the center of rotation
In fact, if you can place the IMU sensor at a known distance away from the C.G., you may be able to use the IMU for yaw dampening, versus the standard compass and gyro. Keep in mind though that for absolute heading, a compass and GPS is still the preferred way to go, since noise filtering is tricky.
Hey Allen, yesterday i finished programming and setting up my i2c sensors (the ones they use in Aeroquad) and they perform 10 times better than the old razor we have so if you havent changed it i would recomend doing it.
Now i was checking for noise on my sensors, and a lot of it came from the motors vibrations which i reduced by balancing props, putting some foam to reduce the vibration and stuff like that but i was still receiveng too much noise, specially in the magnetometer so i decided to put the receiver antena as far as i could and it reduced the noise by a whole lot.
Right now i am using a breadboard with wires connecting everything.I know bad idea, the i2c didnt even work until i twisted the cables. Im making my PCB this week which will help reduce a lot of the noise i think. My question is do you know of a way of eliminating the noise from the receiver? should i be covering the arduino and sensors with a case and putting the receiver outside ? wrapping something in aluminum helps? Anyway anything you know on the subject should be a lot of help. I tried looking for answers but apparently no one cares that much about it maybe im the only idiot that designs a quadcopter with a breadboard with huge i2c wires (they are not that big lol)
Glad to hear! I'm unfortunately stuck with the razor for now until I can get some additional hobby funds, I'm also grounded until I can flesh out the new 0.2 code. :(
The receiver shouldn't be causing noise on your compass, unless the amplifier is leaking RF. Don't put your compass inside of a metal box, because that will block out the Earth's magnetic field too. You could try placing the receiver inside of a metal box and try grounding/not grounding it to see what happens.
Wrapping in aluminum works if you can't get a box, but be careful when stuff comes into contact with it.
It looks like you are in the final steps of your project. But just in case it can be of some help, I am working on the physical modeling of the quadcopter in the state space following this text book:
This discussion is helping me too.
Thank you very much.
Looks like an interesting book, I'll have to see if I can look through it sometime.
As far as state space goes, I've gone through making a block diagram of the attitude angle control loop, and the only non-linearity is where the propeller acts upon the envrionment.
Since a propeller directly outputs acceleration, and not airspeed, you have to go through some serious math when trying to linearize it. I did however find a useful equation:
w_craft = w_prop * (prop_pitch / radius)
w_craft = angular speed of the craft
w_prop = angular speed of the propeller
prop_pitch = The propellers pitch ( or distance per 1 revolution of the propeller)
radius = the distance from the motor to the center of mass. Perpendicular to the propeller's thrust vector
You can then extend this equation to all motors working on a given axis ( whatever you've defined it as ).
Note that this equation is actually a limit, but for small changes in w_prop, it can be assumed linear and instantanious.
I've got the math around here somewhere, but chances are your going through the same thing right about now. :P
I don't know if it is allowed by the forum policy or not but I fund the book in this Internet link:
and I attach it to this post. Hope this is of some help and don't forget to buy it if you like it in:
To the moderator: If this post is inappropriate, feel free to delete it.
Hi Allen, hope your project is going well. Ive had some busy weeks, sorry i havent posted anything. Anyways my quadcopter is flying, it flied one week before it was due lol.
I didnt use anything similar to the equations you just posted anywhere actually im not entirely sure what they are for. My quad still needs some work to be as stable as many projects out there but i think im going to take a break from quadcopters for a while x_x .
I appreciate all the help you gave me and im here if I could be of any help. Here is the final flight I made with the quadcopter,
@ Javio Thanks for the info.
Things are going to be slow for some time to come, I finally bit the bullet and decided to go all out with the design of the software. It's looking very promising now, but I need to get the programming details ironed out as well as hunt for a couple of coders to help get the grunt work done.
Thumbs up on the flight! It looks like the pilot was doing most of the work though (instead of the MCU), lol.
This is a study of filtering out Gyro filter from Quadcopter by analyzing real data.
hello, i just want to ask how to relate the 6 dof output to change the quadcopter motor's speed so it would stabilize the copter?
Are you looking to make your own program, or are you just looking for something to get you flying?