Skip to content

Decisions

Newest first. Each entry gives the decision, the reason and the alternatives considered. Re-open a decision only with a new reason, and record the change here.

2026-11-03: the yoke arm, not the tube upper arm; an RS10P output-bearing bench test

Section titled “2026-11-03: the yoke arm, not the tube upper arm; an RS10P output-bearing bench test”

Decision. The arm stays as the yoke version (2026-11-02): yokes with idlers at the shoulder roll and the elbow, and the shoulder yaw RS10P held by its output alone.

Alternative. A tube upper arm was prototyped (git branch arm-v2-prototype, design note docs/design/arm_v2.md on that branch): a 70 × 1.5 mm 6061 tube round the shoulder yaw motor, driven by a bulkhead on its output and turning on an acetal bushing round a collar at its rear end, so all three arm RS10Ps are held at both ends. It passed every check (lowest SF 3.5; 1.5 with the idlers carrying nothing; palm deflection under a 10 N side load 0.68 mm against 3.54 mm; 33 designed screws and dowels per arm; snap-fit PETG sleeves), but its structure is 0.10 kg heavier per arm (0.26 kg in all with its sleeves: 41.23 kg with shells against 40.97 kg) and it adds a tube, a collar and a bushing.

Why. The open question is whether the shoulder yaw motor’s output bearing takes the arm’s bending. RobStride publishes no bearing type or load rating for any of its actuators (none in the manuals or specification sheets revised 2026-07 to 2026-10; the STEP models are outer shells). The bending there is small in use and large only in a fall: static, from the arm’s own 2.0 kg and a load in the hand, 4 N·m with the arm out level, 11 N·m with 2 kg in the hand, 22 N·m with 5 kg at full forward reach; about 38 N·m in the hand-catch case (0.5 × body weight at the palm). The hand catch is near the most the arm can apply: a larger push at the hand turns the shoulder pitch and roll motors past their peak torques (60 and 42 N·m), so they give way first, provided their torque limits are set; a joint against its end stop or a sharp impact can still exceed it.

Bench test. When the RS10Ps arrive: clamp one by its body, hang 10 kg on a bar 0.38 m from the output face (about 37 N·m) in a few orientations, and check the output for play and smooth rotation before and after. If it develops play, the tube upper arm is the fallback.

2026-11-02: arm yokes at the shoulder roll and elbow; shells in white PETG

Section titled “2026-11-02: arm yokes at the shoulder roll and elbow; shells in white PETG”

Why. Each RS10P hung from a ring on its front face, so its own output bearing took the arm’s bending. Under the hand-catch case (0.5 × body weight at the palm) that is about 38 N·m at the shoulder roll and the shoulder yaw and 9 N·m at the elbow, against a 42 N·m peak torque; RobStride’s manual gives no bearing moment rating. A sideways fall onto the elbow (0.5 × body weight, a new case in cad/fea.py) gives 6-18 N·m; it governs no part.

Yokes. At the shoulder roll and the elbow the driven link now also rides on the motor’s rear end: a hollow 7075 stub on the motor’s rear face (its 4 × M3) carries a 6805-2RS ball bearing (25 × 37 × 7 mm, 22 g), and a plate on the driven link holds it, so a hand load reaches the stator through two bearings a motor length apart. The shoulder roll’s plate stands on the roll link’s top plate behind the motor; the elbow’s plate joins the forearm frame by a box-section bridge under the motor, behind the forearm’s centre line so it stays clear of the upper arm cover at 135°. cad.covers --check finds no contacts.

Shoulder yaw: no yoke yet. Its rear end is already bolted to the roll link’s top plate (the stator side), so the upper arm cannot reach round to it without passing through the roll link. The options (a crossed-roller ring at its output, as at the hip yaw, or turning the motor over) are open.

Thinned. With the idler taking the arm’s back end the roll link’s front plate goes from 10 to 7 mm and the yaw ring from 4 to 3 mm. Because a ball-bearing idler with play may carry less than the check’s rigid hold, cad/fea.py --no-idler reruns a link with the idlers carrying nothing; the thinned parts must pass the 2.2 target with the idler and stay at 1.5 or better without it (front plate: 10.8 and 1.6; yaw ring 10.7 and 4.8). The forearm frame stays 5 mm (the wrist yaw’s torque governs it: 4 mm read SF 1.9); the upper arm and shoulder pitch parts carry the same load as before (the motor body still passes it to them). Net: +0.13 kg per arm (yokes, stubs and bearings 0.21 kg, thinning −0.08), 2.016 kg for both arms’ structure.

Shells in white PETG. The body shells and head panels are printed in white PETG (density 1.27 against 1.10; carbon-fibre nylon only comes dark): shells 0.98 kg, head 0.499 kg. Robot 40.00 kg bare and 40.97 kg with shells, inside the 42 kg limit. Carbon-fibre nylon stays for hidden functional prints. The fastener and snap-fit pass follows.

2026-11-02: follow-ups to the arm and head changes

Section titled “2026-11-02: follow-ups to the arm and head changes”
  • Shoulder pitch and waist yaw stay RS03. Holding 1 kg at full forward reach takes 11.3 N·m at the shoulder pitch, over the RS10P’s 9.5 N·m held rating; the waist carries little torque (99th percentile 6.3 N·m by inverse dynamics over the 25 reference clips) and would suit an RS10P, but its crossed-roller bearing and hub are built round the RS03 and the 0.44 kg it would save is not needed with 1.46 kg in hand under the limit.
  • Simulation: the RS10P joints use RobStride’s output-side inertia, 0.00625 kg·m², as their armature (sim/isaaclab/marvin_bot/robot_cfg.py, sim/mujoco/check_standing.py); the other armatures stay placeholders until the bench test.
  • Pelvis margin: at a 4 mm mesh (a 3 mm mesh outgrows 200 GB) the pelvis back plate and the hip roll mounts check at SF 2.4, every other pelvis part at 2.6 or better; the 6 mm mesh had read 2.1-2.3.
  • Policies on the new model: flat v9 (from flat v8) passes the MuJoCo cross-check; tracker v6 (from v5) keeps all 25 clips upright in Newton and MuJoCo and tracks closer than v5 (hands 5.6 cm against 6.7). The stair policy stays rough v9: it passes all 25 stair runs (5-20 cm, five noise seeds) on the current model, while the retrained rough v11 fails 3 of 5 on 20 cm stairs (sim/isaaclab/README.md).
  • Review fixes: the RS10P’s three front-face dowels are now cut in its rings (actuators.yaml gives their phase), and the stop and zero pins moved to 19° from a screw (the roll’s to 79°) to clear them; the shoulder yaw’s unused cable hole and two grommets went (its cable leaves the side), the rear-face bolts are counted in the actuator bolt list, and the upper-arm cover follows the yaw motor’s 5 mm rise (40.55 kg with shells). Arm parts recheck at SF 2.6 or better (the elbow strap; it read 2.7 before the dowel holes). The head-drop case now loads the head’s 0.467 kg at 10 g (46 N; it had 98 N).
  • RS10P margins seen in simulation: the two-hand wave touches the shoulder yaw’s 42 N·m peak, and the clap runs the shoulder roll at 78% of its 14 N·m turning rating (RMS); a 1 kg sideways hold (10.3 N·m) is over its 9.5 N·m held rating. Kept: short holds are covered by 14 N·m for 120 s, and the bench thermal test (phase 2) decides; an RS03 back at shoulder roll (+0.44 kg per arm) is the fallback.

2026-11-02: a rounded-box head with a visor band

Section titled “2026-11-02: a rounded-box head with a visor band”

The helmet head (the hull of two ellipsoids, a full-face glossy visor and a light camera frame across it) is replaced by the head drawn for the human-form study’s approved exterior: a wide, deep rounded box, 156 mm wide, 203 mm deep and 121 mm tall, with a dark visor band across the face at eye height. cad/head.py draws it from that head’s plan, side and front outlines (measured from its panels and kept as tables in the code), extruded across one another and intersected, every edge rounded 12 mm, a 1.8 mm wall, open underneath; it is printed as five light panels split where the study’s were (crown, chin, two cheeks, a rear cap) and the visor band. The depth camera stays at eye height (92 mm over the neck pitch axis) and now sits in the middle of the band, its front 4 mm proud of the face on the centre line (24 mm further forward than before), on a longer arm from the head frame; its frame is dark, so it reads as part of the band. Level with the face, the band round its opening cut the colour camera’s view by up to a fifth; 4 mm out, a ray cast from both IR cameras and the colour camera over the full 90 × 65° view clears 100%. The neck sleeve runs 5 mm up inside the head’s open underside, which sits 29 mm over the pitch axis. The head’s top is about 30 mm lower than the helmet’s: the robot stands 1.41 m (requirement R1 updated). Head 0.467 kg (was 0.405); robot 40.54 kg with shells. cad.covers --check finds no contacts over the neck’s range. The head link now has its interfaces (the pitch servo’s horn and idler, the camera’s tripod screw, the top bar the shell hangs from) and a 10 g head-drop case in cad/fea.py: every head frame part checks at SF 99 or more. That check found the camera arm had never joined the head frame (it stopped 4 mm under the bridge); the bridge now reaches down to it.

Alternatives considered (renders outside this repo): the study’s head on the study’s neck, with the neck pitch axis 72 mm higher, inside the head, over a longer dark neck (closest to the study, but it moves the neck joint); the same head 8% smaller; and keeping the helmet.

2026-11-02: RS10P at shoulder roll, shoulder yaw and elbow

Section titled “2026-11-02: RS10P at shoulder roll, shoulder yaw and elbow”

The six arm motors from the shoulder roll down are now RobStride RS10P (42 N·m peak, 14 N·m rated turning and 9.5 N·m held still, 25:1, 0.46 kg, Ø57 × 60.6 mm; manual dated 2026-09-07 and specification sheet 2026-10-09), in place of the RS03 at shoulder roll and the RS06 at shoulder yaw and elbow. The human-form study (2026-10-31) named it worth carrying over; the motors come to 20.30 kg (was 21.82) and the robot to 39.64 kg bare and 40.47 kg with its shells (was 41.17 and 41.99), 1.5 kg under the limit. The arm parts end at 1.756 kg against 1.760 before. Parts cost rises about $140 (seven at $233.99 from a reseller listing, pre-order; RobStride lists it at ¥859 in China).

Loads. Holding torques from the URDF’s masses (the arm alone, then 0.5 and 1 kg at the palm), against 9.5 N·m held still: the elbow and shoulder yaw need at most 4.5 N·m in any pose; the shoulder roll with the arm straight out sideways 5.7, 8.0 and 10.3 N·m (with the RS10P arm; 6.3, 8.6 and 10.9 with the old one). So the v1 hands’ 0.5 kg can be held out sideways indefinitely, and the 1 kg of requirement R20 for about two minutes (the manual allows 14 N·m held for 120 s); forward reach is the shoulder pitch’s, still an RS03. Peak torque rises at shoulder yaw and elbow (42 against 36 N·m) and falls at shoulder roll (42 against 60).

