Overview
Asimov Firmware runs on the Motion Control Board. It talks to motors over CAN, runs the RL policy, and streams telemetry over UDP.
You send protobuf commands, it moves the robot.
I want to control the robot
Start here if you’re writing a Python/C++ client to send commands.
Quick Start - Send commands in 5 minutes
Examples - Copy-paste Python scripts
Protocol Reference - Message formats
I want to run my own policy
Custom Policy - ONNX model interface, observation/action format
I want to modify the firmware
Start here if you’re changing the control code itself.
Firmware Internals - Threads, state, architecture
Debugging - Common issues
C API Reference - Doxygen documentation
How It Works
flowchart TB
subgraph client["Your Code (Python, C++, etc.)"]
app[Application]
end
app -->|"UDP :8888<br/>RobotCommand"| netrx
subgraph firmware["asimov_io (Motion Control Board)"]
netrx["netrx<br/>100 Hz"] --> gapp[("g_app<br/>(shared state)")]
gapp --> policy["policy<br/>50 Hz<br/>ONNX model"]
policy --> can
subgraph can["CAN Threads"]
can0["CAN 0<br/>6 motors"]
can1["CAN 1<br/>6 motors"]
end
can --> gapp
gapp --> nettx["nettx<br/>100 Hz"]
end
can0 --> motors0["Left Leg<br/>Motors"]
can1 --> motors1["Right Leg<br/>Motors"]
nettx -->|"UDP :8889<br/>RobotState"| telemetry["Telemetry<br/>@ 100 Hz"]
style client fill:#e1f5fe
style firmware fill:#fff3e0
style can fill:#ffecb3