BuildRobotzRobotsOuro
Ouro.
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.