Speed. The 25:1 gear limits it to 13.1 rad/s at no load (14 N·m at 100 rpm, 3 at 120), against 50 rad/s for the RS06 and 20 for the RS03. The 32 retargeted reference clips peak at 12.8 rad/s at the elbow (a jog’s arm swing) and 11.3 at the shoulder roll (one spike in an idle clip); the rest stay under 8. Walking and manipulation fit; a jog’s arm swing would run at the motor’s speed limit with little torque left. The URDF’s velocity and effort limits follow, so the arm policies are to be retrained.

Mounting. The RS10P is a plain cylinder with no driver cap (its cable leaves the side near the rear), tapped on its front face (6 × M4 on Ø51, round the output’s 6 × M4 on Ø27) and on its rear (4 × M3 on Ø38). It hangs from front rings like the RS06 (cad/mounts.py); cad/arm.py now takes each arm motor from robot.yaml. Being 10 mm longer than the RS06, the yaw and elbow motors sit 5 mm along their axes from their joints (skeleton.yaml motor_mounts), so their rings and outputs stay where the RS06’s were and the forearm still folds to 135° clear of the shoulder (the joints, and so the kinematics, do not move). The yaw motor’s rear face also bolts up to the shoulder roll link’s top plate, which lets the cage strips behind it go; with a front screw circle half the RS06’s, its ring needed its legs’ pads joined across their full width (a neck between them read SF 0.2). The upper arm’s ring on the yaw hub is 6 mm (the hub is Ø34, not Ø46), the elbow strap 5 mm, the yaw ring 4 mm, and the roll ring reaches the shoulder flange through a 38 mm tab inside the top plate’s swing. Every arm part checks at SF 2.7 or better in cad/fea.py (the lowest the elbow strap in the hand catch; before, 2.5), and cad.covers --check finds no contacts.

Alternatives considered: RS10P at shoulder yaw and elbow only (−0.64 kg, the shoulder roll keeping its 60 N·m), and the shoulder pitch and waist yaw on RS10P too (both carry the most torque of their chains and were not checked here).

2026-10-31: a human-form frame studied; findings recorded, not yet applied to the description

Section titled “2026-10-31: a human-form frame studied; findings recorded, not yet applied to the description”

A study asked whether the frame and actuator layout could be redrawn to fit a human body of Marvin Bot’s height (a body generated with Anny), keeping the height, the actuator classes and the weight about the same. It drew on RP1’s published layout (ideas only): ankle motors with their axes fore and aft, each turning a crank whose rod runs down the back of the shin to the heel; hip roll behind the hip; hip yaw low in the thigh; a waist roll under the waist yaw. The structure was flat, through-windowed aluminium plates cut to the body’s outline, all 2.5D and millable on a desktop mill, joined by screws, with printed covers over each link that leave the actuators visible at the joints, and a plain helmet with a dark visor band across the camera (no facial features). The study code and renders are kept outside this repository; nothing in description/ or cad/ changed.

Actuators. RS04 at hip pitch, hip roll and knee; RS03 at hip yaw, waist roll, waist yaw and shoulder pitch; RS10P (42/14 N·m, 25:1, 0.46 kg, 125 rpm no-load, manual dated 2026-09-07) as the ankle pair, at shoulder roll, shoulder yaw and elbow; RS00 at the wrist; 19.1 kg of actuators against 21.5 kg today. With the RS10P put in a copy of the description, check_standing.py passes in all three poses and check_step_up.py finds an 18 cm step possible, but on one foot the hip yaw holds 16 N·m, 115% of the RS10P’s rating, so hip yaw stays RS03. At the ankle (pitch ratio 1.3, roll ratio 0.86) the pair is rated 36 N·m in pitch and 24 N·m in roll, above the 22 and 14 N·m the earlier ankle sizing asked for; its speed is the open question (about 10 rad/s at the ankle at no load), which needs a walking policy to check. At shoulder yaw and elbow the RS10P beats today’s RS06 on peak torque (42 against 36 N·m) and mass (0.46 against 0.62 kg).

Strength. cad/fea.py’s model and load cases on 13 links, the plates of each treated as bonded: every one checks at SF 2.2 or better at 44.5 kg (lowest about 2.3: the hip roll output, the torso in the hand catch, the shin pushed sideways at the ankle). Getting there needed what a plate frame lacks by default: a boxed pelvis (a keel with webs across it, a shelf to the waist roll carrier, clamp rings round the hip pitch housings), a front plate closing the shin, a web between the thigh plates, ribs in the third direction at both hip links (the landing’s fore-aft moment otherwise bends every plate there out of its plane), ribs under the foot, and 7075 for the most stressed parts (4.1 of the frame’s 14.0 kg). Every seam was then sized by hand as a screwed joint (M3 to M5 into blocks, tapped plate edges and tabs), each at 2 or more on slip and thread pull-out; the ankle motor mounts are lowest (2.1 on slip, so they also get dowels).

Motion. Swept joint by joint: full range at hip pitch, hip yaw, ankle pitch and roll, the waist, the neck, shoulder pitch and wrist yaw. The knee stops at 105° (130° wanted): past it the shin’s lower end meets the hip yaw motor’s block at the top of the thigh, a cost of mounting hip yaw low in the thigh. The elbow stops at 125° (135° wanted), hip roll at -10° with the other leg still, and with the arm hanging the hand meets the hip past 40° of shoulder yaw.

Why it is not applied. It is heavier, not lighter: about 42.7 kg bare and 44.5 kg with 1.4 mm covers, against today’s 41.2 and 42.0 kg and the 42 kg limit, once the plates are strong enough. And the RS04s at the hip and knee do not fit inside a human-proportioned body of this height: the hip roll carrier stands up to 70 mm behind the body’s hip and the knee and shin plates about 40 mm proud of it, so the covers would read as bulky there regardless. Worth carrying into today’s design on their own: the arm layout (the upper arm as the outer fork round the elbow motor, a forearm that narrows to the wrist inside it, the elbow axis tipped by the carrying angle so the forearm can be flat plates), RS10P at shoulder yaw and elbow, and the covers’ style. Alternatives considered: a body-shaped skin of printed panels held by magnets (rejected for a simpler covered look), RS10P at hip yaw (over its rating), RS05 at the wrist (5.5 N·m against the RS00’s 14), and RS06 or RS03 pairs at the ankle (they do not fit between the thigh plates’ 56 mm gap that the shin’s contents must clear as the knee bends).

2026-10-31: harness clip points in the CAD; a faceted torso shell; the shells to be redesigned in build123d

Section titled “2026-10-31: harness clip points in the CAD; a faceted torso shell; the shells to be redesigned in build123d”

The harness is now held at real points in the parts, not “a cable tie through a pocket”. Each service loop is tied either side of its joint (CLIPS in tools/build_harness.py, checked against description/cad_model.yaml) by one of three clips: a bought push-in cable-tie mount in a 6.5 mm hole on a solid 14 mm pad, in a dozen plates up to 6 mm thick (clip_spot in cad/b3d.py puts each hole near its joint, outside the motor and its rings, and the pockets keep off the pad); a printed TPU edge clip that slides over the edge of a thicker plate (cad/clips.py; the pelvis back plate, the hip pitch box’s outer wall, the shoulder roll front plate, the neck bridge); or a P-clip under an existing screw at the shoulder flange (design/assembly_wiring.md). The run lengths are measured from each RobStride’s driver cap, where its cable leaves.

The shells were brought up to the new frame. The torso shell, a stack of rounded slices that read as ribbed, is now faceted: squashed octagons at nine heights, every other one turned 22.5°, each sized to hold the frame within 14% of the height either side, and hulled, so its flat panels meet in diamond facets (faceted in cad/covers.py). Its side walls are chamfered at the shoulders, and its front corners bevel deeper towards the shoulders, where the shoulder roll bracket swings past with the arm forward and rolled in. Arm shells over a RobStride housing get a grille of whole slots across its front, as the motors’ ratings assume their housings can shed heat; the thigh and shin keep clean faces. Each shell has room cut for the harness loops at its joints: a band round the joint’s axis over the arc between the loop’s two clip points, plus 20° of swing, taking the rear arc where the two are near equal (at the knee the clips are above and below the axis, and a full ring had notched the front of the thigh shell). cad.covers --check finds no contacts. Mass 41.17 kg bare, 41.99 kg with the 0.82 kg of shells, 10 g under the limit. The pelvis back plate reads SF 2.1-2.3 between runs at the 6 mm mesh, so its margin needs firming up before it is made.

Styling options tried for the torso and legs (renders outside this repo): smooth rounded and chamfered lofts with a V, multi-faceted keels and sculpted chests, variations of the alternating-facet torso, a design language carried over the whole body (too bulky), and faceted or calmer thigh and shin panels at today’s size. Only the faceted torso was kept. The shells remain generated: an offset hull of each link’s parts, trimmed by flat cuts, so the frame sets their shape and it is hard to make them look designed. They will be redrawn in build123d as designed panels, lofted through cross-sections, given an even wall, filleted, split along chosen seams and fitted with clips, with today’s hulls as the keep-out they must clear, starting with a thigh pilot. Alternatives considered: sculpting the surfaces in Blender (best for a sculpted look, but not parametric, so every frame change means redrawing), implicit (signed-distance) modelling (soft forms, hard to keep crisp edges), and graphical surfacing in FreeCAD (outside the scripted, CI-checked flow).

2026-10-30: RS03 and RS06 mounted by their output-end ears; bearings, zero pins and an all-aluminium load path

Section titled “2026-10-30: RS03 and RS06 mounted by their output-end ears; bearings, zero pins and an all-aluminium load path”

RobStride’s drawings and STEP models show the RS03 and RS06 are tapped only in ears at their output end (2.5 and 1.5 mm behind the output face; the RS03’s rear has 4 tapped holes, the RS06’s none found), and the RS00 on its front face; only the RS04 is tapped on both faces (description/actuators.yaml: face, setback). The CAD had bolted every motor through its rear face, into holes that are not there on all 15 RS03/RS06 positions. Each RS03 and RS06 now hangs from a ring on its ears (cad/mounts.py: front_ring), and the part it drives stands on a hub on the output, past the ring (hub); where the structure is on the motor’s rear side, flat strips round the motor join the ring to it (cage). The ankle motors bolt straight to the shin plate their output passes through. The hip yaw motor moved onto the thigh (output up, skeleton.yaml motor_mounts).

Thin crossed-roller bearings (RA6008, 60 x 76 x 8 mm, about C0 8.7 kN as distributors list it: to confirm with the maker’s sheet) sit in the rings at the hip yaw (static safety factor about 2.1 in the 3 g landing, with 1.2 kN axial and 112 N·m tilt), the waist, and in a carrier on each hip roll RS04’s front face, so those joints’ tilting loads reach the motor housing or the frame without passing through the motors’ unrated output bearings. With the carrier, the hip roll yoke’s rear bearing, plate, strip and stub went. Nine joints have a stop pin in the ring running in an arc groove in the driven part (the groove’s ends are hard stops at the range plus 3°) and a zero hole for a dowel or a printed jig (zero_stop); the ankles are zeroed with a jig.

