# My Adventure with Inverse Kinematics

## Presentation on theme: "My Adventure with Inverse Kinematics"— Presentation transcript:

My Adventure with Inverse Kinematics
Chris Hecker definition six, inc.

What is this lecture about?
the path I took while solving a problem with inverse kinematics how I use math to model and [sometimes] solve problems decisions I made, both good and bad learn from my successes and failures work in progress!

What isn’t this lecture about?
not an IK tutorial or introduction not going to give you the One True Way to do IK has nothing to do with graphics not about my rock climbing game Experimental Gameplay Workshop Friday, 4pm - 7pm

Takeaway You will get insight into how IK on a whole human body is different from IK on a single arm. You will see how IK is a building block, but not a complete solution to character animation.

Prerequisites must be very comfortable with math
doesn’t mean you know tons of math does mean you follow quickly and aren’t afraid of it probably best if you’ve implemented a simple IK system foot placement, arm grabbing door, etc.

Talk Structure (linear with occasional branches)
... attempted solution problem statement and discussion related theory

Problem: How to move a guy with the mouse?
move like a [rock climbing] human interactive direct body/limb control did not want to use physics

Theory: How to move a guy with the mouse?
inverse kinematics vs. forward kinematics FK: p=f(q) IK: q = f-1(p) p is Euclidean, angles q is configuration space p g p = (x, y) q = (q1, q2) q2 q1

Theory: How to move a guy with the mouse? (cont.)
p q2 q1 degrees of freedom (DOF) incredibly important concept “ways in which system can change” configuration space find DOF of system to understand it control & constrain DOF to control it examples physical system, polynomial, etc. fundamental task of IK is to control degrees of freedom to attain goal p = (x, y) q = (q1, q2)

Solution: How to move a guy with the mouse?
analytical IK invert p = f(q) to get q from p relatively easy for the 2D arm inverse trig, some vector algebra gets complicated as n increases

Problem: Analytical IK can’t handle human.
human has lots of DOF even 2D arm with shoulder has more DOF than needed to reach goal solving p = f(q) requires certain characteristics q3 g q2 q1 p = (x, y) q = (q1 , q2 , q3)

Theory: Analytical IK can’t handle human.
p p = f(q) is a set of nonlinear equations generally no closed forms must iterate numerically must be square, nDOF = ngoal over-, under-constrained system “redundant manipulator” ex. human reaching for point and/or orientation vast literature on solving f(q) = p q3 q2 q1 p = (x, y) q = (q1 , q2 , q3)

Solution: Analytical IK can’t handle human.
p use Cyclic Coordinate Descent (CCD) to solve arms iterative, recursive position-space algorithm fast, easy, robust start from last position not path independent, but faster I draw every outside iteration looks like animation, but it’s not q3 g q2 q1 p = (x, y) q = (q1 , q2 , q3)

Problem: CCD only handles serial chains.
multiple goals are necessary for human stack up vectors in p=f(q) coupled at branches g2 q3 g1 q5 q4 q2 q1 p = (x1, y1, x2, y2) q = (q1 , q2 , q3 , q4 , q5)

Theory: CCD only handles serial chains.
p2 p1 coupling between goals either solvable alone, neither solvable together how to distribute desired-angle error? g2 q3 g1 q5 q4 q2 q1 p = (x1, y1, x2, y2) q = (q1 , q2 , q3 , q4 , q5)

Solution: CCD only handles serial chains.
p2 p1 simply average desired angles at branch parents to attain multiple goals and distribute error q1 in example, imagine p1, p2 pulled in opposite directions q3 q5 q4 q2 q1 p = (x1, y1, x2, y2) q = (q1 , q2 , q3 , q4 , q5)

Problem: Drift on multiple goals.
average can’t satisfy all goals or even prioritize them I specifically want to drag climber hand with mouse and have other end effectors stay on holds q

