Uncategorized

Robot Arm IK Singularities Problem: Can you help?

My goal is to make a 6 degree of freedom robot arm for less, and make it available to everyone.

My first robot arm was 3 degrees of freedom. Given what I’d made before it was pretty straightforward.

My next is an attempt at 5 degrees of freedom.

I’ve got forward kinematics working in software. I tell the shoulder to move and then I can get a point describing the finger tip position and two vectors that describe the finger orientation.

I’m really really stuck on the inverse kinematics. With inverse kinematics I have the position and orientation of the finger tip and I want to find the angle of each joint. I can calculate the position of the finger tip, the wrist, the elbow, the shoulder, and the base. I can even reuse the code from the 3DOF arm to find the angle of the base, the shoulder, and the elbow. The trouble is the angle at each of those positions.

Singlularities

Try this: grab your right index finger with your left hand, then move your right elbow without moving or turning your finger. Each elbow position is a valid answer to the question “how do I move my arm to put the finger here?” A singularity is when there are many answers for the same question, and singularities are trouble for programmers.

Here’s the latest code so you can see for yourself. A picture is worth a thousand words. what’s an interactive simulation worth?

If you have Java you should be able to run this program. fingers crossed! Definitely with eclipse. WASD flies around, QE flies up/down, left click+mouse movement looks around. RF,TG,YH,UJ,IK,OL move the six joints. P switches between forward kinematics (default mode) and inverse kinematics.
You’ll see that in FK the thick model and the thin model always follow each other. In IK the thin model is correct and the thick model is way off. It’s pretty easy make the fat model suddenly flip over or turn unexpectedly – try U and J to make the wrist wave like paint fence:

The software tries to use the bend in the wrist to figure out the twist in the wrist, which doesn’t work the moment the wrist goes totally straight or flips over.

If your code-fu is greater than mine, please show me how it’s done. I’d love to talk to any robotics people out there who might be able to shed some light on this. I feel pretty silly reinventing the wheel. Please help, internet hive mind!