Velocity Kinematics, Jacobians, Singularities & Statics
How joint speeds map to tool speeds — and forces back to torques. Learn the manipulator Jacobian (geometric and analytical), deriving it for a 2R arm and from DH frames, end-effector velocities (v = Jq̇), inverse velocity control (resolved-rate), singularities (boundary, interior, wrist) and their consequences, manipulability and condition number, static force mapping τ = JᵀF, stiffness and force ellipsoids, and payload/torque checks — with NumPy code computing determinants near singularity, tip velocities and joint torques for a tip load.
The Jacobian is the robot's 'gearbox' between joint space and Cartesian space: it converts joint velocities into tool velocities and — transposed — tool forces into joint torques. It underpins Cartesian control, IK, force control and singularity analysis.
Near singularities the Jacobian loses rank: some tool directions become impossible and joint speeds would have to become infinite, which is why controllers slow down or refuse moves near them.
An analogy
With your arm fully straightened, you can't move your hand further outward no matter how hard you try — your arm is in a singular configuration. The Jacobian's determinant going to zero is the mathematical version of that locked-straight arm.
What the Jacobian does
Each column of J is the tool velocity produced by moving one joint at unit speed with others fixed. Multiply by the joint-rate vector to get the tool velocity. It depends on the configuration q, so it changes continuously as the robot moves.
Computing Jacobians
Methods:
- Differentiate FK (analytical Jacobian) — works for any parametrisation
- Geometric Jacobian from frames: revolute i → [zᵢ₋₁ × (p_e − pᵢ₋₁); zᵢ₋₁], prismatic → [zᵢ₋₁; 0]
- Numerical finite differences (for checking)
- Libraries: KDL, Pinocchio, Drake, MoveIt compute Jacobians from URDF
- Analytical vs geometric Jacobians differ in the angular part (Euler rates vs ω)
Singularities
Where J loses rank: boundary singularities (arm fully stretched or folded), interior singularities (e.g. wrist singularity when axes 4 and 6 align in a 6-axis arm, shoulder singularity when the wrist centre lies on axis 1). Effects: lost directions of motion, huge joint speeds for small Cartesian moves, lost ability to resist certain forces (but infinite resistance in others). Mitigation: plan paths away from singularities, use damped least squares, joint interpolation near them, or redundant robots.
Statics, stiffness and performance
By virtual work, τ = JᵀF maps tool wrenches to joint torques — used for payload checks, gravity compensation, force control and estimating contact forces from motor currents. Manipulability and force ellipsoids show direction-dependent speed and force capability; the condition number measures isotropy (dexterity). Cartesian stiffness K_x relates to joint stiffness K_q via K_x ≈ J⁻ᵀK_qJ⁻¹ — important for machining with robots.
Formulas
- Velocity mapping:
ẋ = J(q)·q̇ - 2R Jacobian:
J = [[−L₁s₁ − L₂s₁₂, −L₂s₁₂], [L₁c₁ + L₂c₁₂, L₂c₁₂]] - Determinant (2R):
det J = L₁L₂ sin q₂ - Resolved-rate control:
q̇ = J⁻¹ẋ_d (or damped pseudo-inverse) - Statics:
τ = Jᵀ(q)·F - Manipulability:
w = √det(JJᵀ)
Worked example: Determinant
Given: L₁ 0.4, L₂ 0.3, q₂ = 30°
Find: det J.
- 0.12 × sin 30°
Answer: 0.06 m²
Worked example: Joint rates for a Cartesian speed
Given: det J small (0.0105) at q₂ = 5°
Find: Effect on q̇.
- J⁻¹ ∝ 1/det J
Answer: ≈ 11× larger joint speeds than at q₂ = 90° for the same tip speed
Worked example: Torque from load
Given: Arm straight along x (q₁ = q₂ = 0), 20 N downward at tip
Find: τ₁, τ₂.
- τ₁ = −20 × 0.7
- τ₂ = −20 × 0.3
Answer: −14 N·m, −6 N·m
Jacobian, singularity and force mapping
import numpy as np
# Velocity kinematics, singularity and static force mapping tau = J^T F for a 2R arm
L1, L2 = 0.40, 0.30
def jac(q1, q2):
return np.array([[-L1*np.sin(q1) - L2*np.sin(q1+q2), -L2*np.sin(q1+q2)],
[ L1*np.cos(q1) + L2*np.cos(q1+q2), L2*np.cos(q1+q2)]])
for q2_deg in (90, 30, 5, 0):
J = jac(np.radians(20), np.radians(q2_deg))
print(f"q2 = {q2_deg:2d} deg: det J = {np.linalg.det(J):.4f}, manipulability {abs(np.linalg.det(J)):.4f}")
J = jac(np.radians(20), np.radians(90))
qdot = np.radians([30, -20]) # joint rates, rad/s
print("tip velocity (m/s):", np.round(J @ qdot, 4).tolist())
F = np.array([0.0, -50.0]) # 50 N downward at the tip
print("joint torques for 50 N load (N*m):", np.round(J.T @ F, 2).tolist())
# q2 = 90 deg: det J = 0.1200, manipulability 0.1200
# q2 = 30 deg: det J = 0.0600, manipulability 0.0600
# q2 = 5 deg: det J = 0.0105, manipulability 0.0105
# q2 = 0 deg: det J = 0.0000, manipulability 0.0000
# tip velocity (m/s): [-0.1208, 0.1789]
# joint torques for 50 N load (N*m): [-13.66, 5.13]det J = L₁L₂ sin q₂: largest with the elbow at 90°, zero when the arm is straight (q₂ = 0) — a boundary singularity where the tip can't move radially. The same Jacobian converts a 50 N downward tip load into the static joint torques the motors must hold (13.7 N·m at the shoulder, 5.1 N·m at the elbow, signs showing direction).
Common mistakes
- Wrong: Inverting J near singularities. — Right: Use damped pseudo-inverse or avoid the region.
- Wrong: Ignoring the Jacobian's frame. — Right: Express J in base or tool frame consistently.
- Wrong: Forgetting gravity of links in torque checks. — Right: Add link-weight torques to Jᵀ·F_payload.
Applications
- Cartesian jogging and teleoperation: Resolved-rate control.
- Force control: Polishing, assembly, collision detection.
- Robot selection: Payload and torque checks.
- Path planning: Avoiding wrist singularities in welding paths.
Key takeaways
- ẋ = Jq̇; columns = per-joint tool velocity.
- det J = 0 → singularity.
- τ = JᵀF for statics and payload checks.
- Manipulability guides posture and path choice.
Going further
- Geometric Jacobian from DH: Column-by-column construction.
- Force/manipulability ellipsoids: Directional performance.
- Operational-space control: Khatib's task-space dynamics.