Common to most inverse kinematic (IK) algorithms is the trade-off between computational complexity and natural motion.

Computationally expensive algorithms are usually required to produce natural looking motion. Reducing the computational complexity tends to result in less natural looking motion.

This is a 2D interactive visualisation of my computationally inexpensive IK that also produces organic and natural looking results. The underlying algorithm processes the IK in 3D.


What am I seeing here?

  • A 2D representation of a 3D inverse kinematics (IK) algorithm (unconstrained)
  • In this demo the base joint of the kinematic model has two rotational degrees of freedom (2-DOF)
  • Due to the 2D canvas representation only those DOF in the 2D (x,y) plane are visible
  • The algorithm is based on FABRIK (Forward And Backward Reaching Inverse Kinematics)
    • [Aristidou, A. & Lasenby, J. 2009, 'Inverse Kinematics: a review of existing techniques and introduction of a new fast iterative solver', University of Cambridge, Technical Report, CUED/F-INFENG/TR-632]
  • It is computationally inexpensive while also producing organic and natural looking results
    • In a single kinematic chain we typically reach the target in just one iteration
    • Here we've limited the algorithm to just five iterations before it stops trying to reach the target
  • The algorithm uses joint rotations for its input and output data, so it can run as-is on robot servo hardware
    • Robots rely on an internal model of joint rotations and link lengths
    • Rotational degrees are converted internally to and from virtual 3D coordinates based on joint rotation angles and link lengths
    • Coordinate data is also returned from the algorithm purely for visualisation purposes
  • This demo was ported to JavaScript from my original 3D Python implementation
    • (A WebGL 3D interface is currently in the works to better demonstrate the algorithm)

Why do I sometimes see link lengths shortening?

  • The base joint has two rotational degrees of freedom (2-DOF), able to move within the z-axis as well as rotation about x and y (similar to a ball and socket joint)
  • What you are seeing is a 2D view of movement into and out of the z-axis (at the base joint) as the end-effector tries to reach its target
  • This is a 3D algorithm, intended for use on physical machines in real-world 3D space

Is the algorithm fixed to any n-DOF model such as those on display here?

  • The underlying algorithm is not hard-coded to a specific kinematic model
  • Configurations with multiple joints and various link lengths can be specified and passed in to the algorithm, which handles these dynamically
  • We can easily expand the algorithm to drive multiple branching chains from a single base frame (e.g. an arm and hand with multiple fingers)