When a SmolVLA or GR00T policy fails to pick up a cup, most people blame the neural network. The real culprit is usually 15 lines deeper: a misconfigured PD gain, an IK solver that hit a singularity, or a workspace bound that fired silently. Every learned policy in the humanoid stack — from RT-2 to GR00T N1.5 — runs on top of classical kinematics and classical controllers. You cannot skip this chapter and meaningfully debug the capstone. The substrate is small: forward kinematics (multiply DH transforms, read off end-effector pose), inverse kinematics (invert that map, numerically, accepting non-uniqueness), the Jacobian (velocity-level linkage between joint space and task space), dynamics (mass matrix, Coriolis, gravity, Lagrangian or Newton-Euler), PD and impedance control, and Model Predictive Control for whole-body motions. Lynch and Park's Modern Robotics (Cambridge University Press, 2017) covers all of this with free lectures and full text online — it is the cleanest single reference.
Forward and inverse kinematics
Forward kinematics (FK) is multiplication: given a vector of joint angles q, multiply the Denavit-Hartenberg (DH) homogeneous transform matrices for each joint in sequence and read off the end-effector pose as a 4x4 SE(3) matrix. For a 6-DOF arm this is six matrix multiplications — fast, deterministic, always unique. The DH convention parameterizes each joint by four numbers (link length, link twist, link offset, joint angle); the product chain is the FK map.
Inverse kinematics (IK) inverts that map: given a target end-effector pose, find the joint angles. For a 6-DOF arm the solution is generically non-unique (multiple elbow-up/elbow-down configurations reach the same pose) and may not exist (targets outside the workspace). The two standard numerical solvers are Jacobian-transpose (gradient-descent flavor, cheap, can oscillate near singularities) and Levenberg-Marquardt (damped least-squares, more robust near singularities, used in most production IK libraries). Analytic solutions exist for specific wrist configurations (e.g., spherical wrists) and are always preferred when available.
The Jacobian and velocity control
The Jacobian J(q) maps joint velocities to end-effector velocities: dx/dt = J(q) * dq/dt. It is the linchpin of velocity control — if you want the end-effector to move at 0.1 m/s in the x direction, invert J(q) (or use the pseudoinverse) to get the required joint velocities. Singularities occur when J loses rank — the arm is in a configuration where one or more task-space directions become uncontrollable. Detection (via the smallest singular value of J) and damping (via damped pseudoinverse) are standard engineering practice.
PD control is the inner loop: tau = Kp * (q_desired - q_actual) + Kd * (dq_desired - dq_actual). Impedance control extends this to model the arm as a mass-spring-damper in task space: it allows compliant contact with surfaces, which is mandatory for any manipulation task involving contact forces. A robot that opens a drawer with a pure position controller will break either the drawer or its own joints — impedance control is what makes physical interaction safe.
Dynamics and MPC
Robot dynamics add inertia, Coriolis, and gravity to the control picture: tau = M(q) * ddq + C(q, dq) * dq + g(q), where M is the mass matrix, C is the Coriolis/centrifugal matrix, and g is the gravity vector. The mass matrix couples joints — moving one joint imparts forces on all others. Ignoring dynamics is fine at low speeds; at the joint velocities humanoids require for fluid motion, it is a source of oscillation and instability.
Model Predictive Control (MPC) wraps a dynamics model in an optimization loop: at each timestep, solve a short-horizon trajectory optimization problem, execute the first action, re-plan. Whole-body MPC is computationally expensive — humanoid teams typically run it at 50–200 Hz with a simplified linear dynamics model (centroidal MPC) for balance, and a separate joint-level impedance controller for manipulation. ROS 2 is the middleware substrate that connects all of these components.
Why the capstone cannot skip this
The JHU humanoid capstone runs SmolVLA or GR00T N1.5 at the policy layer. Those policies output target joint positions or end-effector poses at 5–30 Hz. Below that, a trajectory interpolator, an IK solver, and a 1 kHz PD/impedance controller execute the motion. When the policy fails — wrong object grasp, dropped item, collision — the diagnostic chain starts here: was the target pose reachable? Did the IK solver converge? Did the impedance controller saturate? Without this chapter, every failure looks like a neural network bug.
Berkeley CS 294-277 Robots That Learn (Jitendra Malik, Spring 2026) builds on this substrate from the first lecture. Lynch and Park's Modern Robotics is the prerequisite text. Complete the build exercise — drive a 6-DOF arm in MuJoCo from joint-space to a target pose using Jacobian-transpose IK, add impedance control — before touching a VLA.
Every researcher who skipped classical robotics eventually re-learned it via a hardware debugging session at 2am. The Jacobian singularity that stalls an IK solver is not a neural network failure — but you will not know that without this.