Tendon-Operated Mechanism for a Compliant Actuated Tomcat — an open, cat-sized quadruped whose joints are pulled by cables from motors in the body, not driven by a motor at each joint.
In its skin: a charcoal-grey plush knit on a soft foam shell, and a cat's head made of foam round a skull that has no jaw, its face held in shape by a firmer foam (ADR-0119–0122). The skin's 244 g is in the simulated plant (ADR-0124). Under it, the robot as designed:
Each joint is an antagonistic cable pair wound on one spool, so one motor drives one joint both ways (red / blue / green = hip / knee / ankle; thick = the cable pulling).
- Motors in the body. Each girdle holds its leg motors in two rows that straddle the hip, spools facing across it (ADR-0114).
- Knee and ankle cables run along the hip axis, through a hollow hip: the trunk carries a stub, the femur turns on it in two bearings, and the cables never cross the femur's path.
- Bowden conduits carry each cable from the body to the leg; friction is charged where the cable slides (ADR-0112). The ankle's conduits run on across the knee to a ferrule on the shin, so no pulley couples the knee and ankle (ADR-0126); each is one length, rounding the outside of the knee like a cable over a kneecap (ADR-0128).
- Each spool is as wide as its joint's cable travel (hip 12 mm, knee and ankle 10, spine 8), and the conduit's first ferrule floats in a slot along the drum so the cable leaves every groove square (ADR-0123). A pair's two cables pass every pulley on opposite sides, so their total length never changes (ADR-0118).
- A series spring (G3) sits between each motor and its spool: a titanium planar flexure, 125 kN/m on the legs and 350 kN/m on the spine (ADR-0107, ADR-0117).
- An articulated, cable-driven spine (3 segments, pitch and yaw) does the balancing sway and the mid-air righting.
| One leg, as parts | The trunk: 19 motors in four rigid bodies |
|---|---|
![]() |
![]() |
A policy trained on the GPU (MuJoCo-Warp, 2048 robots at once) with every mass, friction, spring, latency and sensor error randomised, filmed on the CPU simulator. It sees only what the robot's board measures; the lamps are the four feet's touch sensors. It trots at 0.25 and 0.5 m/s, diagonals together, swing feet ~2 cm up, falling in 1 of 20 randomised runs at 0.5 m/s; the feet still slip a little (ADR-0131–ADR-0133). Measured as a load case, this walk uses half the copper the analytic trot budgets (26 min trotting, randomised, spine included), peaks at the ankle at 1.84 N·m, and, with the motor's torque–speed line now in the plant, drives its rotors under ~380 rpm: a learned trot walks on the stock motor's speed, where the planned trot needed a rewound one (ADR-0134, ADR-0135). With a short memory of its own actions and the motor itself randomised, one policy walks on every motor corner from the stock part at the vendor's Kt to the rewind (ADR-0136–ADR-0138), but by working harder; with the conduits' friction now in the plant and a copper cost, it fits the spec motor's peak and runs ~17 min at the vendor's Kt (ADR-0139, ADR-0140).
| Mass | 4.82 kg with its skin (19 motors: 12 leg, 6 spine, 1 tail) |
| Trunk / hips apart | 384 mm / 276 mm |
| Joint moment arms (hip / knee / ankle) | 36 / 34 / 22 mm |
| Motor demand (peak / continuous) | 1.82 / 0.64 N·m per motor |
| Trot | 50 cm/s |
| Runtime, trotting | 14–20 min (~590 m) on a 300 g pack |
| Righting from upside down | ~1.0 s (simulated) |
Every number is computed from the live model, not typed in: the CAD, the
MuJoCo plant and the budgets all read kinematics/src/tomcat_kin/params.py.
Modelling and design — no hardware built. What is still uncertain, and what closes it, is in OPEN_RISKS.md. The largest open items: the motor (a GIM3505-9 is a proxy for size and mass; the spec it must meet is in ADR-0100/0110, and the dressed robot asks 93 % of its peak), the runtime (14.4 min at the vendor's Kt, 0.4 min over the 14 min floor, which the conduits' bench friction decides), the mass (4.82 kg, 19.3 % over the 4.05 kg target), bench values for conduit friction and the G3 rates, a mock-up of the cable bundle that twists inside the hollow hip, and the learned trot's remaining foot slip. A residual standing policy learns on the dressed robot, on sensors alone, with every plant and sensor error randomised: 25–26 of 30 seeds stand, against 9 for the baseline it learns on (ADR-0129). It trains on the GPU (MuJoCo-Warp, 2048 robots at once, ~15× the CPU) and the GPU-trained policy stands on the CPU simulator too (ADR-0130). A walking policy now tracks 0.25–0.5 m/s with every error randomised, on both simulators, in a trot that lifts its feet (ADR-0131–ADR-0133).
| Path | Contents |
|---|---|
kinematics/ |
tomcat_kin: kinematics, tendon maps, mass, gait, balance, MuJoCo plants, RL env |
mechanical/cad/ |
build123d CAD: trunk, legs, hollow hip, drive, G3 flexure, head, tail, skin |
thermal/ |
Rust crate: motor and girdle thermal duty |
tests/ |
pytest suite (569 tests) |
docs/ |
requirements, architecture, the ADR log, the progress log |
electronics/, firmware/ |
not started |
pip install numpy pytest mujoco gymnasium build123d vtk matplotlib pillow
pytest tests --ignore=tests/test_mjcf_tendon.py # conftest.py puts kinematics/src on the path
cd thermal && cargo test
python mechanical/cad/tomcat_assembly.py --render # the whole-robot picture
python mechanical/cad/leg_drive_3d.py --hq # the drive animation (1600x900, 30 fps)
python mechanical/cad/cat_suit.py # the skin: checks, STL and picture (~1 GB)
python mechanical/cad/skin_mass.py # deal the skin's mass to the plant's bodies
⚠️ tests/test_mjcf_tendon.pyneeds ~19 GB as one process — run it in slices. The whole-robot render needs ~12 GB as one process.
- Design decisions (ADR log) — every choice, and why
- Progress log — the milestone-by-milestone record
- Requirements · Architecture · Principles · Open risks
- Literature review · References · Glossary
Apache License 2.0. The feline skeletal geometry derives from Reighard & Jennings, Anatomy of the Cat (1901), public domain; third-party material is listed in NOTICE.





