Learning track

Beginner

From “what is a robot?” to driving a simulated arm.

10 lessons · about 6.7 hours of reading and exercises

All lessons are free to read until 31 Jan 2027. No account, no sign-up.

What is a robot? Sense, plan, act

The loop that every robot runs, how to count degrees of freedom, the difference between workspace and configuration space, and the main kinds of robot you will meet at work

25 min · concepts

Frames, rotations and transforms with numpy

Rotation matrices, the right-hand rule, composing rotations, 4x4 homogeneous transforms, moving points between frames and inverting a transform, all in numpy, plus the REP 103 conventions ROS uses

40 min · python, numpy, scipy

Forward kinematics of a two-link arm

Compute where a planar two-link arm's tip is from its joint angles, by trigonometry and by chaining homogeneous transforms, check that the two agree, and sweep the joints to map the reachable workspace

35 min · python, numpy

Inverse kinematics: analytic and numeric

Find the joint angles that put a two-link arm's tip on a target, with the law of cosines and with a damped least-squares solver, handle unreachable targets, and see what singularities do to the numbers

45 min · python, numpy, scipy

PID control of a robot joint

Simulate a DC-motor joint with a load in numpy, then close the loop with P, PI and PID control, see integral windup under voltage saturation, fix it with clamping, and take the derivative on the measurement

45 min · python, numpy

Sensors, noise and a first Kalman filter

Encoders, IMUs and range sensors, the three kinds of error they share, why averaging is not filtering, and a 1-D constant-velocity Kalman filter in numpy tracking a robot from noisy positions

40 min · numpy

Differential-drive kinematics and odometry

Convert wheel speeds to body velocity and back, integrate odometry with Euler and exact-arc steps, and watch small wheel-radius and track-width errors turn into metres of drift

40 min · numpy

Path planning on a grid with A*

Occupancy grids, 4- and 8-connected moves, admissible heuristics, and an A* planner in pure Python with heapq that you compare against Dijkstra by counting expanded cells

40 min · python

Simulate an arm in MuJoCo

Build a two-link arm in MJCF, step it headless with the mujoco Python bindings, read joint and site state, check it against forward kinematics, and close a PD loop with and without gravity compensation

45 min · python, numpy, mujoco

Hello, ROS 2: a publisher, a subscriber and tf2

Nodes, topics, messages and QoS in ROS 2 Jazzy, a talker and listener in one Python process, and a tf2 frame tree with static and dynamic transforms looked up from a Buffer

45 min · ros2-python