Then lightened against cad/fea.py and made robust: the pelvis box behind the hips went (its rear-bearing job ended), the printed chest and thigh shells went (the clip-on covers do their job), the upper arm and forearm now carry load in 7075 straps and the wrist cradle, hand mount, neck bracket, head frame, battery shelf and computer plate are flat 7075 plates (no bends); printed parts are now only covers, the head shell and visor, the camera frame, the battery latch and guides, and the TPU soles. Further rounds took the remaining margin out: the hip roll yoke’s rear bearing set, the pelvis box and its rear gussets went (the back plate is 10 mm instead), plates at SF 4 and up were thinned or pocketed, the covers are 1.0 mm (were 1.2), the head shell 1.8 mm and the TPU soles 3 mm. Every metal part checks at SF 2.3 or better (the pelvis at a 6 mm mesh, as finer meshes outgrow the machine’s memory, so its margin is the least certain). Mass 41.16 kg bare, 41.95 kg with covers, under the 42 kg limit by 50 g; fasteners are still the budget’s estimate. Thinning that failed and was reverted: the hip pitch box floor to 5 mm with a 4 mm flange (the flange left a gap to the box wall), windows in the shoulder flange, upper arm ring and forearm frame, and through-pockets reaching the rims of the thin rings. Alternatives considered: rear mounts on the RS03’s 4 rear tapped holes (a quarter of the screws, in ear faces 4.6 mm off the body); keeping the hip roll rear bearing (about 300 g); a bigger hip pitch box floor thinning (it opened a gap and failed in a sideways fall).

2026-10-30: finite-element check of every load-carrying part; the structure is under-designed

Section titled “2026-10-30: finite-element check of every load-carrying part; the structure is under-designed”

cad/strength.py cuts sections along a load path and uses beam theory without torsion, so it covered 13 load paths and left out every motor ring, flange, crank and torso frame. cad/fea.py now checks them all: each link’s metal parts (and the printed shells that carry load between them) meshed as one bonded solid, held at the face of the motor or bearing that carries the link, loaded through a rigid coupling at the next link’s interfaces, with the strength check’s load cases (a 3 × body-weight landing on one leg with 0.5 and 0.3 × body weight across it, a 0.5 × body-weight hand catch, a sideways fall onto the knee, each joint’s peak torque). Each motor ring, flange, bearing bore and stub records the joint it serves and its contact patch (Part.extra["ifaces"]). Checked against beam theory in bending and thin-strip torsion (tests/test_fea.py), it reads 5-9% low at a 3 mm mesh, so its target is SF 2.2 on yield; stresses are smoothed along the surface over about a fillet’s size, since the parts have no fillets yet. It takes about an hour, so it runs by hand after CAD changes, not in CI.

Result (worst case per part, SF on yield): the ankle cranks (9.7), ankle cross (34), foot (2.2 and up), torso base, flange and battery shelf (2.7-7), forearm flange (4.1), hip pitch flange (4.1) and neck bracket (15) pass. The rest fail, for two reasons the beam check could not see. Torsion of thin plates: the fore-aft part of the landing twists the hip roll bracket’s front and stator plates (SF 0.2-0.4) and the shin plates (0.8-0.9); the hand catch twists the shoulder pitch bracket’s plates (0.6). Motor rings on three posts: every rear ring carries its joint’s whole load through three Ø8 mm posts (hip pitch ring 0.5, hip yaw ring 1.3, shoulder roll ring 0.7), and the pelvis carries one leg’s landing into the torso through the waist motor’s ring (pelvis back plate and gussets 0.1, waist and hip roll rings 0.2-0.4). Also near: thigh plate 1.3 (side fall), hip pitch box 1.2-1.3, torso shoulder plate and neck bridge 1.1. It also found CAD faults: the shin spacers are 2 mm short of the plates (sized with the 6 mm plate thickness, not the shin’s 4 mm), the upper arm’s printed shell does not touch its two rings, and the computer plate is attached to nothing; and the printed forearm shell reads SF 0.3 against the beam check’s 7.2, which needs a closer look. So the parts need strengthening, not thinning, before they are made: closed sections or ribs where plates twist, and rings bolted straight to plates (or on a continuous wall) instead of posts, which also rules out the bought-standoff posts considered in the parts review. Alternatives considered: refine the beam check with torsion (still blind to rings and junctions); CalculiX through gmsh (gmsh could not rebuild several links’ surfaces; fTetWild meshes any closed surface).

2026-10-29: the BOM gives the full cost to replicate; corrections after the 1.44 m redesign

Section titled “2026-10-29: the BOM gives the full cost to replicate; corrections after the 1.44 m redesign”

The published cost was “about $12k” with the Jetson AGX Orin developer kit and the hand kits counted as owned at $0. Owned items now carry their current price, so the BOM total (about $17.5k at October 2026 prices) is what a replicator pays. The workbook ships with every status empty, so each builder marks what they own in their own copy. The biggest changes: the developer kit at $3,499 (NVIDIA raised it from $1,999 in July 2026); the STS3250 servos at about $97 each (was $45); online machining for the 12 parts too large for the desktop mill (about $1,200, not yet quoted); and battery-building, printing and hand tools, an NVMe drive and a USB hub, which were missing. The 7 CAN buses are covered by the Orin’s 2 on-board ports, one dual-channel adapter per leg and one single-channel adapter for the battery. These fit the electronics bay’s 3 adapter outlines; the CAN timing test confirms the choice (roadmap item 13). The Seeed actuator prices were confirmed on Seeed’s own pages. Each item has one line with its full quantity and a spares column (one RS03 line: 11 + 1 spare), not one line per purchase phase; docs/plan.md says what each phase needs. The BOM is now one workbook, bom/bom.xlsx, replacing bom.csv, sourcing.csv and the CAD’s two build-list CSVs. Builders can copy it and mark each line owned or ordered (empty means to buy), and its Summary totals follow by formula. tools/bom/book.py tidies it after edits, edits lines from the command line and checks it in CI. cad.export updates its two CAD sheets in place and keeps the builder’s status columns. The training GPU stays outside the total as an optional cost. Alternatives considered: keep owned items at $0 (understates the cost for anyone else); CSVs as the source with a generated spreadsheet (two copies to keep in step, and the copy a builder edits is not the source). The cost of a workbook is that git diffs of it are not readable; tools/bom/summary.py prints the totals for review.

2026-10-29: shoulder roll below 0° with the arm forward; the tracker scores the head and the joints

Section titled “2026-10-29: shoulder roll below 0° with the arm forward; the tracker scores the head and the joints”

The clap, the reach and the squat (arms forward) held the shoulder roll on its 0° stop in 24-87% of their frames: the hands could not come to the middle. Shoulder roll now goes to −10° with the arm 45-75° forward and to −20° at 90-135°, and stays at 0° with the arm hanging, where the upper arm meets the torso (coupled_limits in description/robot.yaml; cad.covers --check and check_packaging.py check every point of it). −30° was asked for and checked: there the shoulder yaw motor meets the chest shell at every forward angle and the roll link the torso frame at 60°, and past 135° the upper arm meets the head; it would need the shoulder rebuilt. Simulation and the retargeter take −20° as a plain limit and rely on the arms colliding with the body; the controller must enforce the coupled limit on the robot.

The motion tracker scored 14 bodies (BeyondMimic’s choice, to weight the hands), which left the head out: it shook (46-60°/s RMS standing still, against 1-3°/s in the reference) and hung 17° off. Its 0.3 m body-position kernel also hardly noticed a crouch (99% of the reward for a body 3 cm off): it stood and walked 5-8° deeper in the hips, knees and ankles than the references, and with an arm overhead chose a different arm posture for the same hand (shoulder yaw 95° off in the two-hand wave). The head is scored again and a joint-angle term over the legs, waist and neck is added (weight 0.5, sigma 0.3 rad; protomotions/envs/rewards/marvin_bot.py, written by setup_protomotions.py). Over all joints it made the arm clips worse: the retargeted shoulder angles are ill-defined (the arms-raise reference twists the shoulder yaw by 175° for no change in the hand), so the arms are left to their body positions. The result: head turning 93°/s to 41°/s RMS averaged over the 25 clips, feet 5.4 to 4.8 cm and hands about the same (6.6 to 6.8 cm). The references also gained the head’s motion (add_head_motion.py): the retargeter had held the neck at rest, so the look-around clip did not look around. Alternatives not yet tried: a style discriminator (AMP, as in NVIDIA’s deployed G1 tracker), BeyondMimic’s gain rule, a stronger smoothness term.

The foot plate and sole were rectangles. They now have a shoe’s outline (shoe() in cad/leg.py): full width at the heel with rounded corners (the push-rod posts sit 40 mm either side), the widest point at the ball, and a toe that narrows in a slight V to a rounded point set towards the inside, like the big toe; the toe cap follows it. The narrower toe needed stiffening for a toe-first landing: the side ribs stop short of it (150 mm) and a 20 mm rib runs down the middle of the toe to near the tip (SF 3.3 at the worst station). Feet 1.108 kg for both (−67 g). The simulation keeps the rectangular contact box.

2026-10-29: a longer torso and legs; the battery high for a V-shaped torso; mass limit 42 kg

Section titled “2026-10-29: a longer torso and legs; the battery high for a V-shaped torso; mass limit 42 kg”

At 1.29 m the hands hung almost to the knees (fingertips 0.38 m, a person’s at that height 0.49 m): the shoulders sat about 40 mm low against the chin, the upper arm hung 50 mm below the shoulder joint, and the bought hands are long for the size. The robot is now 1.438 m: the torso is 100 mm longer (shoulders, neck and head rise with it), the shoulder roll joint sits 25 mm below the shoulder pitch joint (was 50), and the legs are 50 mm longer (the thigh’s 25 mm above the hip yaw motor, so the thigh plate still fits the desktop mill; the shin 25 mm, with the ankle motors kept where they sit relative to the ankle). Fingertips now reach 0.556 m against a person’s 0.542 m, elbows 0.934 against 0.906, hips 0.48 of the height (a person’s about 0.50). Inside the torso the battery, the widest part (140 mm), now sits high on a 4 mm pocketed shelf under the shoulder motors, the keep-alive pack low at the back, and the lower side frames lean in to the computer’s width at the base, so the shell narrows to 160 mm at the waist (was 188): a slight V. The shin’s side-plate straps widen from 38 to 44 mm for the longer shin (SF 2.3); the chest shell is printed in two pieces and the torso cover seams move up to 200 mm, so every printed piece still fits a 250 mm printer. Mass 40.41 kg bare and 41.38 kg with shells (+0.64 kg); the mass limit is now 42 kg with the shells (tools/check_description.py), the real gate being the knee’s heating on stairs. Costs: the static 18 cm step check puts the knee at 118% of its continuous rating (was 109%) and the hip roll at 105% (was 103%); the walking, stair and motion-tracking policies were trained on the old model and must be retrained; the centre of mass is 78 mm higher. Alternatives considered (renders outside this repo): the shoulders raised 25-40 mm at the old height (the chin then touches the shell’s collar looking down and turned), the torso 50 mm longer only, the legs 90 mm longer (hips at 0.50 of the height, but the knee at 127% of rated: it would need the parked 1.5:1 knee stage, kept as a future option), and a taller shell taper for a stronger V.

