BuildRobotz project · Learning path
Learning path
Thirteen one-hour sessions from the simulator to a filmed robot. One thing to do, one thing to learn and one check in each.
If you want to learn robotics from this project rather than only build it, work through it in thirteen sessions of about an hour. Each session has one thing to do, one idea to learn and one check that tells you you are done for the day. It works for a self-learner, a club or a class.
| # | You do | You learn | Done for the day when | Most likely stuck on |
|---|---|---|---|---|
| 1 | Run ouro_model.py, open ouro.xml in the MuJoCo viewer, drag the links with the mouse |
Bodies, joints, actuators; what an MJCF file is | You can point to joint 5 in the file and in the viewer | Viewer install |
| 2 | Edit gaits.wave (amplitude, frequency, wavelength), run test_gaits.py |
A gait is a function of time. Open-loop control. | The wave moves more than 19 cm in 6 s | Sign of the travelling wave |
| 3 | Run the scripted bite on 6 random builds, watch it fail on some. Read _set_params |
Why a script that works on the nominal robot fails on a real one. Backlash, offset, latency. | You can say which randomised parameter broke seed 1 | Believing the nominal run |
| 4 | Write _frame(): the observation, from sensor data only |
Observability. What an IMU does and does not tell you. | The frame has 22 numbers and none comes from qpos |
Wanting to peek at joint angles |
| 5 | Write the roll reward, train for 500k steps |
Reward design. PPO in one page. | dist is rising |
A policy that bursts the wheel for speed |
| 6 | Fix the reward, train to completion, run evaluate.py roll 100 |
Evaluating over a distribution, not one run | Latched at the end on over 90 % of builds | Reading one lucky episode as success |
| 7 | Print the coupon, measure a servo, fit it | Tolerances. Why you test the risky part first. | The servo drops in, the horn seats, the joint swings freely | Reprint |
| 8 | Assemble the eight joints and the latch, weigh the pull-off | Compliance as a design choice; magnets as a tolerance | Pull-off between 130 and 200 g | Horn one tooth off |
| 9 | Solder and wire power and sensors, flash both ESP32s | Power rails, brownout, I2C addresses, ESP-NOW | Telemetry prints on the computer, both rails at 5.0 V | Shared-rail resets |
| 10 | Calibrate, play wave, cobra, bite on the real robot |
The same Python function drives sim and robot | The real wave moves; the real bite works sometimes | Joint direction |
| 11 | Run sysid.py, compare its numbers with the sim ranges |
System identification. What "the gap" is, in numbers. | Your delay and slew sit inside the randomised ranges, or you widen them and retrain | USB latency timer |
| 12 | Run the trained roll at gain 0.4 and raise it; log a run and plot real IMU traces against sim |
Sim to real. Reading a log. | The wheel completes one full turn | Friction, magnets too weak |
| 13 | Chain bite → roll → startle, film it | Switching policies on a sensor bit | A 20 s video of the full act | Latch bit bouncing |
Done for the project: the robot, starting flat, bites its tail, rolls at least 50 cm and opens on command, three times out of five, on video.