From 9bebd3604cb520b32904bb63b5177b3bd59e4a40 Mon Sep 17 00:00:00 2001 From: "-T.K.-" Date: Sun, 26 Jul 2026 03:52:00 -0700 Subject: [PATCH] feat(lite_biped): re-export feet from CAD, model the full shoe sole The shoe sat in the wrong place in the previous export. Re-exported from Onshape (same document / configuration) offline via robot.pkl. The change is confined to the two foot links: COM and visual origin move ~3.8 mm, inertia rises 13-16%, mass unchanged. Standing height is NOT affected -- the sole plane stays at exactly -0.775 m, so the training init pose, foot sites and every height-dependent reward are untouched. Foot colliders go from 2 boxes to 11 spheres per foot, now covering the whole shoe bottom including the 21 mm toe upturn (y 58 -> 132 mm) that the boxes never reached: only the flat patch was modelled before. Sphere centres sit on the 3D lower convex hull of the sole -- the only points that can ever touch a plane, since everything else is shadowed for every ground orientation -- and are offset along the inward surface normal, so each is tangent to the shoe rather than hovering above it (on a 25 deg toe facet those differ by 3.4 mm). Validated by sweeping pitch -20..+40 deg x roll +-10 deg and comparing the sphere set's lowest point against the real mesh at each pose: mean +0.46 mm, max 2.07 mm. Standing support polygon 97.96 cm^2 across 8 load-bearing spheres. Spheres are also cheaper than the boxes they replace -- box-plane emits a contact per bottom corner, so grounded boxes cost up to 16 contacts per foot versus 11 here, with no near-duplicate corner pairs to arbitrate. Folded in from earlier work on this branch, because the regenerated artifacts interleave it and splitting would mean committing a generator that disagrees with its own output: - MJCF actuators switch from to , putting the joint PD inside the physics step instead of sampling it once per controller_manager tick; regenerates lite_bimanual and lite_dummy too. Its unit test still asserted and was failing -- updated to match. - ankle_pitch four-bar linkage parameters in cad/ros2_control.json and the xacro generator. uv run pytest: 1418 passed, 5 skipped. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_012QKJQ9hze1hMWXJpdPcjp3 --- robot_assets/workflow/urdf_to_mjcf.py | 32 +++- robot_assets/workflow/urdf_to_xacro.py | 109 ++++++++++-- robots/lite_bimanual/mjcf/lite_bimanual.xml | 2 +- robots/lite_biped/cad/ros2_control.json | 9 +- robots/lite_biped/cad/scad/left_foot.scad | 18 +- robots/lite_biped/cad/scad/right_foot.scad | 18 +- .../meshes/visual/left_foot_visual.stl | Bin 529384 -> 587184 bytes .../visual/right_ankle_pitch_visual.stl | Bin 25384 -> 25384 bytes .../meshes/visual/right_foot_visual.stl | Bin 529484 -> 586684 bytes robots/lite_biped/mjcf/lite_biped.xml | 42 +++-- robots/lite_biped/urdf/lite_biped.urdf | 160 +++++++++++++++--- .../xacro/lite_biped.description.xacro | 160 +++++++++++++++--- .../xacro/lite_biped.ros2_control.xacro | 51 ++++-- robots/lite_biped/xacro/lite_biped.urdf.xacro | 4 +- robots/lite_dummy/mjcf/lite_dummy.xml | 2 +- tests/test_urdf_to_mjcf.py | 11 +- 16 files changed, 501 insertions(+), 117 deletions(-) diff --git a/robot_assets/workflow/urdf_to_mjcf.py b/robot_assets/workflow/urdf_to_mjcf.py index 8fe08fc..a9dc34d 100644 --- a/robot_assets/workflow/urdf_to_mjcf.py +++ b/robot_assets/workflow/urdf_to_mjcf.py @@ -4,7 +4,7 @@ raw URDF + meshes -> MuJoCo compile -> post-process: * replace cylinder geoms with capsules * inject