Ha – awesome – I have made a face tracking robot arm. The 12 year-old me is so jealous.
Here’s how I did it (on Ubuntu 12.04 but should be portable to the Raspberry Pis):
I installed SimpleCV: – http://simplecv.org/ .
(I love this – makes it so simple to prototype.)
I built this robot arm: – http://www.maplin.co.uk/robotic-arm-kit-with-usb-pc-interface-266257 .
I installed pyusb: http://sourceforge.net/apps/trac/pyusb/.
(I did first try sudo apt-get install python-usb – it was already installed and didn’t work giving me errors when trying to import usb.core. I found on the web that the solution to this was removing python-usb and installing from the above site (e.g. download zip, extract, run setup.py).)
I stuck a Microsoft Lifecam Cinema on the top of the assembled robot arm.
I adapted the code below from a SimpleCV example and the arm control code (calling it arm_track.py).
from SimpleCV import Camera, Display
import usb.core, usb.util, time
# Allocate the name 'RoboArm' to the USB device
RoboArm = usb.core.find(idVendor=0x1267, idProduct=0x0000)
# Check if the arm is detected and warn if not
if RoboArm is None:
raise ValueError("Arm not found")
# Create a variable for duration
# Define a procedure to execute each movement
def MoveArm(Duration, ArmCmd):
# Start the movement
# Stop the movement after waiting specified duration
cam = Camera()
disp = Display(cam.getImage().size())
#Get centre of field of vision
centre = 
img = cam.getImage()
# Look for a face
faces = img.findHaarFeatures('face')
if faces is not None:
# Get the largest face
faces = faces.sortArea()
bigFace = faces[-1]
# Draw a green box around the face
face_location = bigFace.coordinates()
print face_location, centre
offset = (face_location - centre)/float(200) #/cam.getImage().size()
if offset < 0:
print "clockwise", offset
MoveArm(abs(offset),[0,2,0]) #Rotate base clockwise
print "anticlockwise", offset
MoveArm(abs(offset),[0,1,0]) #Rotate base anticlockwise