Quad position hold with mouse sensor - some details

Hi,
Some people asked for a few more details on the mouse sensor position hold I am experimenting with on my quad (originial post here), so here we go:
As I mentioned in the original post, the sensor is an ADNS 2610 made by Avago. This is a fairly ubiquitous sensors found in many cheap mice - the reason I chose this one is two-fold: there is good documentation available for it (e.g. the datasheet, or just google for it, there are plenty of people who hacked it), and it provides a mode in which the 'raw' 18x18 pixel image can be read out of it, significantly simplifying the setup of appropriate optics.
I ended up not finding a mouse with that particular sensor, so I ordered the raw sensor on Digikey instead. According to the datasheet, 3 caps and 1 oscillator are required in a minimal circuit - all of these are cheaply available at digikey.
Above is an image of my prototype circuit: on the right you see a lens with a screw-type lens barrel from a cheap (around $10 at Walmart, I think) keychain camera, in the center you can see a raw ADNS 2610 and on the right is the circuit itself. The lens I ended up using is not this exact one, but one from a different camera which looks very similar - either one would have worked.

On the second image you can see the sensor again (this time upright), as well as the bottom of the pcb (never mind the sloppy soldering). In the prototype, I basically hot-glued the lens barrel lined up to the bottom of the board and used the screw-mechanism to adjust the focal length (more on that below). My final design looks very similar, except that I used a single-piece perforated circuit board and drilled a 1/4" hole in the center for the sensor aperture - I did not include a picture because it is wrapped in a small, hot-glued foam box and mounted on the quad at the moment, and I am too lazy to take everything apart.

The image above shows the raw image data output of the mouse sensor with the optics adjusted. You can see my hand in front of a bright wall, making the hand itself appear dark. The distance sensor-hand is approximately 0.5 meters (give or take). The image is read out from the sensor via an Atmega which passes it on to a Perl/Tk script via serial. The serial protocol used by the ADNS 2610 is documented in the datasheet and fairly easy to emulate on a microcontroller. Since I knew that the keychain camera lens must have a focal length of a few millimeters, I basically determined the correct focal length by trial-and-error (I pointed it at a dark shelve on a bright wall and adjusted until it was clearly visible). Because the focal length is short compared to the object distance (~5mm versus something of the order of 1m), this setup does a reasonable job at focusing anything further away than 0.5-1m. On the actual quad, I do not look at the raw image data, but let the optical flow implementation on the mouse sensor to the hard work for me and just read x- and y- displacements.
I use the altitude data from the sonar range finder together with tilt information from the IMU to get an absolute position reference.

The mouse sensor rigged in this way appears to work quite well in daylight conditions outside, I have not tried to use it indoors yet (I would imagine one needs a reasonably well-lit environment). I did notice once that the quad seemed to get slightly confused by its own shadow in bright sunlight around noon, but I have not systematically tested this. You can see a screenshot of my GCS during a typical flight above. The window on the left just shows the attitude and other assorted information about the quad (the software is written in Perl/Tk - I mostly use Linux). The window on the right shows the ground-track in position-hold mode as detected by the quad. The blue bar indicates one meter, the trace starts in the center of the cross-hair. It did a reasonable job holding its position, it was a tad windy that day, I think. I am sure with some patience one could fine-tune the PID parameters to tighten the position-hold considerably.
Hope this was interesting,
Marko

Views: 15236


JDrones
Comment by Jani Hirvinen on October 4, 2010 at 7:47pm
And when you least expect it, this community strikes back.. We just had yesterday morning long discussions about using mouse sensors on quads on our weekly development chats. I would definitely like to discuss more with you about possibility to use method on indoor/outdoor position hold.
Comment by I Heart Robotics on October 4, 2010 at 8:17pm
Excellent work.
Comment by Mathew krawczun on October 4, 2010 at 9:57pm
very impressive I've for something like this thanks for posting

3D Robotics
Comment by Chris Anderson on October 4, 2010 at 10:01pm
This is sweet! We'd love to have you work with the ArduCopter team to turn this into a product that we can manufacture and support. Please PM me or Jani to get this going.

Developer
Comment by Jason Short on October 4, 2010 at 10:29pm
Have you tried with or without an IR lens? I used an old logitech mouse which had this sensor to make terrible black and white video camera. I never persued it for anything else because the Math to figure out the transltion versus roll wouldn't work without a perfect height reference. Perhaps that's why the Parrot won't hold over 10 feet.

Developer
Comment by Randy on October 5, 2010 at 4:57am
A proper PCB instead of all hand soldering and you've got a brand new sensor that nobody else has got.

If this actually works you're one of the coolest guys i know.
Comment by Marco Glattfelder on October 5, 2010 at 5:09am
I know it's a bit off topic, but could this not be used for an optical ILS on fixed wing UAV? There is another hack of the Wii controller camera module that may be interesting. My tragedy is that the in my case I need to have a precise touch down of my - planned - UAVin a 30x30m area...
Comment by GR0B on October 5, 2010 at 6:46am
You could try adding a few IR LEDs to help with the lighting/shadow issues. You might run into an issue of the LEDs creating a pattern that confuses the sensor (for this you could try frosting the LEDs with a nail file)
Comment by Marko Kleine Berkenbusch on October 5, 2010 at 6:56am
@Chris: Sure, I'd be happy to help out. I already PMed Jani...

@Jason: The sensor itself does not have any filters, but I removed the IR filter from the camera lens I used. The datasheet mentions that the CCD is most sensitive around 870nm or something around there, so it is near IR. The math is not too bad if you can live with certain approximations (which are good enough in this case, I think).
Comment by Geoffrey L. Barrows on October 5, 2010 at 3:42pm
Congratulations! I've never played with these optical mouse sensors myself but some people have and have obtained some nice results.

If you don't mind suggestions: For the lens- For small quantities you can try Sunex (www.optics-online.com) who has lenses with focal lengths ranging from very small to large and you might be able to find one with a better focal length. Largan Precision (www.largan.com.tw) sells a more limited range of lenses but with an emphasis of volume (think iPhone). Both are based in Asia but Sunex has an office in the Bay Area and I've found them pretty helpful.

It would be interesting to see how this works in lower light. The data sheet states a minimum intensity of 80mW/m^2, which (if my calculations are correct) corresponds to about 50-100 lux or so- with a fast enough lens this might work in a bright indoor environment but not when the lights are out.

@GR0B: You will need very bright LEDs to overcome the shadow. A better approach may be a wider field of view so that the shadow is smaller, though this will blur out tiny features. LEDs *might* work for low light environments if you are hovering close to the ground.

@Marco: Regarding ILS- Yes, as long as there is no shadow from the air vehicle (overcast or if sun is low).

Comment

You need to be a member of DIY Drones to add comments!

Join DIY Drones

© 2014   Created by Chris Anderson.

Badges  |  Report an Issue  |  Terms of Service