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.