Hi all,
I’ve built a bipedal robot rig in Isaac Sim from CAD-derived USD geometry, fully scripted (single Python file run in the Script Editor). Current pipeline:
- CAD → USD reference → rigid bodies + real mass/CoM per link
- Joint reconstruction (revolute hips/knees/ankles, fixed structural links) with world-anchor-based local frame computation
- Real friction materials on feet + ground
- A cascaded balance controller: contact-triggered (hysteresis-based) → ankle PID → knee offset → hip offset, driven off torso tilt/lean
- Live physics-step debug logging (torso height/tilt/lean, per-foot contact state, correction values) with automatic fall detection and joint-gap diagnostics
This is stable standing on flat ground. I’m now extending it to a walking gait:
- Converting the previously-fixed hip pitch joints to driven revolute joints
- Adding a phase-based gait pattern generator (swing/stance split, hip pitch swing, knee lift during swing, lateral CoM shift for weight transfer) layered underneath the existing balance PID, so the reactive stabilization rides on top of moving gait setpoints instead of static ones
- Starting with a slow, statically-stable walk (CoM within support polygon, generous double-support fraction) before considering ZMP/dynamic gait or an RL-trained policy in Isaac Lab
Questions for the community:
- Anyone have recommendations for tuning
PhysxSceneAPI solver iteration counts (currently minPositionIterations=16, minVelocityIterations=4 at 120 Hz) for stable foot-contact behavior during a walk cycle vs. static standing?
- For contact detection, I’m currently doing a geometric lowest-point height check with hysteresis rather than PhysX contact reporting APIs — is there a lighter-weight way to get reliable per-foot ground contact events (e.g.,
PhysxContactReportAPI) that people have had good luck with for locomotion control loops?
- Any pointers to reference Isaac Sim/Isaac Lab examples of drive-based (not RL) scripted bipedal gaits I could benchmark against?
Hello @ntrstarun053,
Thanks for posting in the Isaac ROS forum!
We don’t really have the official maintained drive-based scripted biped gait example to benchmark against. The closest references are the H1/G1 humanoid walking threads and the Isaac Sim policy examples. Those point toward using a custom walking controller or policy-based locomotion rather than a built-in scripted gait controller.
For solver settings, your current setup sounds like a reasonable starting point. If walking contact is unstable, try a controlled sweep such as:
- 16 / 4 at 120 Hz
- 32 / 8 at 120 Hz
- 16 / 4 or 32 / 8 at 240 Hz
As a diagnostic check, compare whether reducing the physics timestep helps more than only increasing solver iterations. If the smaller timestep helps more than higher iteration counts, the issue is likely contact/drive stiffness dynamics. If neither helps, check the gait timing, touchdown velocity, foot collision geometry, and drive saturation.
For per-foot contact events, I would switch from the geometric lowest-point check to Isaac Sim Contact Sensor or PhysxContactReportAPI. A height check could work for simple standing, but during walking it can give false contact during swing, miss edge/toe/heel contacts, or report contact before PhysX actually resolves the collision.
A good pattern for the early bring up is:
- Add one contact sensor per foot or per foot pad.
- Use
in_contact / contact count as the stance/swing gate.
- Keep hysteresis/debounce in your controller, for example require contact to be present for a few physics frames before switching to stance.
- Use raw contact data only if you need contact point, normal, impulse, or force distribution.
- Treat contact state as delayed/noisy input; do not switch gait phases from a single-frame contact event.
For locomotion control, keep the gait quasi-static first:
- Long double-support phase.
- Low swing-foot touchdown velocity.
- Smooth joint targets with rate/acceleration limits.
- Balance PID as a bounded correction, not a large command that fights the gait generator.
Isaac Lab also has a useful contact-sensor example with ANYmal feet. It is not a biped scripted gait example, but it is a good reference for per-foot contact-force reporting in a locomotion-style robot setup. The example defines contact sensors on individual feet and reads net_forces_w / force_matrix_w.
Please treat all numeric settings as reference starting points. The right configuration is robot-specific and depends on both the asset and controller setup.