Skip to content

strands-robots v0.4.1

Latest

Choose a tag to compare

@cagataycali cagataycali released this 01 Jul 17:23
ed96a5d

strands-robots 0.4.1

GR00T Whole-Body-Control for the Unitree G1, PPO/FastSAC RL stack
with deterministic eval, LeKiwi in sim, and hard hot-path correctness fixes
(RTC sim/real parity, no silent open-loop rollouts, persistent-policy perf).

416 commits since v0.4.0. All clips rendered headless in MuJoCo (MUJOCO_GL=egl)
against the exact source being tagged.


Highlights at a glance

Feature What it does Demo
Whole-Body Control WBCPolicy wraps NVIDIA GR00T SONIC ONNX controllers for deploy-grade G1 locomotion - in-process ONNX (no torch, no sidecar). walk
WBC + steering Balance + walk ONNX sessions auto-selected by commanded speed; yaw while walking. turn
RL from scratch PpoTrainer, FastSacTrainer, VecSimEnv, BaseRLAlgo.evaluate(). FastSAC learns SO-100 reach from reward alone (−8.77 → −5.50). rollout
LeKiwi in sim Robot("lekiwi", mode="sim") now works - auto-downloads Ekumen-OS description (6-DOF arm on 3-omniwheel base). lekiwi

1. Whole-Body Control

Non-VLA provider wrapping GR00T Whole-Body-Control (SONIC / decoupled-WBC) ONNX
controllers. Faithful 86-dim observation stacked over 6 steps, two ONNX sessions
(balance + walk) auto-selected by commanded speed, upstream PD-to-torque law.

from strands_robots import Robot

g1 = Robot("unitree_g1", mode="sim", backend="mujoco")
g1.run_policy(
    policy="wbc",                 # GR00T SONIC whole-body controller
    command={"vx": 0.5},          # forward 0.5 m/s
    duration=6.0,
)
# forward walk: base +2.30 m, pelvis height 0.74 -> 0.75 m (upright, no fall)
vx omega result
Forward walk 0.5 m/s 0.0 +2.30 m, stays upright
Walk + yaw 0.3 m/s 0.4 rad/s steers while balanced

Weights: nepyope/GR00T-WholeBodyControl_g1 (NVIDIA Open Model License).

2. Reinforcement learning constructs

New strands_robots.training.rl stack. VecSimEnv runs N SimEnv as one
(N,D)-batched env over one reused thread pool. evaluate() is a deterministic
eval peer of train() - mean action, frozen normalizer, reports success_rate.

from strands_robots.training.rl import FastSacTrainer, VecSimEnv

env = VecSimEnv("so100", n_envs=8, task="reach")
trainer = FastSacTrainer(env)
trainer.train(iterations=80)          # CPU: mean return -8.77 -> -5.50
stats = trainer.evaluate(episodes=10) # deterministic: elbow 0.225 vs target 0.200

FastSAC learning curve

Also: SARM reward-model training + RA-BC production loop.

3. LeKiwi - now simulatable

from strands_robots import Robot

kiwi = Robot("lekiwi", mode="sim")   # was: "No model found"
# auto-downloads Apache-2.0 Ekumen-OS/lekiwi MuJoCo description
# 6-DOF SO-ARM on 3-omniwheel base (9 actuators), front/wrist cameras

4. Hot-path correctness (contract fixes - deploy-critical)

Fix Before After
RTC sim/real parity hardware loop ignored Real-Time Chunking contract loop honours RTC; inference_delay forwarded to denoiser; chunk-seam re-anchored for relative-action policies. Async-RTC latency masking now default
No silent open-loop state-key mismatch -> silent zero/open-loop rollout loud error; routing-degradation telemetry (positional_fallback_used, generic_state_keys_used) in run_policy/eval_policy JSON
Episode-count contract ambiguous run_policy episode count + verify_dataset_episodes; reset() during recording flushes buffered episode
PersistentPolicy reloaded heavy checkpoints per call resident worker + cache controls + policy_resident_rss_mb telemetry
Clean errors partial stub shadowed lerobot.policies; cached transient probe failures unknown policy types raise clean ImportError; probes no longer cache transient failures
get_mass_matrix broke on MuJoCo mj_fullM signature change works across signatures; numpy scalars retained in state/action vectors

5. Newton backend maturation

Scene-discovery + per-joint state parity with MuJoCo, domain randomization +
sensor-noise hooks, recording fix (camera frames captured even when policy skips images).

6. Security hardening

Output-path sandboxing across all three LLM-supplied filesystem sinks -
render(output_path=), run_policy(video=), start_cameras_recording -
centralized in simulation.safe_output: rejects .. traversal, backslash
separators, shell metacharacters, symlinked targets before any file opens.
Atomic writes; size caps.

7. Ergonomics / correctness

  • add_object rejects unknown kwargs with a structured error (was: silent grey default).
  • Zero-config robot discovery from robot_descriptions in the registry.
  • Simulation render output is ASCII-only; unified "no world" guard contract.

Media (higher-quality MP4 originals)

Clip GIF MP4
G1 WBC walk gif mp4
G1 WBC turn gif mp4
LeKiwi drive gif mp4
RL reach rollout gif mp4

Assets on branch release/0.4.1-visuals under release-assets/0.4.1/.

Full changelog: git log v0.4.0..v0.4.1 once tagged, or compare/v0.4.0...main.