How it works
Dream-1 is a vision-language-action model. It never sees the simulator. Each request is camera frames, joint numbers and a sentence; each answer is the next 2.4 seconds of joint targets for both arms. The loop below runs until the trial ends. The box that's active right now is highlighted.
Request (what this sim sends)
| Key | Value |
|---|---|
prompt | The task in plain English |
image_window.top / left / right | 9 base64 JPEGs each, 320×176, oldest first |
state.arm_l.joint_pos, state.arm_r.joint_pos | 6 joint angles per arm, radians |
state.arm_l.gripper_pos, state.arm_r.gripper_pos | Gripper opening, 0 to 1 |
robot.arm, robot.exec_head, … | yam, joint: tells the server the body, so it computes hand poses from the joints itself |
Fine-tuned models use video.<role> and state.<part> keys instead. The live panel above shows exactly what goes out.
Response
| Key | Value |
|---|---|
q_l_chunk | 48 rows × 7: left arm joint targets, then gripper |
q_r_chunk | Same for the right arm |
The client blends each new chunk into the previous one so the arm never jumps. The sim plays every row, then sends the next request. Errors come back as codes: DA-1000 bad key, DA-2000 model warming up or busy, DA-4000 malformed request.
FANUC env: bring your own arm
The FANUC CR-7iA/L cell is not a YAM, so it asks the model in hand-pose mode (robot: other_embodiment). It sends state.right_eef_xyz (m), state.right_eef_rot6 (first two columns of the tool rotation), state.right_grip, zeros for the joints, and a fixed idle pose for the missing left arm. The model then reads only the cameras and the prompt, and answers 48 hand poses (action.right_eef_xyz / rot6 / grip). Our IK turns them into the FANUC's 6 joints. A grip below 0.5 switches the magnet on.
Plugging in another simulator
Anything that can render RGB frames and set joint targets works: Isaac, Genesis, PyBullet, a real robot. The API only sees this data. Whether the model succeeds there depends on how close the arm and camera views are to what it was trained on.