feat(lite_biped): re-export feet from CAD, model the full shoe sole - #12
Merged
Conversation
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 <motor> to <position>, 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 <motor> 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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012QKJQ9hze1hMWXJpdPcjp3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The shoe sat in the wrong place in the previous CAD export. Re-exported from Onshape (same document / configuration) offline via
robot.pkl— no API traffic.The kinematic 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: 2 boxes → 11 spheres per foot
The old boxes only modelled the flat patch. The shoe bottom actually continues into a 21 mm toe upturn over y = 58 → 132 mm that no collider reached:
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 possible 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° toe facet those differ by 3.4 mm).
Validation
Swept pitch −20…+40° × roll ±10°, comparing the sphere set's lowest point against the real mesh at each pose — exactly the quantity contact resolution sees:
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 for the solver to arbitrate.
Also folded in
Earlier work on this branch that the regenerated artifacts interleave — splitting it would mean committing a generator that disagrees with its own output:
<motor>to<position>, putting the joint PD inside the physics step instead of sampling it once percontroller_managertick (regenerateslite_bimanualandlite_dummytoo). Its unit test still asserted<motor>and was failing — updated to match.ankle_pitchfour-bar linkage parameters incad/ros2_control.jsonand the xacro generator.Test plan
uv run pytest— 1418 passed, 5 skippedcondim=3 friction="0.6 0.005 0.0001" priority=1foot_collision_Ngeom naming preserved, so downstream friction DR keeps matching🤖 Generated with Claude Code
https://claude.ai/code/session_012QKJQ9hze1hMWXJpdPcjp3