Recently I've been playing around with Inverse Kinematics and have been pretty impressed with the results. Naturally I want to take it further, but have no clue where to start. In particular, I would like to introduce joint limits (ie for a prismatic joint how far it can move, hinge joint what angles it has to be between, etc etc).

Currently I understand how to produce the Jacobian matrix for the various joint types. I am particularly looking for literature (preferably free, and preferably easy to understand) on various ways to implement joint limits. Also I would like to find out different ideas on how inverse kinematics can be used.


This is probably not the best answer I can give now, but consider Cyclic Coordinate Descent (CCD) which works for non-invertible Jacobian matrices. A short video here.

The best source covering CCD is Chris Wellman's own MSc thesis. For a minimal/short review, you can read this source that mentions most methods out there.

A more mathsy paper (for the researcher in you :D) is this one http://math.ucsd.edu/~sbuss/ResearchWeb/ikmethods/iksurvey.pdf.

For the hardcore researcher: http://matwbn.icm.edu.pl/ksiazki/amc/amc19/amc1941.pdf

This seems like a hybrid method, although they're just slides with mostly familiar notions: http://cmp.felk.cvut.cz/~hlavac/TeachPresEn/55IntelligentRobotics/KjchoInverseKinematics.pdf One more worth reading: http://www.cns.atr.jp/erato/DB/PDF/tevatia-icra2000.pdf

Since you said you'd rather have free sources, I'm not gonna mention the few books that one can buy from Amazon that tackle this problem. Personally, I am satisfied with CCD. For ultra precision, I prefer the Inverse Jacobian (where I know the system yields an invertible matrix thanks to the 6 DOF of a robotic rig).

How can IK can be used? Mostly when you want to animate a character by supplying only a position and orientation of an end effector of a certain limb. (youtube for examples). If you want to start a career in robotics, IK is a must if you're dealing with articulated robots. In the world of gaming, it's a must when you employ motion detection of human gestures via a camera (e.g. http://www.youtube.com/watch?v=HSradQVj26E - my simplistic example of a wiimote interface and a ccd virtual robotic arm).


Original Article: Overview of Inverse Kinematics

I highly suggest the above link for a high level overview of Inverse Kinematics. It goes over IK jargon, IK usage/applications, and high level descriptions of the forward kinematics and inverse kinematics.

What are the uses of IK?

IK can be used for a humanoid arm to reach for an object/target, as we’ve seen. IK can also be used for foot stepping, such that we tell the foot where to step and the IK figures out how to configure the leg joints. IK is not usually used as an animation itself (reaching for an object), but more as an animation tool. So, if you are implementing a walk cycle, you could position some of the key frames using the IK tool.

Another key point about IK is that your goal/target is not limited to position alone — your goal can be defined as a rotation. For example, if your feet need to rotate based on uneven terrain, your IK rotation goal can be defined based on the floor’s normal. This way your feet are inclined along the floor, such as when you are walking up an incline. Note that you can also use IK to have your head (or even eyes) look in a certain direction. If you want your head to follow an object, you can use IK to have the head follow the object around.

How do I implement joint limits?

I usually implement joint limits with a simple if-statement. For example, this would work for revolute joints.

if (limb.rotation >  45.0f) limb.rotation =  45.0f;
if (limb.rotation < -45.0f) limb.rotation = -45.0f;

It's a lot less mathematical than the Jacobian, and extremely easy to implement once you have the Jacobian working.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.