# Overview
[Asimov Firmware](https://github.com/asimovinc/asimov-firmware) runs on the [Motion Control Board](../../hardware/specs/the-brains). 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.
1. [Quick Start](quickstart) - Send commands in 5 minutes
2. [Examples](examples) - Copy-paste Python scripts
3. [Protocol Reference](protocol) - Message formats
## I want to run my own policy
1. [Custom Policy](policy) - ONNX model interface, observation/action format
## I want to modify the firmware
Start here if you're changing the control code itself.
1. [Firmware Internals](internals) - Threads, state, architecture
2. [Debugging](debugging) - Common issues
3. [C API Reference](api) - Doxygen documentation
## How It Works
```{mermaid}
flowchart TB
subgraph client["Your Code (Python, C++, etc.)"]
app[Application]
end
app -->|"UDP :8888
RobotCommand"| netrx
subgraph firmware["asimov_io (Motion Control Board)"]
netrx["netrx
100 Hz"] --> gapp[("g_app
(shared state)")]
gapp --> policy["policy
50 Hz
ONNX model"]
policy --> can
subgraph can["CAN Threads"]
can0["CAN 0
6 motors"]
can1["CAN 1
6 motors"]
end
can --> gapp
gapp --> nettx["nettx
100 Hz"]
end
can0 --> motors0["Left Leg
Motors"]
can1 --> motors1["Right Leg
Motors"]
nettx -->|"UDP :8889
RobotState"| telemetry["Telemetry
@ 100 Hz"]
style client fill:#e1f5fe
style firmware fill:#fff3e0
style can fill:#ffecb3
```