2026-10-28: the depth camera level with the face, in a light printed frame

Section titled “2026-10-28: the depth camera level with the face, in a light printed frame”

The camera window found in the entry below let through about a third of the depth camera’s view. The camera now sits with its front level with the face’s front on the centre line, in a light printed frame like a pair of spectacles across the black visor, so nothing is ahead of its lenses: a ray cast from both infrared cameras and the colour camera clears 100% of the 90 x 65° depth view. Being straight, the 124 mm camera’s ends stand up to about 42 mm clear of the round face, which shows from the side. The frame is only the part outside the helmet (22 g), glued into its opening in the visor; the camera slides in from the front and screws to a printed arm from the head frame by its tripod thread. The camera moved 51 mm forward; the head is 17 g heavier (0.452 kg), the robot 40.75 kg with shells. The outline (a 124 x 29 mm stadium, 27 mm deep), lens positions and tripod thread come from Orbbec’s own mesh and URDF (OrbbecSDK_ROS2, Apache-2.0), fetched by tools/fetch_vendor_cad.py. Alternatives considered (renders outside this repo): a flat face plate the camera sits flush in (rejected to keep the round face); a curved infrared-transparent lens over most of the face (about 128 x 98 mm; seamless, but a formed lens is hard to source and adds distortion and reflections to stereo depth); the frame in black (subtler); the camera standing 4 or 12 mm proud (no gain in view). Open: the camera’s front glass is the most exposed part in a fall onto the face.

2026-10-28: a light head shell and neck behind a dark visor

Section titled “2026-10-28: a light head shell and neck behind a dark visor”

The head was all dark, a featureless ball. The helmet shell and the neck sleeve are now light like the body shells, and the dark visor is the face ahead of a plane that runs from the back of the crown down to the chin (28° back from vertical, 20 mm further back at eye height than before), so the light shell behind it reads as a jaw and neck. Only the split and the colours change: the same shell, the same mass and the same window. Alternatives considered (renders outside this repo): today’s 18° split with a light back, which reads as a flat mask, and steeper splits (35-55°), which leave the black as a cap over the forehead.

Found while checking it (since fixed, entry above): the camera window let through only about a third of the depth camera’s view. The window is a 20 mm tall band in the outer skin, 16-52 mm ahead of the camera’s front face as the helmet curves, so it crops the depth view (about 90 x 65°) to roughly 33% of its rays (a ray cast from both infrared cameras and the centre); the depth and stair work needs most of it.

2026-10-28: an honest mass budget; a stronger thigh plate, thinner shin and pelvis plates

Section titled “2026-10-28: an honest mass budget; a stronger thigh plate, thinner shin and pelvis plates”

A weight study (finite elements and topology optimisation of the main plates, outside this repo) found three things. The mass budget was optimistic: the computer weighs 0.877 kg (the developer kit, weighed, without its power supply), not the 1.5 kg estimate, but the CAD has no fasteners and the budget no limb harness. Those are now items of their own (0.4 kg, about 4% of the frame, and 0.5 kg for about 7 m of harness), so the model reads 39.91 kg bare and 40.74 kg with shells, under the 41 kg limit, where an honest count before these changes was about 41.6 kg. Second, the thigh plate, a single plate beside the leg’s line, is weak against a sideways fall onto the knee: at an estimated 1 x body weight across the knee, finite elements put the drilled 6 mm plate at SF 0.5. It is now 9 mm stock pocketed from the outside to a 2 mm floor (lighten(..., floor=)): SF 2.3 in that case by cad/strength.py, which gained the case, for +61 g a side (8 mm gave SF 1.8). Third, two plates had margin: the shin side plates go from 6 to 4 mm (SF 2.1, -0.26 kg for both legs) and the pelvis back plate from 8 to 6 mm (SF 2.1, -0.08 kg). Net: structure -0.22 kg, budget +0.28 kg. Open: the torso base, which a hand catch with the arm forward mostly twists (torsion is outside cad/strength.py; finite elements put it at SF 0.8), needs FEA and likely a pocketed, stiffer plate before it is made; the side-fall load is an estimate until falls are measured in simulation; a topology-optimised thigh outline could take back about 35 g of the 61. Not taken: thinner hip pitch box walls (torsion unchecked), single-sided joints (needs the RS04 output bearing’s moment rating) and a 13S2P battery (runtime at the 1 h limit).

2026-10-28: wider shoulder yaw, hip roll, hip yaw and waist yaw ranges

Section titled “2026-10-28: wider shoulder yaw, hip roll, hip yaw and waist yaw ranges”

Motion tracking showed narrow ranges limiting skills: the retargeted two-hand wave and reach held the shoulder yaw on its 90° stop, and the trackers’ sidesteps drove the hip roll to its −20° stop. Four ranges widen with no part, mass or cost change: shoulder yaw ±150° (was ±90°), hip roll −30° inward (was −20°), hip yaw ±90° (was ±45°) and waist yaw ±150° (was ±90°). cad.covers --check finds no shell contacts and check_packaging.py no errors within a limb; the new contacts are between limbs (one leg against the other at hip roll −30° with both straight, a forearm against the pelvis at waist yaw beyond ±70° with the arms down), which the robot must avoid by control, as it already avoided the same contacts at the old limits. The harness service loops at the yaw joints grow with the range (electrical/harness.yaml); their flex life at ±150° is unchecked. Re-retargeted, the two-hand wave and reach now use 93-103° of shoulder yaw; the other clips did not need the extra room. The walking and stair policies were trained with the old limits and are unaffected until retrained. Not changed: shoulder roll below 0°, which the clap needs, puts the upper arm into the torso with the arm at the side and needs a limit that depends on shoulder pitch, in the checks and on the robot. Alternatives considered: waist roll and pitch joints (about +2.5 kg and +$630; to be tried in simulation first), and a 1.5:1 knee stage with a 150° knee (parked).

2026-10-28: Kimodo motions with root paths; trackers step instead of hopping

Section titled “2026-10-28: Kimodo motions with root paths; trackers step instead of hopping”

The trackers now learn from motions generated with Kimodo (NVIDIA’s text-to-motion model) rather than 100STYLE: they tracked as well once the prompts asked for a pace Marvin Bot can keep, and Kimodo can make the skills beyond walking (gestures, squats, a kick, a dance) that no openly licensed motion capture has. sim/motion/generate_kimodo.py gives each locomotion clip and in-place skill a dense root path, so the speed and turn rate are set rather than worded, and keeps the best of four samples by foot sliding and crossing; the clips go through ProtoMotions’ own Kimodo route (its SOMA converter and keypoint extraction) instead of a converter of ours. Three fixes made the trackers walk properly. The reference walks floated 3-5 cm: the sole fix lifted each clip until its lowest foot corner touched the floor, and that corner is a toe tipped down at push-off, so the stance foot hung in the air; it now puts the flatter foot on the floor. The trackers hopped even on grounded references, both feet down 70% of the time and both up 20% (the reference: 10% and 0-8%), since BeyondMimic’s rewards compare body positions only; a penalty on each foot whose contact differs from the reference’s fixes it at -2.0 (both feet up 1-2%), where -0.5 only halved it and a tighter body-position tolerance (sigma 0.15) did less. And the palms faced forward because the stance leaves the wrist yaw at 0; the motion pipeline’s pose turns them in (80°) and the retargeter holds them there. On eleven locomotion clips the tracker follows nine after 2,600 epochs (82-101% of the reference’s distance, bodies within 3-5 cm), including walking backwards; it falls on the sidesteps, where Kimodo tends to cross or close the feet. Alternatives considered: 100STYLE (kept as an option; locomotion only), and recording our own motion capture (later, for skills Kimodo does not know).

2026-10-27: 100STYLE for motion tracking; the tracker’s anchor-position reward

Section titled “2026-10-27: 100STYLE for motion tracking; the tracker’s anchor-position reward”

The motion trackers learn from 100STYLE (CC-BY-4.0) instead of ProtoMotions’ sample motions, which come from BONES-SEED, a dataset licensed only to non-profit academic institutions and companies under $1M annual revenue (not to individuals, and not compatible with an open project anyone may reuse). sim/motion/convert_100style.py turns its BVH files into the retargeter’s keypoints in ProtoMotions’ SOMA convention, so the rest of the pipeline is unchanged. The same eight motions from three openly licensed sources were retargeted and tracked the same way (1,400 epochs): 100STYLE kept the tracker up on 5 of 8 clips, Kimodo’s text-to-motion (SOMA-RP model) on 3 of 8 (5 of 8 once the prompts asked for a slower pace), and CMU’s database on 3 of the 5 that passed ProtoMotions’ motion filter (its feet also slid six times as much). Kimodo stays the way to make motions no dataset has, though its text encoder brings in Llama 3’s licence. Trackers 1-4 stood still because ProtoMotions’ BeyondMimic config leaves out the global anchor-position reward, so nothing paid for keeping up; setup_protomotions.py now writes the tracker experiment from upstream’s with that reward, a fell-behind termination, the reference torso’s offset in the observations, softer gains (action scale at least 0.4 rad) and more exploration. Alternatives considered: BONES-SEED under its licence (rules out most users), AMASS and LAFAN1 (non-commercial or no-derivatives licences), and mjlab’s BeyondMimic task (kept as a fallback).

2026-10-27: bought four-finger hands on a wrist pitch joint

Section titled “2026-10-27: bought four-finger hands on a wrist pitch joint”

Two open-source 8-DOF four-finger hand kits (bought from Seeed Studio, SKUs 100062181 and 100063642; eight Feetech SCS0009 servos each at 5 V, 0.40 kg as published, mechanical design CC-BY-4.0) replace the 1-DOF grippers. The gripper’s STS3250 becomes a wrist pitch joint (±60°) under the RS00 wrist yaw, so the hand both turns and tilts: the servo hangs from the RS00’s output in a printed cradle, its case running up from its shaft, and a printed U on its horn and an idler pin carries a plate for the hand’s wrist interface (cad/arm.py). The hands are the AmazingHand (Pollen Robotics): its CC-BY-4.0 design lets the real hand meshes ship in description/third_party/amazing_hand/ with attribution, under their own licence, and they are used for the visuals and the joint sweep at the published mass; the mount plate carries the hand’s six M3 holes on a 42 mm circle. Holding the hand level takes about 0.4 N·m (25% of the servo’s rated torque), and with 0.5 kg at the fingertips about 1.2 N·m (75% of rated, 24% of stall): enough for pick-and-place, not for holding a load out for minutes. Alternatives considered: an RS00 for pitch (overkill, +0.24 kg at the end of the arm), an STS3215 (2.9 N·m stall, too little margin), and keeping the gripper with compliant fingers (cheaper, but the hands were already bought).

