During the same session at which we figured out how to translate joystick movements into motor signals for a robot with two drive wheels (https://coderdojoathenry.org/2019/02/24/hackers-how-to-control-a-robots-wheel-motors-based-on-joystick-movements/), we moved on to figuring out how to control the motor so as to steer an autonomous robot towards an object of interest.
Again, we did a bunch of calculations on a whiteboard (see end of post), and I have re-drawn them for this post.
This builds on the previous work, led by Kevin, on object detection in Python: https://coderdojoathenry.org/2018/12/06/hackers-starting-with-object-recognition/
We assume the setup is as follows:
- We have a robot with two wheels attached to motors, one on the left and one on the right
- We have code to control the motors for the two wheels (which we call Motor M1 and Motor M2) with a value in the range -1 to 1, where 1 is full speed ahead, 0 is no movement, and -1 is full speed reverse
- We have a camera mounted on the robot, facing directly ahead
- We have code to get an image from the camera and can detect an object of interest, and find its centre (or centroid) within the image
The objective is:
- If the object is in the middle of the image, robot should go straight ahead (M1=1, M2=1)
- If the object is to the right, move forward-right (e.g. M1=1, M2=0.7)
- Likewise, if the object is to the left of centre, move forward-left (e.g. M1=0.7, M2=1)
- If the object is not found, we turn the robot around in a circle to search for it (M1=1, M2=-1)
The first three of these are illustrated below:
Our solution is to treat this as a variant of what we previously worked out before, where we had a joystick input, where the X direction of the joystick controls forward movement and its Y direction controls whether to move left or right. In this case, we are steering left/right while always moving forward. Therefore, X has a fixed value (X=1) and Y is a value that depends on the direction of the object of interest.
The equations we came up with are:
X = 1 (a fixed value)
Y = (W – HWid) * YMax / HWid
Then use X and Y to calculate the motor control values as before:
M1 = X + Y, constrained to being between -1 and +1
M2 = X – Y, constrained to being between -1 and +1
Here:
- X is a fixed positive value: X=1 for full speed, or make it smaller to move forward more slowly
- Y is calculated from the equation above
- W is the distance of object’s centre from left edge of the image, in pixels
- HWid is half the width of the image, in pixels (for example, for a basic VGA image, 640×480, HWid is 640/2 = 320)
- YMax is a value approximately 0.5, but needs to be calibrated – it depends on how sharply you want your robot to steer towards the object
- M1 is the control signal for Motor M1, in the range -1 (full reverse) to +1 (full forward)
- M2 is the same for Motor M2
- Constrained means: if the calculated value is less than -1, set it to -1; if it is greater than +1, set it to +1.
Here are our calculations on the whiteboard: