I have an ongoing project to build an ROV - and underwater robot. Rather than simply build an observation class robot (one which simply flies and records), I wanted to build a robot capable of interacting with its environment. To that end I added a robot arm.
The question then becomes - how should I control this robot arm. There are lots of options and I've tried a few (see the projects logs), but I'm currently settled on using a identical robot arm on land to control the arm at sea: as the controller arms moves so does the robot arm.
To keep things simple with the software integration, this robot sensor arm presents itself to the PC as a standard joystick. This allows you to access it via your favorite software APIs on both PC or Mac. For me, this means I access the robot arm controller via the GamePad API found in your favorite modern browsers.
During construction I used my position sensing servos in place of standard servos, but otherwise followed the instructions here. Subsequently however, I've changed the joints around a bit to make it more appropriate for my ROV target.
Using a robot chassis to control a remote robot chassis requires position sensors in the controlling chassis. Because the robot frame was designed to accommodate servos, the easiest way to add position sensors is to buy a bunch of cheap servos, and modify them to provide position feedback. It turns out you can buy such things from Adafruit (see https://www.adafruit.com/products/1404) but at $15 a piece, these seems a little pricey. All I need is a servo sized box which turns a potentiometer to produce a voltage proportional to its position.
Modify these servos is really simple. First unscrew the based the servo unit by removing the four screws.
This exposes the control board and motor.
If you lift the control board you'll find a potentiometer underneath it. This is what we want access to. There are three wires connecting the PCB to the potentiometer. We need to sense the voltage found on the center wire.
As with all servos, these are operated using three wires: power, ground and control. I still need power and ground for the servo (we need a voltage to be divided by the pot) but I no longer need the control wire - so I reused this to provide the position output instead. To do this I unsoldered the control wire from its current position on the pcbs, and re-soldered it to the central lead from the potentiometer.
Below you see the three wires - ground, power and control (white):
Here the white wires has been moved to a pin which is connected to the center of the potentiometer. Fortunately, in this servo at least, the potentiometer is attached to an easy to reach point on the PCB.
Now, when the servo is powered, the control lead will provide a voltage proportional to the position of the servo.
Finally, because we're only using this servo for feedback, I disconnected the motor so it would never be powered. You can do this by simply cutting the wires, or you can unsolder them (which is what I did).
All that remains is to pop the top back on, and we have a position sensing "servo" which can be used in the robot arm controller.
I decided my ROV needed a robot arm when I original conceived it. First, I like the idea of my robot being able to interact with its environment. Second, since my kids are involved with the MATE program, I wanted a chance to investigate robot manipulators for myself (so they didn't have all the fun).
The robot arm itself is constructed using a cheap Chinese 6-dof robot arm kit and a number of underwater servos. The question was how best to control it.
My original thought was to use some sort of 3D positional scanner - specifically the Leap Motion Controller. The demos looked very cool, especially the way it "sees" and track your hand. I wrote the software to take the hand and finger position, do the appropriate reverse kinematic math, and apply it to the movement of the robot arm. Unfortunately, at least when I originally tried this, the Leap Motion tracking just wasn't good enough and consistent enough to track my hand, especially as I would attempt to grab objects. It would suddenly loose the position of my arm and hand. Not great if you're trying to manipulate a remote object underwater.
My second though was simply to use a joystick to move the arm in the X/Y/Z space. Again, using a little math, it was possible to move the arm on the robot and manipulate the grabber; and while this worked, it wasn't the most natural way to operate a remote hand.
May third, current, and documented here, solution was to construct a remote arm controller. The idea was to build an exact duplicate of the robot arm which would be kept on land. Instead of servos, I would place position sensors at each joint, and use these values to control the servos on the robot. The result, as the controller moves, so does the robot arm - one mirrors the movements of the other.