Proportions: with the pitch servo’s case above its shaft, the wrist pitch axis sits 0.063 m under the wrist yaw (the gripper’s pivot was 0.090), so the forearm is 0.188 m to the wrist axis, a person’s at Marvin Bot’s height (0.146 of height). The shoulder-to-fingertip length is 0.62 m, about 9% longer than a person’s at this height, all of it from the hand, which is about 30% larger than a person’s scaled down; nothing smaller is on hand.

Mass: the hands and mounts add 0.73 kg (grippers 0.19 kg out, hands 0.80 kg and mounts 0.12 kg in): 39.86 kg bare, 40.69 kg with the body shells. The hard limit now applies to the robot as it would run, hands and shells included, and is set to 41 kg (tools/check_description.py). The hands’ servos need a 12 V to 5 V converter at each wrist and a serial bus of their own (SCS protocol; the other servos use STS), one USB adapter per hand. The joint sweep counts the palm with the arm. The walking and stair policies were trained without the hands and are to be retrained; the motion pipeline’s arm scale is now the reach to the wrist pitch axis (0.79 of the source’s).

2026-10-27: no side-to-side waddle; command and sensor delays

Section titled “2026-10-27: no side-to-side waddle; command and sensor delays”

Flat v6 and rough v8 tipped their whole body over each stance foot: pelvis and torso roll 20-22° peak to peak (a person walks with about 5-8°), which swung the head 16.5 cm side to side while the pelvis itself moved under 2 cm. The waist only turns, so the torso rolls with the pelvis; the only roll penalty was the general flat-orientation term (0.02 at 8°); the air-time reward (2.0) paid for time on one foot, so the gait had no double support (0-2% of the stride) and slow 0.6-0.75 s swings; and the feet landed 21-24 cm apart. mjlab’s G1 velocity task handles the same problem with an upright term, tight hip and ankle roll while walking and no single-support reward. The walking tasks now penalize pelvis roll (−10 on its squared sine) and a step width more than 2 cm from 16 cm, hold the hip and ankle roll near stance (−0.3, was −0.1 on hip roll and yaw), and pay air time at 0.5. The pelvis-height allowance is 2 cm (was 4). Commands also reach the motors 0-10 ms late and the IMU and joint readings reach the policy 0-20 ms late (random per episode), which Isaac Lab’s DC motor model has no option for: robot_cfg.py’s DelayedDCMotor adds it, and since Newton’s own actuator kernels only take a fixed delay on a plain PD motor, the motors run in Isaac Lab (about 2.5× slower per iteration). Flat v7 and rough v9 (resumed from v6 and v8) roll 4-6°, swing the head 3-8 cm, step 14-15 cm wide and pass every check; rough v9 is as reliable on 15-20 cm stairs over five seeds as v8 (2 falls in 15 runs each). check_policy.py prints head and pelvis sway, roll and step width. Alternative considered: moving training to mjlab, whose G1 task suggested the fix; not needed, since Isaac Lab 3.0 on Newton already runs the same physics.

2026-10-27: motion-tracking pipeline (in progress)

Section titled “2026-10-27: motion-tracking pipeline (in progress)”

For skills beyond walking, motion tracking (BeyondMimic) scales better than reward design: a new skill is a new clip. sim/motion/ adds Marvin Bot to NVIDIA’s ProtoMotions (generated model, retargeting URDF and robot config) and retargets human motion with its PyRoki retargeter, overriding the link map and body scale. Eight walking, jogging and turning clips from ProtoMotions’ samples retarget within every joint limit, with 7-14° of pelvis roll; ProtoMotions’ height fix assumes G1’s foot frame, so fix_sole_height.py puts the soles on the floor. The first tracker (5,800 epochs on Newton) counted all eight clips as tracked, but ProtoMotions’ test only checks torso height: it shuffled on the spot, covering 0-32% of the reference’s distance with its knees at about half the reference’s bend. Two model problems were behind it: the gripper boxes overlap the thighs even with the arms hanging, so the arms held the legs (the arms now collide with the ground only; the retargeted arms still pass through the body and need a collision-aware retarget before hardware), and the scaled human feet were 12-14 cm apart for 11 cm wide feet (knees and feet now move out 1.5 and 3 cm). check_tracking.py compares distance, joints and body positions with the reference. A second tracker is training. The command-driven walking and stair policies stay: a tracker needs a reference motion to follow. Motion data is not committed.

2026-10-26: straighter stance; level feet in swing

Section titled “2026-10-26: straighter stance; level feet in swing”

The default stance’s knee goes from 25° to 15° (hip pitch 12° to 6°, ankle pitch 13° to 9°, which keeps the foot flat and the CoM 106 mm inside the feet; pelvis 0.636 to 0.645 m), so the robot stands straighter and the pelvis-height term aims higher. The policies also swung their feet toe down by up to 30° (the heel high), because the foot-level term only covered feet in contact; a matching term now penalizes the tilt of feet in the air, and the MuJoCo check prints swing pitch and touchdown pitch. Flat v6 and rough v8 (resumed from v5 and v7) swing their feet at most 11-16° toe down and pass every check. The stair check now measures the climb from the walking height on the approach rather than the standing height, which counted the dip of walking against the climb (it failed rough v8 on 5 cm stairs it crossed). Not done: the rough policy still walks 3.8 cm under its stance height, inside the term’s 4 cm allowance; a tighter allowance is the next lever.

2026-10-26: posture terms in the walking rewards

Section titled “2026-10-26: posture terms in the walking rewards”

The stair policy (rough v6) climbed 15 cm stairs in a deep crouch: it stood with its knees at 95° and its pelvis 19 cm below the stance height, and climbed 8 cm low, which also ran its knees at 73-81% of their rated torque. Nothing in the rewards asked for height, and a crouch is stable. Two terms were added to both walking tasks: a linear penalty on the pelvis sitting more than 4 cm below its stance height above the lower foot (measured from the lower foot so it holds on stairs), and an L1 penalty on the leg joints’ distance from the stance pose while commanded to stand. The rough task also doubled the heat penalty and put 14-20 cm stairs on a tenth of the tiles on every curriculum row. Resumed from v6 for 3000 iterations, rough v7 stands in the stance pose, climbs 4 cm taller, and passes 5-20 cm stairs (v6 fell on 18 and 20 cm). The posture check is now printed by sim/mujoco/check_policy.py. Alternatives considered: a straighter default stance (fewer degrees at the knee), which changes the standing check and every policy, left as an option; a base-height target from the terrain map, rejected because the map averages the stairs ahead.

2026-10-26: electronics bay, battery cradle and limb-root bulkheads

Section titled “2026-10-26: electronics bay, battery cradle and limb-root bulkheads”

The bought electronics were one estimate box each in the torso and pelvis. They are now laid out at typical outlines for their class (cad/electrical.py), placed so nothing overlaps the frame, the motors or each other, and in the order the power flows: the battery slides out of the back of the torso between printed side guides and a latch plate, and its blind-mate connector seats in a socket over the computer, beside its buttons; the bay above the computer holds the contactor and precharge, the torso power board, the e-stop relay, the computer’s DC-DC (fed ahead of the contactor) and the three USB-CAN adapters beside the computer’s USB ports; the pelvis channel under the waist motor holds the 12 V servo DC-DC and the IMU, and the leg power board sits between the hip roll motors. A 150 W chassis-mount 12 V module does not fit the channel, so the BOM now asks for a compact 10 A brick (60 × 34 × 25 mm at most). Each limb’s harness ends at a bulkhead on its parent module (legs under the pelvis board, arms on the shoulder plates) with one power and one signal connector, so a limb unplugs as a unit; the generated harness names the bulkhead and a clip pair (parent link, child link) for every service loop, and its leg chain now follows the roll-first order. The chest shell went to 2 mm and the connector masses moved from the harness allowance to the bulkheads to stay inside the limit: 39.13 kg bare, 39.96 kg with shells. Alternative considered: a single electronics box on the back; rejected because it would sit outside the battery’s slide-out path and lengthen every harness.

2026-10-26: real actuator outlines and mounts

Section titled “2026-10-26: real actuator outlines and mounts”

The actuators were modelled as plain cylinders at their overall size. RobStride’s outline drawings (manual §1.1) and STEP models show each is a full-diameter body with the output on its front face and a smaller driver cap (with the cable exit) proud of its rear face: RS04 Ø120 body, Ø94 × 13.2 mm cap; RS03 Ø98 (ears to ~Ø107), ~Ø78 × 12.5 mm cap; RS06 Ø85, Ø70 × 14 mm cap; RS00 a plain Ø57 cylinder. Their stator hole circles are larger than the rings drawn before (RS04 10 × M4 on Ø106, RS03 8 × M4 on Ø98 in the ears, RS06 8 × M3 on Ø82). Each motor’s output direction is now in robot.yaml, and its stepped outline is used in the URDF visuals, the packaging check and the part sweep. Every mount was reworked to bolt where the motor really bolts (cad/mounts.py): a 4 mm ring on the body’s rear face with the stator holes and a hole for the cap; where a plate carries a far-side bearing stub over the cap (hip roll, hip pitch, knee, ankles) or must stay solid for strength (shoulder roll), posts join the ring to that plate, which became a light three-spoke spider where it no longer carries bolts; output flanges carry the output hole circle and a 1 mm relief outside the rotating flange. The Feetech servos were modelled with their shaft along the wrong axis; their shaft runs along their 35.8 mm height, so the neck bracket (now a cradle under the pitch servo), the head frame’s plates (on the horn and idler sides), the neck sleeve (oval, 84 mm across) and the gripper palm were rebuilt round them. A rest-pose audit of every part against every motor (the sweep only reports overlaps beyond those at rest) found and fixed a shin spacer inside an ankle motor and the shoulder roll bracket clipping the shoulder yaw motor. The computer stands on edge with its fan forward (vents in the chest shell), its I/O ports toward the sides and its buttons up, bolted by its feet to a plate behind it (outline and port positions from NVIDIA’s P3730 developer kit model, used locally and not redistributed). Robot 39.12 kg bare, 39.94 kg with shells (now 1.2 mm).

2026-10-26: box thigh top; roll bracket bar on top

Section titled “2026-10-26: box thigh top; roll bracket bar on top”

