Lesson: Exercise: Using a PID Controller

Explore the use of PID controllers to manage motors.

Understand what a PID controller is and how to use one to control robot motors.


With the test robot used to develop this course, there is a problem with the previous examples of turning under gyro or IMU control. When turning at a constant power setting and setting the power to zero when the target angle is reached, depending on motor configuration, gear ratio, robot weight and the turn power, the robot will most likely not stop quick enough to be on the desired angle. This is called overshoot. On our test robot, a 90 degree turn would end up being 110-120 degrees. Fixing this can be tricky to do manually but there is an automated way to better control the turn.

To do this we will use a software routine called a PID controller. PID stands for Proportional, Integral, Derivative. The idea behind a PID controller is to take the desired state value (90 degrees in our turn example), compare that to the actual (feedback) state value (the current gyro or IMU angle) and apply factors to the difference (called the error) that produce a proportional output value. So in our example we start out turning away from zero towards 90 degrees at the full power we specify. As the turn progresses, the angle of turn is fed to the PID controller routine which measures error and produces a value (the turn power) at or near the starting (full) power. As the turn gets closer to 90 degrees, the PID routine starts to return smaller and smaller values thus reducing the power being applied and slowing the rate of turn. In theory this reduction in power and slowing rate of turn will eliminate the overshoot. The PID controller can also apply a tolerance margin that indicates when the actual value is within some percentage of the target to further control robot motors.

A similar example is to use a PID controller to compute the power correction needed to make the robot drive in a straight line. Here the target is zero (gyro not deviating from direction we are traveling) and any change in the measured angle will result in a correction value calculated by the PID controller.

A PID controller can take a lot of tuning to get the desired result but once you get a feel for how they work you can tune them fairly quickly and by using all three of the PID factors you can get quite fine control over motors. 

There are many resources and discussions of PID online. Here, here and here are some resources to start with to investigate PID further. The FIRST forums on programming have extensive discussions of PID in robot applications.

The example below takes the previous DriveAvoidImu example and uses two PID controller instances to manage straight driving and the 90 degree turn on obstacle contact. The PID controller class itself is an inner class inside the example. It would be an obvious candidate to be moved to a utility class.

An obvious question is how did we arrive at .005 for the P value on the turn PID control. In the case of moving from a non-zero error to zero error, we took the maximum error value, 90, and picked a power level we want applied at max error, .45 (45%). We divided the power by the max error ( .45 / 90 = .005 ) to determine P.

In the case of driving straight, the target and error are the same at the start so the error is zero. So we have to determine how much correction we want to apply for how much error. Experimentation showed that .05 (5%) correction power for 1 degree of error worked well, correcting the error without overshooting too much (wandering). 1 / .05 = .05 for P.

As always, you can do these calculations to determine a starting P value and then adjust it to tune actual robot behavior.

In most simple cases only a P value is needed. The I and D values further tune the value returned by a PID controller. A discussion of using these other values along with P is beyond the scope of this lesson.