Skip to main content
Rust Python License: MIT Platforms GitHub Release Unified CAN motor control stack with a vendor-agnostic Rust core, stable C ABI, and Python/C++ bindings.
Chinese version: README.zh-CN.md

Companion Repos

motorbridge-studio evolves independently of this docs site. For its changelog, capabilities, and release notes, see the studio repository directly.

Transport Legend

  • [STD-CAN]: classic CAN path (socketcan/pcan)
  • [CAN-FD]: dedicated FD path (socketcanfd)
  • [DM-SERIAL]: Damiao serial-bridge path (dm-serial)
Current status:
  • [CAN-FD] has been integrated as an independent transport path.
  • No motor model is officially marked as CAN-FD validated in this repository yet.

Current Vendor Support

  • Damiao:
    • models: 3507, 4310, 4310P, 4340, 4340P, 6006, 8006, 8009, 10010L, 10010, H3510, G6215, H6220, JH11, 6248P
    • modes: scan, enable, disable, MIT, POS_VEL, VEL, FORCE_POS, set-id, set-zero
  • RobStride:
    • models: rs-00, rs-01, rs-02, rs-03, rs-04, rs-05, rs-06
    • modes: scan, ping, enable, disable, MIT, POS_VEL, VEL, parameter read/write, set-id, zero
    • host/feedback default: 0xFD (with 0xFF/0xFE fallback probing)
    • model selection is required for real hardware use: use the actual rs-00..rs-06 model for limits/logging; parameter read/write uses the common RobStride section 4 runtime table
    • note: torque/current control is currently parameter-level only (write-param on iq_ref/limits), not a first-class unified mode
  • MyActuator:
    • models: X8 (runtime string; protocol is ID-based)
    • modes: scan, enable, disable, stop, set-zero, status, current, vel, pos, version, mode-query
  • HighTorque:
    • models: hightorque (runtime string; native ht_can v1.5.5)
    • modes: scan, read, mit, pos-vel, vel, stop, brake, rezero
  • Hexfellow:
    • models: hexfellow (runtime string; CANopen profile)
    • modes: scan, status, enable, disable, pos-vel, mit (via socketcanfd)

Update (2026-04): Damiao / RobStride Capability Convergence

  • Damiao production baseline now covers: scan / enable / disable / MIT / POS_VEL / VEL / FORCE_POS / set-id / set-zero.
  • RobStride production baseline now covers: scan / ping / enable / disable / MIT / POS_VEL / VEL / parameter read-write / set-id / zero.
  • RobStride RS00-RS06 keep the same unified control command shape. Runtime parameter read/write uses the common section 4 table (0x7005..0x702E); --model remains the physical model hint for limits/logging.
  • RobStride default host/feedback path is 0xFD; scan now tries 0xFD,0xFF,0xFE,0x00,0xAA by default.
  • RobStride feedback_id / host_id is host-side addressing, not the motor device_id; scan hits report the motor ID as probe / device_id.
  • In RobStride pos-vel, --vel/--kd/--tau are intentionally ignored and reported as warnings (no hard error).

Architecture

Layered Runtime View

Workspace Topology (Latest)

Python Binding Surface (v0.1.7+)

Quick Start

Build:
Bring up CAN:
Quick CAN restart (Linux):
Damiao CLI:
[STD-CAN] Hexfellow CLI:
[CAN-FD] RobStride CLI:
For RobStride, replace --model rs-06 with the actual motor model (rs-00 through rs-06) for limits/logging. read-param / write-param uses the common section 4 runtime table. HighTorque CLI (native ht_can v1.5.5):
RobStride CLI parameter read:
MyActuator CLI:
Unified scan (all vendors):
Focused RobStride scan (Rust CLI and Python CLI use the same host-id defaults):

Experimental Windows Support (PCAN-USB)

Linux remains the primary target. Windows support is experimental and currently backed by PEAK PCAN (PCANBasic.dll).
  • Install PEAK PCAN driver + PCAN-Basic runtime on Windows.
  • Channel mapping:
    • can0 -> PCAN_USBBUS1
    • can1 -> PCAN_USBBUS2
  • Optional bitrate suffix: @<bitrate> (for example can0@1000000).
Validation commands on Windows:

macOS PCAN Runtime (PCBUSB)

This project supports PCAN on macOS via MacCAN’s PCBUSB runtime. On macOS, PCANBasic.dll is not used.

1. Prerequisites

Use the helper script from repo root:
If you use --user-local, run motor_cli with:

3. Manual install PCBUSB (system-wide)

If you want to download manually first:
Then install:
The installer places:
  • libPCBUSB.dylib into /usr/local/lib
  • PCBUSB.h into /usr/local/include

4. Optional user-local install (no sudo)

If your user cannot write to /usr/local, use a local runtime path:
Then run motor_cli with:

5. Verify runtime loading

If using user-local install:

6. Build motorbridge CLI