The thigh hung from the hip pitch motor in a U of two plates (an outer plate on the output, an inner plate on a far-side bearing): weak in twist and visibly a bracket. It is now a closed box round the pitch motor, with front and back walls joining the two plates below the motor and the yaw motor under its floor: much stiffer (worst SF 5.6 with a 6 mm outer wall, was 5.6 with 8 mm and no box) and one solid piece at the top of the thigh. A single-sided thigh on the pitch motor’s output alone would look cleaner still, but it puts the whole landing moment on the actuator’s output bearing, whose moment rating is still an open item; it stays an option once that is known. The roll brackets’ bars now run over the roll motors instead of outboard: the pelvis back plate is full width only below the roll axes, with a narrow spine above them, so the bars clear it when a leg rolls out 45° (checked by the part sweep). The shells over the roll motors are dropped; they are left bare. Robot 38.78 kg bare, 39.74 kg with shells.

The hip was pitch, then roll, then yaw: the hip roll RS04 sat behind the hip on the leg and swung with every hip flexion, a box hanging off the back of the thigh that also stopped the knee at 125°. It is now roll, then pitch, then yaw: the roll RS04s are fixed in the pelvis behind the hips (a static block, like a pelvis), and each roll bracket (a U round its roll motor, with a far-side bearing behind it and a bar on its outer side) reaches forward to carry the pitch RS04 at the hip joint by its stator face; the thigh hangs from the pitch motor in a U-yoke with a far-side bearing on its inner side. A full yaw-roll-pitch stack with the yaw motor in the pelvis was ruled out: it needs ~60 mm more above the hips, past the 1.30 m height limit or below the 0.65 m leg length the stairs need.

What it changed: 1.4 kg of motor per leg stops swinging with the leg; the knee now reaches 130° (beyond it the upper ankle motor meets the thigh shell); hip extension is -30° (was -40°; beyond it the thigh yoke meets the roll motor; walking uses ~-20°); the pelvis is a back plate carrying both roll motors, a top plate under the waist motor and two gussets, all kept clear of the hip pitch motors, which now swing round the roll axes. With 2.8 kg of roll motors 98 mm behind the hips, the static step-up check lost 18 and 20 cm stairs; moving the torso 25 mm forward over the hips (the waist joint) restores 10-20 cm (knee 108% of rated, hip roll 100% on a slow 18 cm step). A part-to-part sweep of the real CAD through every joint range is now part of python -m cad.covers --check (the packaging check sees only motors and boxes); it found the roll bracket’s bar swinging into the pelvis (first over the motor, then under it into the thigh; it now sits outboard), the thigh yoke against the pelvis gussets at full flexion (gussets moved inward), and the forearm folding into the upper-arm shell from 90° of elbow (a relief cut in the shell). Arms against the pelvis are now counted as self-collision, like arms against legs. Robot 38.69 kg bare, 39.78 kg with shells.

2026-10-26: head profile; hip and upper-thigh shells

Section titled “2026-10-26: head profile; hip and upper-thigh shells”

The head is now deeper than it is wide (160 x 142 mm), sitting forward of the neck with the chin forward and low and the crown back and high; the visor face leans back 18°, and its underside rises from the chin to where the neck enters. The camera sits behind a flush window (optical-grade, IR-transparent tinted polycarbonate) instead of an open slot, so the visor reads as one smooth face; the window’s effect on depth noise is a phase 6 test. Shells now cover the hip roll motor behind each hip (a dark glute, rounded over the yoke plates, above the roll axis where the roll bracket never swings) and the hip yaw motor at the top of each thigh. Shells thinned to 1.4 mm to stay inside the 40 kg limit with them on (39.93 kg).

The arms hung ~188 mm off the centre line (a person this height: ~150 mm), set by the shoulder roll RS03 (Ø100 mm) sitting outside the shoulder pitch RS03. Putting the roll motor behind the pitch motor, as at the hip, does not help: it would sweep through the torso as the arm pitches. Instead both shoulder pitch motors sit 30 mm deeper in the torso (centres at ±80 mm, joints at ±110 mm), so the arms hang 158 mm off the centre line and the shoulders are 416 mm across (was 476). The battery (140 mm wide) is wider than the space now left between the shoulder motors, so each side frame is two plates: a lower A-frame outside the battery and an upper plate on the shoulder motor’s inner face, above the battery and computer, joined by two spacers clear of the motor; the battery sits 4.5 mm lower, the electronics and keep-alive bays are narrower. With the arms closer, below 0° of shoulder roll the forearm meets the hip motor, so the roll range is now 0-120° (was -5-120°); the default stance uses 8°. Robot 38.80 kg bare, 39.88 kg with shells (0.12 kg under the 40 kg limit).

The torso shell was the convex hull of everything in the torso, so the shoulder motors (±138 mm, at the top) held its sides out all the way down: up to 44 mm of air beside a frame ±88 mm wide. It now follows the frame slice by slice, ~13 mm outside it everywhere (4 mm gap, the corner rounding and the skin), blending between slices at most 0.7 mm across per mm up: broad at the shoulders, slimmer at the chest and waist.

Compared with human proportions at this height the robot’s heights were already right (shoulder axis at 0.79 of standing height, chin at ~0.85), but it was too deep in the chest, too wide in the head and wide at the shoulders: parts that do not shrink with the robot (the computer developer kit, the battery, Ø120 mm knee motors, the 124 mm-wide depth camera) sit in a body three quarters the height of an adult (~1.7 m). Changes that need no new parts: the computer stands on edge (71 mm deep instead of 110), so the torso frame is 155 mm deep instead of 190 and the shell no longer flares at the chest; the head is a narrower, taller helmet (142 mm wide, 170 mm tall) with the camera at eye height, half way up the face; the neck is 20 mm longer, and the torso shell’s shoulders slope up into a collar round a flared neck sleeve. Standing height 1.29 m (requirement 1.20-1.30 m). Not changed, and open: narrower shoulders (the shoulder roll motor sits outboard of the shoulder pitch motor, so the arms hang ~190 mm off the centre line against ~150 mm for a person of this height) would need a new shoulder layout; a smaller head would need a narrower depth camera. The actuator envelopes were re-measured with a STEP reader and match the description (the RS03 and RS06 have a lug that reaches Ø107 and Ø90 mm at one point).

2026-10-26: helmet head and full body shells

Section titled “2026-10-26: helmet head and full body shells”

The head is now a helmet (taller than it is wide, narrowing to the chin) with a full-face glossy visor, a slot in front of the depth camera’s optics, and its bottom open over a dark neck sleeve. The add-on covers became a full body-shell set (a light torso widening to the shoulders, a dark hip girdle, long leg shells, arm sleeves, toe caps), with our own shapes. Because full shells sit close to moving parts, they are now checked automatically: python -m cad.covers --check sweeps every joint through its range plus combined poses and fails on any shell contact (in CI). The torso shell is in eight pieces so each fits a 250 mm printer. Shells are 1.6 mm (1.10 kg); the robot is 38.70 kg bare and 39.80 kg with shells, inside the 40 kg limit. The policies still train on the bare robot.

2026-10-26: staggered ankle motors; ring-and-strap plates

Section titled “2026-10-26: staggered ankle motors; ring-and-strap plates”

The two ankle RS03 sat side by side, making the shin ~132 mm wide. They are now staggered on the shin’s centre line between two side plates: one high and forward just under the knee (like a kneecap), one low just behind the ankle, each bolted to one plate with its crank outside the other; the plates’ lower ends are the ankle fork cheeks. The linkage search (tools/ankle_linkage.py --search, now with a separate position per motor) found 60 mm cranks and rods 60 mm behind and ±40 mm beside the ankle axis: 32 N·m pitch and 25 N·m roll continuous at the worst pose (side by side: 31 and 26), ratios 0.99 / 0.67 at neutral, transmission ≥ 0.53, rod force ≤ 1.9 kN. A layout with the high motor behind (a calf) was also searched: it only reached 23 / 20 N·m, because the low motor’s rod becomes very short. The shin is ~95 mm wide and its lower front stays within 40 mm of the ankle axis, which matters on stair nosings. The aluminium plates elsewhere were reduced to rings on the motors’ mounting-hole circles (measured from the STEP models: RS04 stator ~86 mm, RS03 stator ~72 mm) joined by straps sized by cad/strength.py (worst SF 2.2), instead of hulls as wide as the motors; the torso uprights became A-frames. Robot 38.71 kg (was 39.20 kg). The policies must be retrained for the new ankle ratios.

2026-10-26: arms, head, covers and harness, first pass

Section titled “2026-10-26: arms, head, covers and harness, first pass”

Arms: two-plate shoulder brackets (an L in one piece is too tall for 60 mm stock), aluminium rings on every motor face, printed upper-arm and forearm shells that carry the harness inside; 7 mm shoulder plates pass a new hand-load case (0.5 × body weight at the gripper: catching a fall or pushing up) at SF 2.4. Head: an egg-shaped printed shell with a flat-cut front and a dark visor, with a slot in front of the depth camera’s optics rather than material over them. Covers are an add-on, not structure: the robot must look finished without them, so they are generated as offset skins over the parts, kept out of the default URDF (the policies train on the bare robot) and written to a second URDF with their 0.56 kg. The harness is generated from the description (one harness per limb, one power and one signal connector at each limb root, so a limb comes off as a unit) instead of being drawn by hand, so it follows layout changes. Robot 39.20 kg bare, 39.76 kg with covers. Details in design/assembly_wiring.md.

2026-10-26: stairs work in simulation; knee stays an RS04 pending the bench test

Section titled “2026-10-26: stairs work in simulation; knee stays an RS04 pending the bench test”

The stairs policy rough v5 climbs 10, 15, 18 and 20 cm stairs up and down in the MuJoCo cross-check (five steps each way, 28 cm treads) and still walks, turns and stops on flat ground. On stairs the knees average 73–75% of their continuous rating (RMS) and hip roll ~60%, against 112% in the static worst-case check: the trained gait loads each knee only part of the time. The 1.5:1 knee stage is not needed on this evidence; the remaining check is the RS04’s real continuous rating in a thigh-sized mount (phase 2 bench test). Details in design/stairs.md.

2026-10-26: pelvis and torso structure, first pass

Section titled “2026-10-26: pelvis and torso structure, first pass”

cad/torso.py: the pelvis is a box frame of pocketed plates (the hip pitch RS04s on the side plates’ inner faces, the waist RS03 on the top plate, the pelvis electronics inside); the torso has a waist flange and base plate, two uprights carrying the shoulder pitch RS03s (flat profiles of 265 mm, cut by an online service), a bridge over the neck yaw servo, and a printed chest shell open at the back for the battery. The computer, battery and electronics stay as estimate boxes, moved so they sit inside the structure without overlaps. Mass: pelvis 0.86 kg and torso 1.46 kg against estimates of 1.0 and 1.8 kg; the robot is 39.06 kg, and the stance knee on a slow 18 cm step is at 112% of rated. The pelvis frame carries a one-leg landing at SF 37 as a box section, so it can be lightened later.

2026-10-26: keep the second-pass leg; mass limit 40 kg; knee decided after measurement

