# 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 ```