Pan / Tilt face tracking with the raspberry pi

With some effort I have found that controlling two servo motors to allow a webcam to pan/tilt while tracking a face in real time using the raspberry pi not as impossibleĀ as it may at first seem. With some careful tweaking and code optimization I was able to allow the pi to keep up with two servos while running OpenCV face detection at 320Ɨ240 looking for a right profile,left profile, and frontal face and adjusting the servos faster than once per second.

Step 1: Acquire the hardware.

Things needed:

A raspberry piĀ ā€”Ā Model A will work fine, I have theĀ originalĀ Model B which has the same specs as the new Model A (minus network).
A pan/tilt bracket
Two Servos
A GPIO Ribbin Cable
A Pi-Supported Webcam ā€” Ā I used a Logitech C210

Assuming you already have a raspberry pi and a webcam the additional hardware will run you about $25Pan Tilt face tracking with the raspberry pi

Step 2: Get your raspberry pi ready.

Make sure you are using the Official RaspbianOSĀ (the hard-float version) and that it is up to date.
You may want to overclock your raspberry pi. I did to 800mhz. The higher you go the faster the facial recognitionĀ will be, but the less stable your pi may be.

Install OpenCV for python: sudo apt-get install python-opencv
Get the wonderful servoblaster servo driver for the raspberry pi by Richard Hirst: here

You can download all the files as a zip archive and extract them to a folder somewhere on the pi.
To install the servo blaster driver open a terminal and CD into the directory where you extracted the servoblaster files
run the command: make install_autostart

You may want to make servoblaster time-out and stop sending signals to the servo after a second if it's not being moved.
to do this add the following line to /etc/modules: servoblasterĀ idle_timeout=1000

start servoblaster with the following command: sudo modprobe servoblaster

The next task is to get the camera functioning as expected:

First of all, thanks a lot to Gmoto for finding this and pointing it out, it was the last piece of the ā€œpiā€ to get everything running smoothly; you have to adjust some parameters in the uvcvideo module to get everything running well.
Namely, run these commands:

rmmod uvcvideo
modprobe uvcvideo nodrop=1 timeout=5000 quirks=0x80

You will need to run that every time you reboot if you plan to run the face tracking program, or alternatively add the parameters to /etc/modules like you did with the servoblaster time-out tweak.

Step 3: Put together your rig

Build the pan/tilt brackets as per the instructions and attach the servos.
Attach your camera to the top of the bracket (i just used tape) and plug it into your raspberry pi usb port.
I was able to power it without a usb hub, but you may want to get a powered usb hub and go through that.

Step 4: Connecting the servos

Servoblaster considers servo-0 to be whatever is connected to GPIO 4 and servo-1 is whatever is connected to GPIO-17.
Servos have three wires, one is red which is Vin/positive, one is brown or black which is ground/negativeĀ and the other is control.
using theĀ ribbonĀ cable (and in my case some connector wireĀ jammed into the holes) connect the control wire for each servo to the correct pin. The code assumes that servo-0 will control the left-right movement and servo-1 will control the up-down movement of the camera; so connect them this way.

Now it would seem to be common sense that the Vin for the servos would come from the 5v pins from the GPIO and the ground for the servos would come from the ground pins of GPIO, but this did not work in my case because I used a larger servo for the base. The large servo pulled more power than the pi was willing so supply. I was, however, able to power my smaller tilt servo with no issue. Also,Ā Richard Hirst who made servoblaster seems to imply that he can drive multiple small servos with the GPIO 5v.Pan Tilt face tracking with the raspberry pi schematic I have also learned that there are some fuses in my version of the pi that were later removed related to those power pins. My instinct tells me that you could power two smaller servos from those pins on a newer pi. If you cannot, this is what you will have to do:

You will need some kind of external power source which is able to handle a heavy 5v-6v load: I used the one built into an arduino, but any 5ish volt power source should do; the servos are rated for up to 6v. The 5v pin on a computer power supply, a 5v-6v wall charger, someĀ batteriesĀ inĀ parallel; whatever floats your boat. Once you have your external source just connect the positive andĀ negativeĀ lines from the servos to the positive andĀ negativeĀ side of your power source, then connect the ground (negative) from your external power source to a ground pin on the raspberry pi GPIO.

Step 5: Run the program

I have attached the python script to this article, it's called PiFace.py to run it just CD to it's location in terminal and type: python PiFace.py

Here are some videos of mine in action.

 

For more detail: Pan / Tilt face tracking with the raspberry pi


About The Author

Ibrar Ayyub

I am an experienced technical writer holding a Master's degree in computer science from BZU Multan, Pakistan University. With a background spanning various industries, particularly in home automation and engineering, I have honed my skills in crafting clear and concise content. Proficient in leveraging infographics and diagrams, I strive to simplify complex concepts for readers. My strength lies in thorough research and presenting information in a structured and logical format.

Follow Us:
LinkedinTwitter

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top