Section titled “2026-10-26: keep the second-pass leg; mass limit 40 kg; knee decided after measurement”

The second-pass leg passes cad/strength.py (worst safety factor 2.4) and puts the robot at 39.55 kg. The computer (Jetson AGX Orin developer kit) and the battery (13S3P) stay as they are, so the hard mass limit goes from 38 to 40 kg; the 35 kg target stays. Effect on the actuators: peak torques stay at or below 38% of peak in the static stair check and below 76% while walking; the continuous rating binds at the knee on slow stairs (46 N·m, 115% of the RS04’s rating) and is close at hip roll (92%).

The knee stays an RS04 for now. Whether it needs a 1.5:1 reduction stage, better cooling or nothing is decided from the stair policy’s measured knee RMS, the phase 2 bench thermal test and the torso and arm CAD masses, before the leg actuators are ordered. The issues, options and comparison with Asimov 1 and Roboto Origin are in design/stairs.md.

2026-10-26: strength check finds one-sided joints too weak; second pass adds far-side supports

Section titled “2026-10-26: strength check finds one-sided joints too weak; second pass adds far-side supports”

cad/strength.py cuts each load-carrying leg part at stations along its load path, takes the real cross section of the CAD solid (holes included), and checks bending-plus-axial stress against yield (target safety factor 2, torsion and stress concentrations excluded) for two cases: a landing load at the ankle (3 × body weight up, 0.5 × fore-aft, 0.3 × sideways, straight leg) and each joint’s peak torque. Peak torques pass everywhere (SF 4–9). The landing case fails five first-pass parts: foot base plate (SF 0.3), hip yoke back plate (0.3), hip roll front plate (0.6), shin knee flange (0.8), hip yoke side plate (1.4). Shin web and thigh plate pass (2.7–2.8).

Cause: every joint in the first pass hangs on the motor’s output on one side, so landing loads bend thin plates out of their plane. The concept already called for far-side bearings at hip roll, hip yaw and knee; the second pass adds them (the shin as a yoke around the knee, a stiffer machined hip block around the roll motor) and a stiffening rib under the foot base, then re-runs this check and the mass budget.

2026-10-26: buy actuators from Seeed Studio; bulk order after the bench test

Section titled “2026-10-26: buy actuators from Seeed Studio; bulk order after the bench test”

Seeed Studio stocks every Robstride model in the BOM at RobStride’s list prices, with about 5% off at 10+ of one model (October 2026, from Seeed’s product listings; Seeed’s pages could not be opened directly to confirm): RS04 $255 ($242 at 10+), RS03 $225 ($214), RS06 $210 ($200), RS00 $138.99 ($131.99). RobStride’s own site links to Seeed and Amazon for ordering. The BOM’s 26 actuators come to ~$5,800 at single prices, against ~$6,250 at the US resellers used before.

Only the RS03 (12 with a spare) reaches the 10+ tier on its own. Ordering it all at once would save ~$130 but commit ~$2,600 before the phase 2 bench test. So the bench units (one RS04, one RS03) are bought singly, and the remaining 11 RS03 are ordered together after the bench test passes, which still qualifies for the 10+ price. RS04 (7) and RS06 (5) stay below 10 unless a second robot or extra spares are planned. A direct quote from RobStride for the full set is still worth asking for. Seeed also sells RobStride’s $15 USB-to-CAN debug adapter, worth having for RobStride’s configuration tool; the robot’s buses stay on isolated SocketCAN adapters until the debug adapter is shown to work as one.

2026-10-26: leg CAD first pass; mass at the 38 kg limit

Section titled “2026-10-26: leg CAD first pass; mass at the 38 kg limit”

cad/leg.py draws the legs in code (manifold3d), around the motors at their STEP-model sizes: a flange, side plate and back plate at the hip; a two-plate bracket for hip roll; a flange, outer side plate and printed shell on the thigh; on the shin a knee flange, a central web that both ankle RS03 bolt to, and a fork for the ankle pitch bearings; a hollow ankle cross, 7075 cranks, rods with rod ends; and a foot of a pocketed base plate, heel posts, roll-bearing lugs and a TPU sole. Plates are 6 mm and pocketed with lightening holes; flanges 6 mm. cad/build.py computes each part’s mass and inertia (into the URDF), and checks sizes: every machined part fits the desktop mill (200 × 150 mm, 60 mm stock), except the 230 mm foot base plates, which are flat and go to an online laser or water-jet service.

Result: 1.72 kg of structure per leg plus a 0.46 kg foot (budget was 1.5 + 0.35), so the robot estimate is 37.98 kg, at the 38 kg hard limit with no margin. No fasteners, bearings or strength check yet; the second pass adds them and then lightens where the stresses allow. Further options if needed: the Orin module on a carrier board (−1.0 kg), a 13S2P pack (−1.1 kg, ~1 h instead of ~1.5 h). With the CAD masses, 20 cm stairs no longer pass the static check (17–18 cm, the requirement, still do) and the stance knee on a slow step is at 108% of rated.

2026-10-26: packaging fixes: thigh layout, knee 125°, motors moved along their axes

Section titled “2026-10-26: packaging fixes: thigh layout, knee 125°, motors moved along their axes”

tools/check_packaging.py places every motor (STEP-model envelopes) and collision box on its link and checks for overlaps over each joint’s range and in combined poses (deep squat, stair step, sitting). Within a limb, or between a limb and the body it is mounted on, an overlap is a packaging error; between different limbs it is ordinary self-collision, which the simulators model. Fixes:

  • Hip roll RS04 moved 90 mm back along its own axis, behind the hip pitch RS04 (they overlapped at the joint origin).
  • Thigh layout: hip roll to hip yaw 60 mm (was 100), hip yaw to knee 155 mm (was 115); thigh length unchanged at 300 mm. With the yaw motor low on the thigh, the calf’s ankle motors hit it from 125° of knee flexion; the roll motor no longer sits above the yaw motor, so the yaw joint can move up.
  • Knee range 0–125° (was 140°): beyond 125° the folded calf reaches the hip roll motor behind the hip. Stairs need far less; Roboto Origin allows 143°, Asimov’s simulation model 86°.
  • Shoulder pitch RS03 pulled 30 mm into the torso along its axis, clear of the shoulder roll RS03 and the head.
  • Shoulder roll range −5° to 120° (was −10°): at −10° the upper arm entered the torso.
  • Neck yaw servo lowered 25 mm into the torso top, clear of the head.

All stairs to 20 cm still pass; the stance knee on a slow 18 cm step is now at 42 N·m, 106% of the RS04’s rated torque (bench item: knee heat path).

2026-10-26: ankle motors side by side, wider push rods; real actuator envelopes

Section titled “2026-10-26: ankle motors side by side, wider push rods; real actuator envelopes”

Packaging the leg against the actuators’ STEP models (fetched locally by tools/fetch_vendor_cad.py; RS04 Ø120 × 55.7 mm, RS03 Ø100 × 56.6 mm, RS06 Ø85 × 50.5 mm, RS00 Ø57 × 51.4 mm) showed the previous ankle layout could not be built: two RS03 50 mm apart overlap (each is 56.6 mm thick), and 105 mm below the knee they hit the knee motor. They now sit side by side 64 mm apart, 125 mm below the knee, with the cranks on their outer faces. The search (tools/ankle_linkage.py --search) then finds 65 mm cranks and rods 55 mm behind and ±55 mm beside the ankle axis (foot widened to 110 mm): ratios 0.86 pitch / 0.83 roll at neutral, 31 N·m pitch and 26 N·m roll continuous at the worst pose (needs ~22 and ~14), transmission ≥ 0.58, rod force ≤ 1.3 kN. The wider rods trade some pitch for much more roll. All stairs from 10 to 20 cm still pass; the stance knee is at 99% of rated on a slow step (bench item).

The same check found that the hip roll RS04 at its joint origin would overlap the hip pitch RS04; it will sit behind it along its own axis, which leaves the kinematics unchanged. The leg CAD places every motor along its axis this way.

2026-10-26: ankle linkage geometry; ankles back to RS03

Section titled “2026-10-26: ankle linkage geometry; ankles back to RS03”

tools/ankle_linkage.py solves the two-crank, two-rod ankle exactly over the full range (pitch ±40°, roll ±20°) and searches crank radius, rod placement and crank tilt for the best worst-pose torque with a transmission (sine of the crank–rod angle) of at least 0.5. Best geometry: 45 mm cranks tilted 10°, rods ~188 mm long attached 45 mm behind, ±25 mm beside and 10 mm below the ankle axis; cranks swing −53° to +54°. Joint torque per motor torque is 1.02 (pitch) and 0.56 (roll) at neutral, and at the worst pose the pair gives about 2.0× (pitch) and 1.0× (roll) one motor’s torque. Narrowing roll to ±15° hardly changes this.

With RS06 that is 22 N·m pitch and 11 N·m roll continuous, against ~22 N·m pitch and ~14 N·m roll that slow stair climbing and standing on one foot need (check_step_up.py). With RS03 it is 39 N·m and 20 N·m. The ankles therefore go back to RS03, the fallback named in v0.2; mass estimate rises by 1.1 kg to ~37.3 kg (limit 38 kg). The largest rod force for a 60 N·m pitch / 30 N·m roll demand is ~2 kN, which sizes the rod ends (M6 steel-ball rod ends or larger) and push rods. Alternatives: RS06 ankles relying on walking duty cycle to stay within rating (rejected: slow stairs and one-foot standing are sustained); a larger crank-to-rod ratio (limited by the ±40° pitch range and transmission).

2026-10-26: ankle dorsiflexion 40°; hip height stays 0.65 m

Section titled “2026-10-26: ankle dorsiflexion 40°; hip height stays 0.65 m”

sim/mujoco/check_step_up.py (static: three poses of a slow step, pelvis upright, CoM over the supporting foot, stance torques) shows:

  • With 35° of ankle dorsiflexion no leg length could climb 17 cm: in the “weight on the stair” pose the CoM cannot get over the front foot. Widening hip extension, knee flexion or plantarflexion did not help; dorsiflexion did.
  • The smallest dorsiflexion that climbs 17–20 cm is 38° at every leg length tried (0.62, 0.65, 0.69 m hip to sole). Leg length barely matters in this test, so the hip height stays 0.65 m.
  • The ankle pitch range becomes −40°/+40°; the linkage must reach it. All stairs from 10 to 20 cm are then possible; the stance leg’s worst static torque is the knee at 37 N·m (31% of peak, 94% of rated).
  • Single-support ankle roll needs ~14 N·m, about the RS06 pair’s rated roll torque with the placeholder 0.6 roll ratio. The linkage design must give a higher roll ratio, or the ankles go back to RS03.

2026-10-25: v0.2: shorter legs, RS06 ankles, hip yaw stays RS03, ranges checked

Section titled “2026-10-25: v0.2: shorter legs, RS06 ankles, hip yaw stays RS03, ranges checked”

