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.

  1. Quick Start - Send commands in 5 minutes

  2. Examples - Copy-paste Python scripts

  3. Protocol Reference - Message formats

I want to run my own policy

  1. Custom 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 - Threads, state, architecture

  2. Debugging - Common issues

  3. 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