7. Channel mapping on macOS (PCAN backend)

  • can0 maps to PCAN_USBBUS1
  • can1 maps to PCAN_USBBUS2
  • Optional bitrate suffix is supported (example: can0@1000000)

8. Scan motors (Damiao)

If using user-local PCBUSB:

9. Control example (Damiao MIT)

Replace motor-id and feedback-id with your scan hits.

10. Troubleshooting

  • load PCBUSB failed ...:
    • Install PCBUSB with install.sh, or export DYLD_LIBRARY_PATH for local install.
  • No CAN backend for current platform:
    • Use a build that includes the macOS PCAN backend.
  • hits=0 on scan:
    • Check wiring, power, termination resistor, and CAN bitrate.

Linux USB-CAN (slcan) Quick Guide

Linux uses SocketCAN interface names directly (for example can0, slcan0). Do not pass bitrate suffix in Linux channel names (for example can0@1000000 is invalid on Linux SocketCAN). Bring up an slcan adapter as slcan0:
Then use slcan0 as CLI channel:

Damiao Dedicated CAN-FD Transport (socketcanfd)

Use this Linux-only transport when you want an independent CAN-FD path without changing existing classic CAN or dm-serial behavior.
[CAN-FD] (transport integrated; motor verification matrix pending)

Damiao Serial Bridge Quick Guide (dm-serial)

Use this path only when your Damiao adapter exposes a serial bridge (for example /dev/ttyACM1) and you want to run Damiao through that private transport:
[DM-SERIAL]

CAN Debugging (Professional Playbook)

For deterministic troubleshooting of Linux slcan and Windows pcan, use: Interpretation:
  • vendor=damiao id=<n> means one Damiao motor is online at motor ID <n>.
  • vendor=robstride ... probe=<n> ... device_id=<n> means one RobStride motor responded at motor/device ID <n>.
  • In RobStride output, feedback_id / host_id such as 0xFD or 0xFE is not the motor ID.
  • vendor=hightorque ... [hit] id=<n> ... means one HighTorque motor responded via native ht_can v1.5.5.
  • vendor=myactuator id=<n> means one MyActuator motor responded.
  • hits=<k> at the end of each scan block is the count of discovered devices.

ABI and Bindings

  • C ABI:
    • motor_controller_new_socketcan(channel)
    • motor_controller_new_dm_serial(serial_port, baud) (Damiao-only serial bridge; cross-platform, e.g. /dev/ttyACM0 or COM3)
    • Damiao: motor_controller_add_damiao_motor(...)
    • Hexfellow: motor_controller_add_hexfellow_motor(...) (CAN-FD path via socketcanfd)
    • RobStride: motor_controller_add_robstride_motor(...)
    • MyActuator: motor_controller_add_myactuator_motor(...)
    • HighTorque: motor_controller_add_hightorque_motor(...)
  • Python:
    • Controller(channel="can0")
    • Controller.from_dm_serial("/dev/ttyACM0", 921600) (Damiao-only)
    • Controller.add_damiao_motor(...)
    • Controller.add_hexfellow_motor(...)
    • Controller.add_robstride_motor(...)
    • Controller.add_myactuator_motor(...)
    • Controller.add_hightorque_motor(...)
  • C++:
    • Controller("can0")
    • Controller::from_dm_serial("/dev/ttyACM0", 921600) (Damiao-only)
    • Controller::add_damiao_motor(...)
    • Controller::add_hexfellow_motor(...)
    • Controller::add_robstride_motor(...)
    • Controller::add_myactuator_motor(...)
    • Controller::add_hightorque_motor(...)
Unified mode IDs for ABI/Bindings (ensure_mode):
  • 1 = MIT
  • 2 = POS_VEL
  • 3 = VEL
  • 4 = FORCE_POS
Unified control units:
  • position: rad
  • velocity: rad/s
  • torque: Nm
Vendor-specific protocol naming/mapping and unsupported operations are documented in: RobStride-specific ABI/binding helpers include:
  • robstride_ping
  • robstride_set_device_id
  • robstride_get_param_*
  • robstride_write_param_*

Example Entry Points

  • Cross-language index: examples/README.md
  • C ABI demo: examples/c/c_abi_demo.c
  • C++ ABI demo: examples/cpp/cpp_abi_demo.cpp
  • Python ctypes demo: examples/python/python_ctypes_demo.py
  • Python SDK docs: bindings/python/README.md
  • C++ binding docs: bindings/cpp/README.md

Release and Package Matrix

A) GitHub Releases (binary assets)

B) PyPI / TestPyPI (Python package channel)

Install from PyPI:
Fallback source install:

C) Functional Scope by Distribution Type

D) Additional Automated Distribution Channel

Notes:
  • .deb is currently Linux x86_64 oriented; other Linux targets should use ABI .tar.gz.
  • macOS x86_64 wheels are intentionally not produced in current matrix.
  • Device matrix reference: docs/en/devices.md.
  • Distribution channel automation guide: docs/en/distribution_channels.md.