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).
- joint angles of the 6 actuated joints, in rad, ordered
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_namesin 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).
- joint angles of the 29 actuated joints, in rad, in the order of
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},
}