run(). Nothing
executes until run().
go1, g1) are gait-driven and
return Step descriptors; the arm is a fixed-base manipulator that is
Cartesian (poses and grasps) and returns ArmAction descriptors. Everything
below up to Arm describes the legged Step model.
How it works
Each action method (go1.jump(), go1.walk_forward(), …) returns a lightweight
Step, a name plus modifiers. run() normalizes the list, looks each name up
in the action library, applies your speed/extension
overrides, and executes it on the simulator. A nested list runs as one
concurrent, merged gait.
The Step descriptor
You rarely build
Step directly. The action methods do it for you.
Go1 action methods
Each returns aStep. Pass speed, extension, distance_m, rotation_rad,
or repeat where they apply.
G1 action methods
The G1 humanoid scripted runner currently executesstand, crouch,
walk_forward, jump, and hold:
The full G1 action library has 20 actions (arms, turns, etc.).
Reach the rest through
Sim, GymAdapter, or the
stack. The scripted g1.run([...]) path is the
balance-stabilized subset.run()
- Scripted
- Goal-driven
goal= is given, run() forwards to cadenza.stack.run.
Otherwise it executes the sequence in the viewer.
Concurrency
Nest a list inside the sequence to fuse those actions into a single gait. Their velocity / yaw / step-height commands are merged:Inference at construction
Attach a VLA orchestration strategy so each step is run “think-and-act” instead of open-loop:Bundled assets
Demo: a full Go1 routine
Send it to a real robot
The same
Step list deploys to a physical Go1 / G1 over DDS, SSH, or a bridge.Arm (6-axis manipulator)
The arm is Cadenza’s third robot: a fixed-base 6-DOF articulated arm with a parallel two-finger gripper. Unlike the legged robots, it has no gaits — its primitives are Cartesian (go to a pose, grasp the thing at a location), so motion is driven by closed-form inverse kinematics and “grasping” is a weld the controller activates when the gripper closes on an object.ArmAction descriptor (the manipulator’s analogue of
Step); nothing runs until arm.run(...).
Arm action methods
Cartesian targets are in metres, in the arm’s base frame, and accept either
spelling:
run()
ArmAction list. Pass
headless=True for tests / CI (no window):
How it stays controlled
The controller keeps the hand above the work surface at all times: every
target is clamped to a no-go floor and the IK solution is checked so the
fingertips never dip below the table, and the arm bodies are gravity-compensated
so the position servos track without sag. The result is a controlled pick/place
that hits the table and stops, instead of phasing through it.
- Top-down IK — damped-least-squares solving for the gripper to reach a
point pointing straight down.
move_to/pick/placeall use it. - Grasp = weld — when the gripper closes on the object, the controller welds
it to the palm for a rigid lift, and releases it on
place.