Compared with two open humanoids of the same class (Asimov 1, from its simulation model; Roboto Origin, from its URDF, BOM and Isaac Lab config):

Asimov 1 Roboto Origin Marvin v0.1 Marvin v0.2
Height, mass 1.2 m, 35.5 kg 1.25 m, 33.8 kg 1.255 m, 37.5 kg est. 1.215 m, 36.2 kg est.
Thigh / shin / hip to sole ~0.25 / 0.295 / ~0.58 m 0.25 / 0.30 / ~0.62 m 0.32 / 0.30 / 0.69 m 0.30 / 0.29 / 0.65 m
Hip order from pelvis pitch, roll, yaw yaw, roll, pitch pitch, roll, yaw pitch, roll, yaw
Hip yaw actuator limited to 28 N·m in sim 120 N·m class RS03, 60 N·m RS03, 60 N·m
Ankle two motors, 40 / 17 N·m pitch / roll in sim two 27 N·m motors on a linkage two RS03 (60 N·m) two RS06 (36 N·m)
Knee range 0–86° (sim) −11° to 143° 0–140° 0–140°
Ankle pitch / roll range ±20° / ±6° (sim) ±34° / ±29° −45/+35° / ±20° −40/+35° / ±20°
  • Legs: hip axis to sole goes from 0.69 m to 0.65 m (thigh 0.30 m, shin 0.29 m, ankle 0.06 m), and overall height from 1.255 m to 1.215 m. 0.69 m was longer than both references, adding leg inertia and mass; 0.65 m still meets requirement R3 for 17–18 cm stairs. Phase 1 simulation compares 0.62, 0.65 and 0.69 m on stairs before the leg CAD is fixed.
  • Ankles: two RS06 (36 N·m peak, 11 N·m rated) per ankle instead of two RS03. Roboto Origin walks and runs at 34 kg on two 27 N·m motors per ankle. Saves ~1.1 kg of distal mass. Risk: continuous stance torque is close to the RS06’s rating, so phase 1 checks ankle torque and heating, and RS03 remains the fallback (same bus, similar mounting).
  • Hip yaw: stays RS03 (60 N·m), between Asimov’s 28 N·m limit and Roboto Origin’s 120 N·m actuator.
  • Hip order: stays pitch, roll, yaw (as Asimov 1), which suits deep hip flexion for stairs; Roboto Origin’s yaw-first order is noted as an alternative.
  • Ranges: hip pitch extension widened to 40° (Roboto Origin allows 45°); ankle plantarflexion set to 40°, a realistic target for a two-motor linkage. Our knee and ankle ranges are closer to Roboto Origin’s than to Asimov’s simulation limits, which suits stairs.
  • Bench test: phase 2 tests an RS04 and an RS06 (the RS06 now covers 8 joints).

2026-10-25: mass target kept at 35 kg; estimate is 37.5 kg

Section titled “2026-10-25: mass target kept at 35 kg; estimate is 37.5 kg”

Updated by v0.2 above: the estimate is now 36.2 kg.

The v0.1 estimate (tools/check_description.py) is 21.8 kg of motors plus 15.7 kg of everything else. That is over the 35 kg target and under the 38 kg hard limit. Reductions to test in phase 1: RS06 instead of RS03 at the ankles (−1.1 kg), the Orin module on a compact carrier board instead of the developer kit (−1.0 kg), lighter leg cores once real loads are known.

2026-10-25: structure: aluminium load path, printed structural shells

Section titled “2026-10-25: structure: aluminium load path, printed structural shells”

Machined 6061 cores carry the load through each leg and the pelvis; 7075 only for highly loaded flanges and ankle cranks. Printed carbon-fibre-nylon shells bolt through to metal inserts and add stiffness, so the robot looks finished without a separate cover. Arms, which carry light loads, use printed structural shells with aluminium rings at the actuators. A second (far-side) bearing supports the hip roll, hip yaw and knee joints; a crossed-roller bearing supports the waist. Parts must fit a desktop CNC mill of about 200 × 150 mm usable area, so thigh and shin cores are split into pinned segments or ordered from an online machining service. Alternatives: all-machined structure (heavier, more machining time); fully printed structure (load must still go through metal; heat near actuators softens PETG-class plastics).

2026-10-25: leg layout: hip pitch, roll, yaw; knee at the joint; two-motor ankle

Section titled “2026-10-25: leg layout: hip pitch, roll, yaw; knee at the joint; two-motor ankle”

Updated by v0.2 above: hip to sole 0.65 m, RS06 ankle motors.

Hip order from the pelvis is pitch, roll, yaw, which allows deep hip flexion for stairs and sitting. The knee motor sits at the knee for v1 (simplest). Each ankle uses two RS03 motors mounted high on the calf, driving pitch and roll through push rods with spherical rod ends, which keeps the shin light. Hip axis to sole is 0.69 m (55% of height), sized for 17–18 cm stairs. Alternatives: knee motor near the hip with a linkage (lower leg inertia, more parts; revisit if simulation shows a need); serial ankle pitch and roll motors (heavier shin).

2026-10-25: arms use RS06 at shoulder yaw and elbow

Section titled “2026-10-25: arms use RS06 at shoulder yaw and elbow”

Robstride’s RS06 (36 N·m peak, 0.621 kg) replaces the RS02 (17 N·m). Roboto Origin uses 27 N·m-peak actuators at every arm joint; Asimov 1’s simulation model limits shoulder yaw to 20 N·m and the elbow to 12 N·m. The RS02’s 17 N·m peak is below the first, and the RS06 leaves margin for push-ups and getting up after a fall. Cost +~¥600 for four, mass +~0.96 kg. Revisit with simulated arm torques in phase 1.

2026-10-25: Robstride actuators, RS04 / RS03 / RS06 / RS00

Section titled “2026-10-25: Robstride actuators, RS04 / RS03 / RS06 / RS00”

Robstride gives the most torque per dollar of the quasi-direct-drive actuators compared, publishes manuals and specifications in a public repository, and has the best open software support among budget brands (Python, Rust and ROS 2 drivers). RS04 (120 N·m) at hip pitch, hip roll and knee; RS03 (60 N·m) at hip yaw, ankles, waist and shoulder pitch and roll; RS06 at shoulder yaw and elbow; RS00 at the wrists. Second source for the 120 N·m class: Damiao DM-J10010L (also MIT-mode CAN). Ask RobStride for a direct quote: China list prices are roughly half of US reseller prices before shipping and tariffs. Alternatives: CubeMars (2–3× the price per N·m), Damiao (fewer verified specs), Encos and MyActuator (several times the price), self-built cycloidal actuators (more work, lower torque).

2026-10-25: six motor CAN buses plus one battery bus

Section titled “2026-10-25: six motor CAN buses plus one battery bus”

Robstride uses classic CAN 2.0B with 29-bit identifiers at 1 Mbit/s, and each motor needs a command and a reply frame per cycle. Six motors on one bus at 500 Hz would load it to roughly 80–90%. Each leg gets two buses (hip: 3 motors; shank: knee and two ankle motors) at 500 Hz; each arm gets one bus at 250 Hz, with the waist on the right arm’s bus. All stay at or below 48% load (worst-case 160-bit frames). A seventh bus carries battery telemetry. The Orin’s two on-board CAN controllers (with 3.3 V transceivers) and isolated USB-CAN adapters (gs_usb, SocketCAN) provide the buses; a microcontroller bridge is the fallback if bench tests show too much jitter.

2026-10-25: power: 13S3P quick-release pack, keep-alive supply, 4.1 V charging

Section titled “2026-10-25: power: 13S3P quick-release pack, keep-alive supply, 4.1 V charging”

A 13S3P pack of 21700 high-discharge cells (~630 Wh, ~3.4 kg) gives about 1.5× the runtime of 13S2P for ~1.1 kg more. It sits on a quick-release cradle with an anti-spark blind-mate connector. A small keep-alive battery feeds only the computer through an ideal-diode OR, so the computer stays up during a swap. A full 13S pack is 54.6 V against the actuators’ 60 V limit, so regen spikes are a real risk: charge to 4.1 V per cell (53.3 V) for daily use and fit a clamp at about 56–58 V. DC-DC converters are rated for 75 V input, and the computer’s supply is wired upstream of the motor contactor so an e-stop never reboots it. Main path: Class-T fuse, precharge, contactor. Alternatives: 13S2P (lighter, ~1 h); two packs OR-ed for swapping while walking (v2).

2026-10-25: sensing: active-stereo depth camera, low-latency IMU

Section titled “2026-10-25: sensing: active-stereo depth camera, low-latency IMU”

Head camera: Orbbec Gemini 335L. It computes depth on the camera, leaving the Orin’s GPU free; its IR pattern gives depth on plain floors and carpeted stairs; it connects over USB-C; and Isaac Sim 6.2 has a built-in model of it. Driver support on JetPack 7.2 must be confirmed before ordering. IMU: the locomotion policy needs a low-latency gyro at 500 Hz or more. A low-cost USB AHRS module tops out around 200 Hz, so it is the backup; the primary will be an industrial AHRS or a BMI088 read by a microcontroller, decided after a bench test. Alternatives: ZED X Mini (needs a capture card and computes depth on the GPU), RealSense D455 (USB stability reports on Jetson).

Onboard: Jetson AGX Orin 64 GB developer kit (already available), JetPack 7.2, Isaac ROS 4.6 and ROS 2 Jazzy. Isaac ROS 5.0 is skipped for now because of reported regressions on Orin. A real-time control process (CAN I/O, 50 Hz policy, safety) runs outside ROS. Training: Isaac Lab 3.0 with rsl_rl, MuJoCo as a cross-check. Manipulation: GR00T N1.7, served from a desktop GPU first and moved to the Orin with TensorRT later. Whole-body control starts with the RL lower body plus IK arms; a motion-tracking controller (retargeting with GMR, BeyondMimic-style training) comes later. NVIDIA’s SONIC checkpoints are for another robot and need far more compute to retrain, so it is deferred. Alternatives: Jetson Thor T4000 (same module price in 2026; worth considering for a second robot).

2026-10-25: vendor CAD is linked, not committed

Section titled “2026-10-25: vendor CAD is linked, not committed”

Robstride’s STEP models are public but carry no licence, and several CAD sites forbid redistribution or derived designs. The repo will fetch vendor models into a git-ignored folder with a script and use its own simplified envelopes in committed designs. Fasteners and bearings come from parametric libraries with open licences (bd_warehouse, Apache-2.0).

2026-10-25: built in stages, simulation first

Section titled “2026-10-25: built in stages, simulation first”

See plan.md. Parts are bought per phase; only two actuators are bought before the simulation pass check.

2026-10-25: from scratch, with open designs as references

Section titled “2026-10-25: from scratch, with open designs as references”

Marvin Bot is a new design. Asimov v1 is the main reference for layout and sizing and is used for ideas only, never its CAD. Other references are listed in ACKNOWLEDGMENTS.md.


This page is generated from docs/decisions.md in the repository.