Skip to content

feat(lite_biped): re-export feet from CAD, model the full shoe sole - #12

Merged
T-K-233 merged 1 commit into
mainfrom
feat/lite-biped-foot-colliders
Jul 26, 2026
Merged

feat(lite_biped): re-export feet from CAD, model the full shoe sole#12
T-K-233 merged 1 commit into
mainfrom
feat/lite-biped-foot-colliders

Conversation

@T-K-233

@T-K-233 T-K-233 commented Jul 26, 2026

Copy link
Copy Markdown
Member

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:

tilt from horizontal area height above sole y range
0–2° (flat) 90.4 cm² 0.00–0.25 mm −73.8 … 60.9
2–10° 24.1 cm² 0.20–2.52 mm 57.9 … 84.0
10–25° 28.6 cm² 2.68–12.93 mm 84.9 … 118.1
25–45° (toe tip) 6.5 cm² 12.46–20.73 mm 117.1 … 132.4

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:

clearance error   mean +0.46   max +2.07   min -0.95 mm
standing support  97.96 cm² 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 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:

  • 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.

Test plan

  • uv run pytest — 1418 passed, 5 skipped
  • MJCF compiles in MuJoCo: nq=21, nv=20, ngeom=41; 11 collision spheres per foot carrying condim=3 friction="0.6 0.005 0.0001" priority=1
  • foot_collision_N geom naming preserved, so downstream friction DR keeps matching

🤖 Generated with Claude Code

https://claude.ai/code/session_012QKJQ9hze1hMWXJpdPcjp3

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
@T-K-233
T-K-233 merged commit e5b95a1 into main Jul 26, 2026
2 checks passed
@T-K-233
T-K-233 deleted the feat/lite-biped-foot-colliders branch July 26, 2026 11:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant