# Hackers – How to Steer an Autonomous Wheeled Robot to Drive Towards a Detected Object

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:

1. If the object is in the middle of the image, robot should go straight ahead (M1=1, M2=1)
2. If the object is to the right, move forward-right (e.g. M1=1, M2=0.7)
3. Likewise, if the object is to the left of centre, move forward-left (e.g. M1=0.7, M2=1)
4. 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: 