Theory: Drift on multiple goals.
want a rigid constraint at end effectors closed loops are hard, CCD doesn’t handle them, nor do common IK algorithms must solve simultaneously not hierarchical anymore closed loops don’t have local behavior q

Solution: Drift on multiple goals.
attempt to “Gram-Schmidt” off any movement that would result in error b c a

Problem: Gram-Schmidt removes the wrong direction sometimes.
could have tried real Jacobian force mapping Gram-Schmidt

Problem: Human is not rooted tree.
Which end effector (hand, foot) is the root? There is no persistent fixed root in a rock climber or walking person CCD must start at a fixed root

Theory: Human is not rooted tree.
switching root is basically a datastructure problem relative angles must change joint limits (see below) behavior will change slightly as well, since CCD isn’t symmetric with respect to the root

Solution: Human is not rooted tree.
just type it in invert tree to new root Caml is pretty good at this sort of thing see last year’s GDC talk dragging torso is done by inverting to a torso node, then changing the root position the hands and feet are all end-effectors hack!

Problem: Joint limits elbow can’t bend backwards
should lend believability and intuition

Theory: Joint limits inequality constraints: q ³ qmin
abandon all (most) hope of analytical solution these inequalities are axis aligned planes in configuration space qmax q qmin

Solution: Joint limits
CCD makes parent-child limits easy do min/max clamp in CCD inner iteration easy, and rest of system compensates issue: CCD doesn’t “know” about the joint limits often compensates, but doesn’t know to avoid them

Problem: Child-child limits
parent-child not enough with moving root pelvis example: left foot root right foot root chest root

Problem: Child-child limits
parent-child not enough with moving root pelvis example: left foot root right foot root chest root

Problem: Child-child limits
parent-child not enough with moving root pelvis example: left foot root right foot root chest root ?

Theory: Child-child limits
both angles are dependent on each other, coupled parent is fixed in CCD constraints are now non-axis aligned planes in C-space simultaneous solution necessary at branches with child-child limits

Solution: Child-child limits
Good solution should: satisfy constraints always have zero error in goals if possible have least squares error if not possible Nonlinear Least Squares with Linear Inequalities: minimize (q1 - d1)2 + (q2 - d2)2 w.r.t. qmin12 £ q1 - q2 £ qmax12 lots of literature on NLSLI I convert to LCP and use Lemke’s algorithm works great!

Accomplishments We extended CCD to handle: multiple end effector goals
dynamically changing root node arbitrary joint limits

Problems drift on multi-goals is still a problem
CCD doesn’t know about joint limits sometimes non-physical movement CCD isn’t doing physics, not conserving energy, or anything else for that matter rooted hierarchies are inconvenient how to control redundant DOF?

Body Knowledge System system to manage movement and keep it natural
“situation” & “reaction” ex. joint limits handled in body knowledge huge rules system allocates redundant DOF this is the key to natural movement!

Body Knowledge System (cont.)
IK just a rough initial guess for body knowledge system; should be: physically plausible no added energy, etc. easy to layer conflicting goals able to cope with over-constrained goals don’t know enough about this yet, but I think it will be more important than IK for good dynamic animation

What I Didn’t Talk About
development process stuff developing on lower dimensional subproblems using visualizations to help debug math Mathematica and Matlab for development and debugging running multiple techniques on top of each other physics-based techniques I tried

What I Didn’t Try I should have done a weighted average based on error for multi-goals, duh. even weighted average wouldn’t be rigid although could make weight very big... similar to a stiff system Wrong: “CCD must have fixed root” now that I understand better, this isn’t actualy true the root’s position is just more DOF CCD probably wouldn’t deal with this very well?

What I Didn’t Try (cont.)
pseudo-inverse methods give explicit control over redundant DOF data-based methods (model-based) functions as lookup tables totally ad-hoc methods

References two great theses: google & citeseer GDC talks
Paolo Baerlocher Chris Welman google & citeseer GDC talks David Wu Ken Perlin Jeff Lander’s articles & code Experimental Gameplay Workshop