PID for Line Following
Want to make your robot follow a line? At slower speeds, the process is pretty simple - if the sensors say it is going left, steer right and if going right, steer left. This process has its limitations though, mainly when the speed is increased . This is when a PID controller starts to shine.
PID stands for Proportional, Integral, Derivative. A PID controller is a mathematically-based routine that processes sensor data and uses it to control the direction (and/ or speed) of a robot to keep it on course. Why does PID work better than our simple model described above? Let's talk about how robot acts (or behaves) as it follows a line to see why.
Robot Behavior when following a line
Let's say our robot has 3 sensors, Left, Center and Right. When the Center sensor sees the line, the robot is programmed to go straight. When the Left sensor sees the line, the robot is programmed to turn right. When the Right sensor sees the line, the robot is programmed to turn left. This will typically cause the robot the wobble back and forth over the line and if going too fast, it may lose control and stop following the line (the red line in the picture to the right).
This method only takes one behavior into consideration - is the robot centered over the line. To improve performance, we should also take into consideration 2 more behaviors - how rapidly is the robot moving from side to side and how long is it not centered over the line. These 3 behaviors are called Proportional, Integral and Derivative in terms of a PID controller.
To help us discuss PID, here is the definition of some terms commonly used:
Target Position - For line following, this is centered over the line. We will represent this as the value 0 (zero).
Measured Position - This is how far left or right robot is from the line. This value will be a negative or postive value to represent the relative postion to the line.
Error - We call the difference between the target position and the measured position the Error.
Proportional - measures how far your robot is away from the line. Proportional is the foundation for capturing the robots position using sensors. The more granular the sensor data is, the more accurately you can measure the robots position over the line.
Integral - measure the accumulated Error over time. The Integral value increases while the robot is not centered over the line. The longer the robot is not centered over the line, the higher the Integral value becomes.
Derivative - Measures the rate the robot is moving left-to-right or right-to-left. The faster the robot moves side-to-side, the higher the Derivative value is.
P-Factor (Kp) - is a constant value used to increase or decrease the impact of Proportional
I-Factor (Ki) - is a constant value used to increase or decrease the impact of Integral
D-Factor (Kd) - is a constant value used to increase or decrease the impact of Derivative
By combining Proportional, Integral and Derivative values, we can control the motion of our robot more precisely than if we use Proportional alone. The ideal behavoir is represented by the red line in the image to the right. The robot's wavy motion is minimized and the robot stays more centered over the line than it did before.
The overall performance of PID with your robot will depend on the number and precision of the sensors used and the capabilities of the microcontroller you are using. For this example, we have 5 sensors spaced .6" apart and will use an Atmel AVR microcontroller. The microcontroller should at a minimum be able to handle integer math but floating point math is better. The compiler I use is Bascom-AVR which supports floating point math in all AVR chips that have sufficient flash memory to hold the routines.
My latest line following robot uses 5 GP2S40 IR reflective surface sensors spaced .6" apart for detecting a .75" wide white line on a black surface. The sensors are used as a digital input of 0 (no line) or 1 (line). The spacing allows more than two sensors to see the line, increasing the precision of the sensor array. The sensors values are read in and converted to a binary value to help visualize the line position under the sensors.
00100 represents the robot centered over the line
10000 means the robot is to the right of the line
00001 means the robot is to the left of the line
The full range of values is shown below. We assign an numerical value to each one.
00001 = 4
00011 = 3
00010 = 2
00110 = 1
00100 = 0
01100 = -1
01000 = -2
11000 = -3
10000 = -4
00000 = 5 or -5 depending on previous values
The range of possible values for the measured position is -5 to 5. We will measure the position of the robot over the line many times a second and use the value to determine Proportional, Integral and Derivative values.
PID is a series of mathematical calculations. We determine Proportional, Integral and Derivative then add them together to come up with a value used to control the robot. Kp, Ki and Kd are used to tune the PID controller (more on PID tuning below)
Target Position minus the Measured Position = Difference
Difference times Kp= Proportional
Integral plus Difference = Integral (Integral stores the accumulated Difference value)
Integral times Ki = Integral
Difference minus Previous Difference = Rate of Change
Rate of Change times Kd = Derivative (this is sometimes divided by the interval or time between measurements)
Proportional plus Integral plus Derivative = Control value used to adjust the robot's motion
That represents the math of PID but the real secret of it's usefulness is in tuning the PID controller to match the physical characteristics of your robot.
Once you have PID running in your robot, you will probably notice that it still doesn't follow the line properly. It may even perform worse than it did with just proportional! The reason behind this is you haven't tuned the PID routine yet. PID requires the Kp, Ki and Kd factors to be set to match your robot's characteristics and these values will vary considerably from robot to robot. Unfortunately, there is no easy way to tune PID. It requires manual trial and error until you get the desired behavior. There are some basic guidelines that will help reduce the tuning effort.
- Start with Kp, Ki and Kd equalling 0 and work with Kp first. Try setting Kp to a value of 1 and observe the robot. The goal is to get the robot to follow the line even if it is very wobbly. If the robot overshoots and loses the line, reduce the Kp value. If the robot cannot navigate a turn or seems sluggish, increase the Kp value.
- Once the robot is able to somewhat follow the line, assign a value of 1 to Kd (skip Ki for the moment). Try increasing this value until you see less wobble.
- Once the robot is fairly stable at following the line, assign a value of .5 to 1.0 to Ki. If the Ki value is too high, the robot will jerk left and right quickly. If it is too low, you won't see any perceivable difference. Since Integral is cumulative, the Ki value has a significant impact. You may end up adjusting it by .01 increments.
- Once the robot is following the line with good accuracy, you can increase the speed and see if it still is able to follow the line. Speed affects the PID controller and will require retuning as the speed changes.
Click Here to download the Bascom-AVR code used in Arty 3, my most recent line following robot. Arty uses a pair of digital micro servos to articulate the frame to steer the robot (bends in the middle). Arty is capable of following a line at over 1 meter/sec even through 6" radius turns.
Here is a video of Arty running at Chibotica 2007 at iHobby Expo. Arty took first place in the Advanced and Racing Line Following contests.
Note: This discussion of PID is intended for hobby robotics and line following. It is not a perfect example of PID and is simplified in some aspects to make it easier to understand. If you are looking for more detailed information, perform a Google search on "PID controller" for numerous sources of information.