Skip to main content
The robot controllers are the friendliest way to drive a robot: call action methods to get descriptors, collect them in a list, and run(). Nothing executes until run().
Cadenza ships three robots. The legged robots (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 a Step. Pass speed, extension, distance_m, rotation_rad, or repeat where they apply.

G1 action methods

The G1 humanoid scripted runner currently executes stand, 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()

Two shapes:
When 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.
Each method returns an 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()

Opens the MuJoCo viewer and executes the 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/place all 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.

Demo: a pick-and-place routine