![]() |
PID Help
Hey guys, our team is looking into using PID with encoders and implementing them on our drive system. I've gotten to the point where I can change the setpoint at will and get our motor to drive an encoder to a specific value, but we cannot seem to get it to do so without a considerable amount of overtravel.
In this code, Distance is the recorded distance in pulses of the encoder. We have calculated that a pulse is equal to approximately .73 degrees travel of the shaft of our motor, so anything more than a pulse off is not acceptable. http://i.imgur.com/zc2iMgA.jpg In this code, the left and right trigger buttons are no longer being used. The controller axis is being used to set the setpoint. Since the maximum magnitude of our process variable (Distance) is 124, I have taken the axis value and multiplied it by 124, so a value of 1 on our axis will set the setpoint of our PID at 124. Here is a picture of our gains, outputs, etc: http://i.imgur.com/PKx6P7i.jpg These values are the results of me trying to tune them is such a way that our motor can get to a specified value with a high amount of precision without overshooting, and without taking a long amount of time to adjust the value to an acceptable range. If anybody has successfully run PID.vi with an encoder with high precision, could you please look and see what I am missing here? And if you have had this type of issue, could you tell me how you resolved it? Thanks, William |
Re: PID Help
Does this motor have a load on it?
PID hits a target somewhat better when there is some sort of drag to slow it down. An unloaded motor will coast right on by the setpoint until the PID reacts to bring it back where it will probably coast by again. Why is your output scaled to +/-50 instead of a typical motor +/-1 ? Have you considered plotting the waveform to visualize how the system is behaving? |
Re: PID Help
At the moment, no, it does not.
|
Re: PID Help
I originally had the output set to full 100/-100 capacity, and was just trying anything to alleviate the overtravel on the system. I haven't considered plotting a waveform yet.
|
Re: PID Help
For a test load you can just add something harmless (mostly harmless) to rub against the motor shaft.
Also, setting your speed controller to Brake mode will help a little bit. |
Re: PID Help
I am not the most knowledgeable on this subject but, you seem to be taking the distance out of the encoder, since a drivetrain is set up for continuous motion shouldn't your PID be targeting a specific rate at which the wheels should be spinning? (assuming this is for dynamic input, such as driving in teleop, not autonomous movement) There is a rate output on the encoder, so do you want your code to look a little more like this?
Code: http://i.imgur.com/5Jja5Ce.png What I have written here may just be a load of garbage. It has not been tested, it just seems logical to me. I tried to comment my thought process. |
Re: PID Help
Quote:
Start by setting the gain very low and the times to zero (which will disable the integral and derivative terms). Put the appropriate load on the motor and start increasing the gain until it becomes unstable, then back the gain down again. If you don't get to the set point in a reasonable amount of time, set the integral time to a value slightly longer than you think it should take to get to the set point, and tweak it from there. You might be able to ignore the derivative term completely. |
Re: PID Help
Quote:
|
Re: PID Help
Quote:
So from the OP, it appears that you are using a 500 pulse encoder mounted directly on the motor shaft? Do you have any gear box before the wheels and what is the ratio? What size wheels? Assuming a 5:1 gearbox and a 4" wheel (~12.56 circumfrence) would give distance resolution of 0.005" Is that really what your accuracy requirement is? I recommend double checking your requirements. |
Re: PID Help
Quote:
Quote:
Quote:
Quote:
I want to reiterate that we are using these motors and encoders in the context of mounting them on top of our drive motors and rotating them 90 degrees clockwise or counterclockwise, allowing a "sideshifting" motion, increasing field mobility. Thank you all for your input, and I hope I addressed all the issues properly. |
Re: PID Help
A potentiometer may be a more appropriate sensor.
|
Re: PID Help
Quote:
If youre dead set on using an encoder for your swerve feedback then you should look into tuning your PID methodically and slowly. For high reduction applications like this your proportional will be a pretty small number (0.2 would probably be a good starting point). Ignore I and D until you reach something under control that levels out. Hope you have some success. |
Re: PID Help
Quote:
|
Re: PID Help
Quote:
|
Re: PID Help
Quote:
Imagine instead that you're accuracy requirement was 0.75 degrees, but you're sensor measured 0.075 degrees (10 times the resolution compared to the resolution requirements). You would know the difference between a very small bit off, and 0.75 degrees off, and your PID controller could output a different value based on how far off it is. Quote:
|
Re: PID Help
Quote:
|
Re: PID Help
Quote:
Using the analogy of an automobile suspension
|
Re: PID Help
Okay, so I've gotten to the point, with some tuning, that I can get the motor to get to a set point in a good amount of time, but with a maximum error of six, sometimes eight, pulses. With one pulse ~ .73 degrees, this could lead to the wheel being almost six degrees off center.
Since we are planning to run four motors, each with their own encoder and PID loop, this could result in motors possibly being twelve degrees off collectively, and working against each other, rendering a swerve system useless. My mentor seems to think that the reason the motor can't get to the setpoint in either a reasonable amount of time or a reasonable range (these two seem to be mutually exclusive) because the PID calculates the output out to a very long decimal, but the process variable (encoder pulses) is only giving it integers to work this. I disagree. I think that as someone has earlier replied, it is a resolution problem. With .73 degrees per pulse, it gives us very limited margin for error. I believe that this problem could be solved by the use of a potentiometer, a much more precise analog sensor, rather than an encoder, a digital sensor. So, should we go ahead and try a potentiometer, or am I doing something incorrectly in the tuning of the PID? Thank you for your continued input. |
Re: PID Help
Quote:
|
Re: PID Help
This video refers to the gains as Kp, Ki, and Kd. In the PID gains cluster connected to the PID.vi, the I and D terms are labeled Ti and Td, as in derivative time and integral time.
So, are these functioning the same as an Ki and Kd, or are they functioning in some other way? On another note, I went through the Zeigler-Nichols process described in the video, and after calculations, the Kd I was supposed to have came out to be ~ .0004, which is beyond the three decimal accuracy of the PID gains control. I ended up having to settle for .001. After some testing, the minimum overshoot averaged around 4 pulses, with varying amounts of greater overshoot. This could have been caused by having to settle for a Td of .001 instead of .0004. One thing mentioned in the video is sensor lag, where a sensor can't send pulses fast enough for the PID to process it correctly. Could there be an issue of the PWM cables not having a high enough frequency to keep up? Would an analog sensor be a viable fix to this supposed problem? |
Re: PID Help
Also, after some design changes, there is another reduction and the resolution is now .48 degrees/pulse.
|
Re: PID Help
Forgot you were using LabVIEW. It uses a different form of PID. Check the LabVIEW documentation. |
Re: PID Help
I do not know LabVIEW well, so this might already be what you are doing/the default behavior, but you should read your encoder in 4x decoding mode. This will effectively give you four times the encoder's CPR in resolution.
I doubt very much that you are experiencing significant sensor lag. Quadrature encoders are nearly instantaneous compared to the time constant of your mechanism. |
Re: PID Help
Quote:
|
Re: PID Help
Quote:
|
Re: PID Help
Quote:
|
| All times are GMT -5. The time now is 20:12. |
Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi