Changelog¶
1.0.0¶
One Robot object drives any robot, in simulation or on real hardware, through six
contracts; bash acceptance/all.sh proves it against real backends and prints what it
verified. Package: strands_robots, about twenty thousand executable lines on seven layers
that only import downward.
In¶
Robot(name, mode="sim"|"real"|"twin", port=..., driver=...): one class for sim and real, owning exactly oneDriver;observe,act(validate, finite, clamp, lease),preflight,is_connectedasked of the wire,closewith torque off.- Six contracts in
core/contracts.py:RobotLike,Driver,SimEngine,Transport(Protocols),Policy,Recorder(ABCs).UnitFramewithpreflightrefusing a DOF change or a cartesian to joint gap before motion. - Registry:
robots.jsonrows only for usable robots (asset, driver or lerobot type), joint frames per row,max_stepper row;policies.jsonwith seven providers; the factories (make_driver,make_sim,make_policy,make_transport) as the dependency-inversion seam. - Drivers: thirteen native wires, each
protocol.py(pure functions over bytes) plusdriver.py: Feetech (SO-100/101, LeKiwi, HopeJr, Open Duck), Dynamixel (Koch, ALOHA, ViperX, WidowX, Trossen), Unitree G1 and Go2 (DDS), Franka FCI, UR RTDE, Robotiq, Booster T1, Crazyflie, EarthRover, Microduck robotd, Reachy Mini daemon, Yahboom M3 Pro; the lerobot driver for every other lerobot robot type;ServoBusTwingiving Feetech and Dynamixelmode="twin"against the MuJoCo model. - Simulation:
MujocoEnginefirst-class (reset, step, render, contacts, objects, headless EGL); Isaac and Newton behind the sameSimEngine; one noise model, one mp4 writer. - Policies:
lerobot_local(every architecture lerobot ships),grootservice client,cosmos3,mock,rl(gymnasium env overSimEngine, algorithms from stable-baselines3),microduckONNX,wbcONNX (gait=True); one RTC implementation, one quaternion helper. - App:
PolicyRunnerwith RTC,teleop,DatasetRecorderwriting lerobot-format datasets for sim and real with a receipt fromsave()and a tombstone after it,replay,skills(move_to,set_gripper,look_at),Lease(one writer per arm). - Mesh: Zenoh and loopback transports, presence, state, correlated RPC, per-robot command
allowlist with bounds, HMAC envelopes with a replay window, signed append-only audit
chain, one fleet e-stop with lockout cleared by
STRANDS_MESH_OVERRIDE_CODE. - Tools: fourteen (
list_robots observe move preflight list_policies run_policy record_episode dataset_info mesh_fleet mesh_ask camera_list camera_snap mhs_fleet mhs_invoke),mode="sim"anddry_run=Trueby default,confirm=Truefor real motion, strands HITL on hardware motion; thestrands-robotsCLI over the same functions,doctorgenerated from the extras. - MHS: every
Robotmounts as a Model Hardware Standard device (app.mhs.mount_robot): manifest derived from the registry row, validators refuse out-of-range before dispatch,execute_opruns thePolicyRunner, one e-stop shared with the mesh, broker loss lowersestopto 1;STRANDS_MESH_BACKEND=mhscarries the mesh over the same broker. - Dashboard: fleet, cameras over WebSocket, run, record, replay, e-stop, WebAuthn passkeys,
confirm: trueon every write. - Acceptance: ten scripts and
all.shprinting== v1.0 ACCEPTANCE GREEN (n real / m skipped) ==. - Docs: about thirty pages; contracts, robot and policy cards, the coverage matrix, the tool reference and the configuration page generated from the source at build.
- Containers:
base,so101,g1,microduckimages for amd64 and arm64.
Out, and what replaces it¶
| left | replacement |
|---|---|
moveit2, curobo planners |
implement Policy when someone needs one; no contract kept warm |
kimodo, protomotions |
not owned here; a text-to-motion chain belongs upstream |
remote, lerobot_async providers |
lerobot's own async_inference |
| GR00T 1.5 / 1.6 / 1.7 in-process loaders | lerobot_local serves GR00T N1.7; groot stays as the service client |
| IoT Core transport and provisioning | Zenoh router across networks |
bridge transport, camera offload, mesh/input.py, mesh/sensors.py |
drivers own their cameras; the mesh carries state |
| ROS mobile-base robots in the mesh | drivers/ros/graph.py (rosbridge) and the Yahboom driver |
lerobot_record subprocess writer |
DatasetRecorder for sim and real alike |
| three noise models, three mp4 writers, four quaternion helpers, two RTC blocks | one of each |
benchmarks, terrain curricula, live scene recompilation, run_multi_policy |
features that grow back on a stable engine |
motion primitives per backend, ik.py |
app/skills.py over the contract |
| 76 tool functions (13 G1, 14 Reachy forwards) | 14 tools over RobotLike |
| Device Connect | none; the mesh is the fleet path |
| ~40 registry rows with no asset, driver or lerobot type | none; a row exists only if it is usable |
tests/ with mocked backends |
the acceptance suite against real backends |
| 107 doc pages | about 30, generated where they can be |