LEGO Chase Demo

Version 16 (Edward Getz, 10/07/2015 11:10 pm)

1 1 Edward Getz
h1. LEGO Chase Demo
2 1 Edward Getz
3 7 Edward Getz
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.
4 1 Edward Getz
5 1 Edward Getz
h2. *Building the robot*
6 1 Edward Getz
7 2 Edward Getz
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.  
8 1 Edward Getz
9 7 Edward Getz
# 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.  
10 4 Edward Getz
# Locate these LEGO parts and your LEGO-mounted Pixy. (There are instructions on how to mount Pixy to LEGO "here":/projects/cmucam5/wiki/Mounting_Pixy_with_LEGO.)   
11 3 Edward Getz
!{width: 40%}!
12 3 Edward Getz
13 3 Edward Getz
14 1 Edward Getz
!{width: 40%}!
15 4 Edward Getz
16 6 Edward Getz
17 4 Edward Getz
!{width: 40%}!
18 4 Edward Getz
19 6 Edward Getz
20 5 Edward Getz
!{width: 40%}!
21 5 Edward Getz
22 5 Edward Getz
23 5 Edward Getz
!{width: 40%}!
24 5 Edward Getz
25 5 Edward Getz
# Attach Pixy as shown.
26 5 Edward Getz
!{width: 40%}!
27 1 Edward Getz
28 7 Edward Getz
# Connect cable, and you're done with assembly!
29 1 Edward Getz
!{width: 40%}!
30 7 Edward Getz
31 9 Edward Getz
h2. *Teach Pixy an object*
32 9 Edward Getz
33 9 Edward Getz
Go ahead and [[teach Pixy an object 2|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!  
34 9 Edward Getz
35 7 Edward Getz
h2. *Load Chase example*
36 8 Edward Getz
37 7 Edward Getz
# Turn on your LEGO brick if you haven't done so, and hook up a USB cable between your computer and your LEGO brick.
38 7 Edward Getz
# From the LEGO Mindstorms EV3 Software, go to the *File* menu and select *Open Project*.  
39 7 Edward Getz
40 7 Edward Getz
41 7 Edward Getz
# Browse to the location where you unzipped the "LEGO blocks and examples" file (which you can download "on this page":/projects/cmucam5/wiki/Latest_release.), 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*.
42 9 Edward Getz
# Click on the "track" tab.  You should see a program that looks like this (below). 
43 10 Edward Getz
!{width: 50%}!
44 9 Edward Getz
45 9 Edward Getz
# 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.   
46 9 Edward Getz
47 9 Edward Getz
48 9 Edward Getz
# If you are running PixyMon, make sure you are running the "Default program" by clicking on the home icon.
49 9 Edward Getz
50 9 Edward Getz
51 11 Edward Getz
# 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!
52 11 Edward Getz
53 7 Edward Getz
54 14 Edward Getz
h2. *What's going on in the track program?*
55 12 Edward Getz
56 13 Edward Getz
The track program uses *X centroid* output of the "Pixy block":/projects/cmucam5/wiki/Pixy_LEGO_Block
57 12 Edward Getz
58 12 Edward Getz
to adjust the heading of the robot by using a "PID controller":/projects/cmucam5/wiki/PID_LEGO_Block.
59 1 Edward Getz
60 14 Edward Getz
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).  
61 14 Edward Getz
62 14 Edward Getz
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!
63 14 Edward Getz
64 15 Edward Getz
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.
65 15 Edward Getz
66 16 Edward Getz
h2. *Some notes on adjusting the PID gains*
67 1 Edward Getz
68 16 Edward Getz
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?
69 16 Edward Getz
70 16 Edward Getz
71 16 Edward Getz
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.  
72 16 Edward Getz
73 16 Edward Getz
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!   
74 16 Edward Getz
75 16 Edward Getz
OK, let's get started. The proportional gain "does most of the work" as they say, so tuning should begin by adjusting this value.  Start with a small value like 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.  
76 16 Edward Getz
77 16 Edward Getz
Try increasing 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 the 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 should.  This is oscillation, and it's a very common problem.  
78 16 Edward Getz
79 16 Edward Getz
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.  
80 16 Edward Getz
81 16 Edward Getz
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
82 16 Edward Getz
gain to zero again, and starting over by increasing the derivative gain. 
83 16 Edward Getz
84 16 Edward Getz
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!  
85 16 Edward Getz
86 16 Edward Getz
What about the integral gain?  Integral gain is useful when the system has trouble reaching the goal.  If our robot tends to not get close to facing our object and then stops, we could try adding a little integral gain.  The integral gain would then make sure that the robot would face the object, eventually.  Integral gain isn't used here because the the LEGO motors have their own built-in control loops that make sure that we always reach our goal.  
87 7 Edward Getz