« Previous - Version 20/36 (diff) - Next » - Current version
Edward Getz, 10/07/2015 11:30 pm

LEGO Chase Demo

This page describes how to make a LEGO robot that chases things, like a ball. It's the same robot and program that's used in the Pixy LEGO video. This robot and program is a good launching point for other projects, and it's a good introduction to PID control, which is used throughout robotics and engineering in general.

Building the robot

The robot we're going to build can be found in Laurens Valk's book LEGO Mindstorms EV3 Discovery Book. The robot is called the Explor3r and it uses only parts that are available in the retail Mindstorms EV3 kit.

  1. Assemble Explor3r through step 11. Click here for instructions on how to build Explor3r." That is, stop short of mounting the IR Sensor (step 12). Instead of the IR Sensor, we'll be mounting Pixy. If you are using an NXT brick, your instructions will be very similar.
  2. Locate these LEGO parts and your LEGO-mounted Pixy. (There are instructions on how to mount Pixy to LEGO here)





  7. Attach Pixy as shown.

  8. Connect cable, and you're done with assembly!

Teach Pixy an object

Go ahead and teach Pixy an object. You might try using the button press method. Using the button press method doesn't require that you hook up a USB cable to Pixy and run PixyMon, so it's much more convenient!

Load Chase example

  1. Turn on your LEGO brick if you haven't done so, and hook up a USB cable between your computer and your LEGO brick.
  2. From the LEGO Mindstorms EV3 Software, go to the File menu and select Open Project.

  3. Browse to the location where you unzipped the "LEGO blocks and examples" file (which you can download on this page), and then to the examples directory and then either to the EV3 or NXT directory depending on your brick version. Select "chase.ev3" and click on Open.
  4. Click on the "track" tab. You should see a program that looks like this (below).

  5. Run the program! Click on the play icon in the lower right corner of your EV3 software window. If you don't see the play icon, make sure your LEGO brick is powered on, finished booting, and connected to you computer via a USB cable.

  6. If you are running PixyMon, make sure you are running the "Default program" by clicking on the home icon.

  7. Move the object that you taught Pixy in front its camera lens. The track program simply adjusts the angle of the robot so that it always faces your object. It doesn't chase your object, it just "faces" your object, but it's quick!

What's going on in the track program?

The track program uses X centroid output of the Pixy block

to adjust the heading of the robot by using a PID controller.

That is, the X centroid output of the Pixy block ranges between 0 and 255, depending on where the detected object is in Pixy's image. The "center pixel" is therefore 128. The PID controller tries to move the motors such that the detected object is always centered in the image. It does this by comparing the X centroid value to 128 (the PID controller's Set Point input).

The Control Output of the PID controller is fed directly into the left wheel controller (the Power Left input of the Move Tank controller block). The Power Right input is fed the inverted output of the PID controller by subtracting the PID controller's output from 0. Why are the wheels controlled in opposite directions? We are interested in controlling only the rotation of the robot, and rotating the robot is achieved by powering the motors in opposite directions at the same power/speed. It is in this way that the robot "tracks" the object and always faces it. The program is surprisingly simple!

There is some additional logic in the program to make sure that if there are no detected objects, the robot doesn't move. This is done by comparing the Signature Output of the Pixy block with 0. If the Signature Output is zero, Pixy has not detected an object. If the Signature Output is non-zero, Pixy has detected an object. The Switch block selects between these two possibilities, and feeds the PID controller output into the motors when an object is detected, and feeds 0 into the motors when no objects are detected.

Some notes on adjusting the PID gains

The appeal of the PID controller is it's flexibility. By adjusting the three gain values, one for proportional, one for integral, and one for derivative, lots of different systems can be controlled. So what's up with the chosen PID values?

These were "tuned" by experimentation. You can tune the PID loop yourself. In fact, it's a good way to familiarize yourself with PID control.

Go ahead and set all of the PID gains to 0. That is, click on Proportional input of the PID block and set the value to 0. Do the same for the Integral and Derivative inputs. Now all of the PID gains are 0. You can try to run the program now. And if you guessed that your robot won't move, you're correct!

The proportional gain "does most of the work" as they say, so tuning should begin by adjusting this value. Start with a small value of 0.1 and run the program. Notice how the robot is now very slow and sluggish. That is, when trying to track the object (which you're moving around) the robot seems to be trying, but it's heart doesn't seem to be into it. This is telling you that your proportional gain is too small.

Try settnig the proportional gain to 1.0 and run the program. You might notice that the robot does a shimmy after it faces your object. In other words you move the object quickly, and the robot responds by turning to face the object, and instead of stopping when it faces your object, it keeps on going. It overshoots. In fact, it may overshoot several times before coming to a rest, finally facing your object like it was programmed to do. This is oscillation, and it's a very common problem.

To reduce the oscillation, you need to increase the derivative gain. Increasing the derivative gain is like adding friction to your system, which may sound like something you should avoid. However, increasing the derivative gain does not adversely affect the efficiency of your system as friction does. Start by setting the derivative gain to the same value as the proportional gain. And continue to increase the derivative gain until the oscillation is under control.

If increasing the derivative gain does not remove the oscillation, the proportional gain may be too high. Try reducing the proportional gain (cutting it in half, say), then setting the derivative
gain to zero again, and starting over by increasing the derivative gain until the oscillation is removed.

If you're successful in removing the oscillation, you might try your luck by increasing the proportional gain again (not as high as before) and seeing if you can still bring the oscillation under control with derivative gain. And if you're unsuccessful in removing the oscillation, you can always reduce the proportional gain and try different derivative gains as before.

Our goal is to have our robot that tracks the object quickly, but without oscillation. This is usually the goal, but you may want a robot that oscillates or is sluggish. It's all up to you!

What about the integral gain? Integral gain is useful when the system has trouble reaching the goal. Say if our robot tended to get close to facing our object and then stopped, we could try adding a little integral gain. The integral gain would then make sure that the robot would face the object, eventually. Integral is zero in this example because the the LEGO motors have their own built-in control loops that make sure that we always reach our goal.

Chasing the object

Click on the "chase" tab. You should see a program that looks like this (below).

Notice that it's very similar to the track program. In fact, the track program is mostly intact in the top half of the chase program, but there's an additional PID controller in the bottom half of the program. This PID controller adds the "chase" element.