Jacobian
The Jacobian is the matrix that translates how fast a robot’s joints are moving into how fast the end-effector (the gripper or tool tip) is moving through space — and, transposed, maps a force applied at the tool back into the torques each joint must produce. It matters because robots live in two spaces at once: joint space (the angles of each motor) and task space (where the tool actually is). The Jacobian is the gearbox between them.
Prerequisites
Joint space → task space
JOINT SPACE TASK SPACE (motor angles) (tool position)
q̇1 ─┐ ┌─ ẋ (move in x) q̇2 ─┼──► [ J(q) ] ──►──┼─ ẏ (move in y) q̇3 ─┘ Jacobian └─ ω (rotate) joint velocities end-effector velocityVelocity mapping. Let q̇ be the vector of joint velocities (how fast each motor turns) and ẋ be the end-effector velocity (how fast the tool moves and rotates). The Jacobian J, evaluated at the current joint configuration q, relates them:
ẋ = J(q) · q̇
Force/torque duality. Statics gives a mirror image. If you push on the tool with a task-space force F, the joint torques τ needed to resist or produce it are:
τ = Jᵀ · F
This transpose relationship is why the Jacobian appears in force and impedance control: controlling a contact force at the tool reduces to commanding the right joint torques through Jᵀ.
Inverse use. To make the tool follow a desired velocity, invert it: q̇ = J⁻¹ · ẋ. This is the heart of resolved-rate motion control and numerical inverse kinematics — but only works when J is invertible.
Worked example: 2-link planar arm
For a two-link arm with link lengths L1 = L2 = 1, joint angles θ1 and θ2, the 2×2 Jacobian is:
J = [ -L1·sinθ1 - L2·sin(θ1+θ2), -L2·sin(θ1+θ2) ] [ L1·cosθ1 + L2·cos(θ1+θ2), L2·cos(θ1+θ2) ]import numpy as np
L1 = L2 = 1.0
def jacobian(t1, t2): return np.array([ [-L1*np.sin(t1) - L2*np.sin(t1+t2), -L2*np.sin(t1+t2)], [ L1*np.cos(t1) + L2*np.cos(t1+t2), L2*np.cos(t1+t2)], ])
# Well-conditioned pose: theta1 = 30 deg, theta2 = 60 degJ = jacobian(np.radians(30), np.radians(60))print(np.round(J, 4)) # [[-1.5 -1. ] # [ 0.866 0. ]]print(round(np.linalg.det(J), 4)) # 0.866 -> invertible
# Drive joint 1 at 1 rad/s, joint 2 still:xdot = J @ np.array([1.0, 0.0])print(np.round(xdot, 4)) # [-1.5 0.866] tool velocity in (x, y)
# SINGULAR pose: theta2 = 0 -> arm straightJs = jacobian(np.radians(30), 0.0)print(round(np.linalg.det(Js), 6)) # 0.0 -> J^-1 undefinedAt (30°, 60°) the determinant is 0.866, so the arm can move the tool in any direction and we can safely invert J. Straighten the elbow (θ2 = 0) and the determinant collapses to exactly 0 — the arm is at a singularity and can no longer move radially outward.
Related Terms
Sources
- Bruno Siciliano et al., Robotics: Modelling, Planning and Control, Springer, 2009 — Ch. 3 (differential kinematics, the manipulator Jacobian, and singularities).
- Kevin M. Lynch and Frank C. Park, Modern Robotics: Mechanics, Planning, and Control, Cambridge University Press, 2017 — Ch. 5 (velocity kinematics and the space/body Jacobian).
- Samuel R. Buss, “Introduction to Inverse Kinematics with Jacobian Transpose, Pseudoinverse and Damped Least Squares Methods,” UCSD technical note, 2009-04-17 — derivation of damped least squares for singularity-robust IK.