Beginner
From “what is a robot?” to driving a simulated arm.
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
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
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
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
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
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
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
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
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
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