Koopman DCM

Learned divergent components of motion (DCMs) from the CoRL 2026 paper Koopman DCM: Unstable Eigenfunctions as Data-driven Representations for Legged Balancing. Each model is a DCM observable: a neural network that maps a short history of measurements and actions to the DCM, trained jointly with its natural frequency ω so that the DCM is an unstable eigenfunction of the Koopman operator.

Models

File Robot Control rate ω Paper results
dcm-cookie.onnx Cookie wheeled biped, real robot 100 Hz 3.873 rad/s Section 4: Table 1, Figure 2
dcm-pybullet-cookie.onnx Cookie wheeled biped in PyBullet 100 Hz 4.728 rad/s Table 2, Cookie wheeled biped
dcm-pybullet-g1.onnx Unitree G1 (29 DoF) in PyBullet, double support 240 Hz 1.906 rad/s Table 2, G1 humanoid

Training data for all models is in the dataset repository.

Cookie DCM

Inputs and outputs

Both Cookie models share the same inputs and outputs. The DCM is lateral, expressed in a normalized coordinate along the line between the two wheel contacts.

  • Input history, float32, shape [1, 120]: delay embedding over H = 10 steps, concatenated in chronological order as (y[k-10], u[k-10], ..., y[k-1], u[k-1], y[k]), where:
    • y (10 values) is the measurement:
      • joint angles of the 6 actuated joints, in rad, ordered [left_hip, left_knee, left_wheel, right_hip, right_knee, right_wheel];
      • CoM position in the anchor frame, centered at the midpoint between the two wheel contacts and aligned with the robot's heading, in m (3 values);
      • lateral CoM coordinate, normalized as above (1 value).
    • u (1 value) is the action: the commanded lateral ZMP, normalized as above.
  • Output dcm, float32, shape [1]: the learned DCM ξ[k], normalized as above.

Usage

From the cookie_balancer directory of the code release, which downloads the models:

pixi run pybullet-balance  # balance in PyBullet, with a viser interface in the browser
pixi run evaluate-mpc      # Table 2 (Cookie wheeled biped), with dcm-pybullet-cookie.onnx
pixi run real-balance      # balance the real robot, switching DCMs with the joystick

G1 DCM

Inputs and outputs

The DCM is lateral, expressed in a normalized coordinate along the line between the two feet.

  • Input history, float32, shape [1, 373]: delay embedding over H = 10 steps, concatenated in chronological order as (y[k-10], u[k-10], ..., y[k-1], u[k-1], y[k]), where:
    • y (33 values) is the measurement:
      • joint angles of the 29 actuated joints, in rad, in the order of actuated_joint_names in the robot description of the code release;
      • CoM position relative to the anchor point (low-pass filtered midpoint between the feet), in m, with world-aligned axes (3 values);
      • lateral CoM coordinate, normalized as above (1 value).
    • u (1 value) is the action: the commanded lateral ZMP, normalized as above.
  • Output dcm, float32, shape [1]: the learned DCM ξ[k], normalized as above.

Usage

From the g1_evaluation directory of the code release, to download the model and run the G1 evaluation of Table 2:

pixi run evaluate-mpc

Citation

@inproceedings{caron2026koopman,
    title = {Koopman {DCM}: Unstable Eigenfunctions as Data-driven Representations for Legged Balancing},
    author = {Caron, St{\'e}phane},
    booktitle = {Conference on Robot Learning (CoRL)},
    url = {https://openreview.net/pdf?id=mday00WZFr},
    month = nov,
    year = {2026},
}
Downloads last month

-

Downloads are not tracked for this model. How to track
Video Preview
loading

Dataset used to train stephane-caron/koopman_dcm

Paper for stephane-caron/koopman_dcm