|
|
|
![]() |
|
|||||||
|
||||||||
|
|
Thread Tools | Rate Thread | Display Modes |
|
#13
|
|||||
|
|||||
|
Re: PID for velocity control
A couple things to keep in mind here:
The standard POSITION PID loop might look something like this: output = Kp*e_pos + Ki*e_pos_sum + Kd*e_pos_delta; Where output is the output. e_pos is the error in position = desired_pos - actual_pos e_pos_sum is the sum of the position errors = e_pos_sum + e_pos e_pos_delta is the derivative of the error = e_pos - e_pos_last (Yes, I know there are other ways to write the PID equation - I usually use the recursive discrete form so I don't need to keep track of an error sum, but I digress...). This loop, if well tuned, should provide pretty good position control. But what about VELOCITY? Speed is the first derivative of position - so we could differentiate the position loop with respect to time to obtain a velocity controller. I will use the D() operator to represent taking the time derivative. D(output) = Kp*D(e_pos) + Ki*D(e_pos_sum) + Kd*D(e_pos_delta); So far so good. What's the derivative of the output? Well, that's the change in output over time, so D(output) = output - output_last. Whats the derivative of e_pos? Remember that e_pos itself is (desired_pos - actual_pos). It's derivative would simply replace "pos" with "vel". e_vel = D(e_pos) = desired_vel - actual_vel. e_vel_sum = D(e_pos_sum) = e_vel_sum + e_vel. e_vel_delta = D(e_pos_delta) = e_vel - e_vel_last. Putting it all together, you get: output - output_last = Kp*e_vel + Ki*e_vel_sum + Kd*e_vel_delta; Let's rearrange... output = output_last + Kp*e_vel + Ki*e_vel_sum + Kd*e_vel_delta; or... output += Kp*e_vel + Ki*e_vel_sum + Kd*e_vel_delta; (assuming output is global or static and persists between loop iterations) So that's how you'd make a velocity controller. Note that the constants will be different than from the positional case (obviously). One other thing - most of the time, people only care about closed loop velocity control in a robot in order to GO STRAIGHT. Having two separate PID controllers (one for each side) is one way to do this. But what if I bump the robot off course? The two sides will independently stabilize near the setpoint after the disturbance, but the entire robot may be pointed in a new direction. Without giving everything away, what if your error term was not (desired - actual), but rather (left_actual - right_actual)? With some changes to the above equation, and a nonzero Ki, the robot will correct its course as it drives, effectively slowing down one motor when the other gets slowed down because of the environment. |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Integral Window for PID Control | phrontist | Programming | 2 | 16-02-2008 17:32 |
| paper: PID Control Theory for FRC Programming | Matt Krass | Programming | 17 | 24-05-2007 03:28 |
| What constants are u using for high velocity PID | Salik Syed | Programming | 3 | 18-02-2006 23:22 |
| Problems Using PID for Velocity | Astronouth7303 | Programming | 6 | 10-02-2006 09:00 |
| Manual Velocity PID, anyone successful? | Chris_Elston | Programming | 20 | 31-01-2006 20:51 |