Skip to content

NORI MotorLab — open-source Feetech servo tool

MotorLab is a browser-based workspace from Nori Robotics (YC S26) for testing, configuring, and characterizing 12V Feetech STS3215/STS3250/STS3095 half-duplex bus servos — the servos underneath low-cost open-source robot arms like LeRobot’s SO-100/SO-101, Koch, and many follower/leader teleoperation rigs. It runs as a local FastAPI service that talks to any pyserial-visible Feetech adapter (Waveshare Bus Servo Adapter A is tested but not required), exposes per-motor telemetry (position, current, estimated torque, temperature, voltage), and provides guarded EEPROM/ID/encoder-centering flows so users don’t brick motors during bring-up. MIT-licensed, no LeRobot/ML dependency, includes a --simulate mode for hardware-free CI.

  • Device-agnostic bring-up bench for SMS/STS bus servos: enumerates serial ports on Linux/macOS/Windows via pyserial, accepts any compatible half-duplex TTL adapter rather than hard-coding a particular USB bridge [§Install and run, §Connect a bus].
  • Read-only-by-default safety model: connect and scan never enable torque; EEPROM writes require torque off, explicit confirmation, and readback verification; disconnect and e-stop attempt to release every motor [§Safety first, §Persistent operations].
  • Guarded motor-ID station enforces exactly-one-responder discovery before writing an ID and unlocks normal Scan/Connect only after the operator physically unplugs the just-programmed motor, addressing the classic “two motors with the same ID” foot-gun during bus assembly [§Quick ID station].
  • Telemetry is honest about calibration limits: Present_Load is reported as |load| (Feetech’s uncalibrated 1000 raw = 100%), current uses the documented 6.5 mA/LSB scale, and torque is estimated from datasheet current-to-torque constants (STS3215/STS3250: 11 kgf·cm/A) with STS3095 explicitly disabled until a model-specific constant is verified [§Telemetry units].
  • Torque limit is exposed as an output cap, not a current command; rated markers are derived per model (STS3215 10/30 → 333 raw, STS3250 16/50 → 320 raw), and the UI additionally surfaces measured live/peak current because no fixed torque-limit-to-current mapping exists [§Telemetry units].
  • Ships a hardware-free --simulate mode and unit tests that never touch a serial port, plus a scripted 24-second launch demo (node scripts/capture_release_demo.mjs) that only runs against the simulator [§Install and run, §Tests, §Release announcement demo].

MotorLab is a Python 3.10–3.12 FastAPI application (app/) plus a static browser UI (static/) launched via python run.py, opening on http://127.0.0.1:8765. The server drives Feetech servos through a bundled feetech-servo-sdk wrapper (deliberately independent of LeRobot’s ML dependency stack), periodically re-runs read-only discovery so hot-plugged supported motors appear and removed motors time out, and exposes four operating modes per motor (angle, closed-loop velocity, open-loop drive, relative step). All mode changes require torque off followed by a readback; torque arming seeds a zero-motion command appropriate to the active mode before enabling output. Bus-wide jogs preflight every target against per-motor travel limits and reject the whole command if any motor would violate. The Quick ID Station is a separate workflow that owns the adapter exclusively, requires two matching discovery scans and exactly one supported responder before writing a new ID + verified default baud, then locks itself waiting for the operator to physically unplug the motor before the next assignment.

Not a benchmark — this is a hardware tool. The concrete deliverable is a working MIT-licensed cross-platform (Linux/macOS/Windows) web UI covering the full bring-up loop for 12V Feetech bus servos: scan → connect → per-motor telemetry & tuning → EEPROM edits → encoder centering → per-motor or bus-wide motion → CSV recording of position/target/velocity/effort/voltage/temperature/current/estimated-torque/status/torque-state under data/recordings/. Torque estimation is confirmed for STS3215 and STS3250 (using datasheet 11 kgf·cm/A) and explicitly deferred for STS3095 pending model-specific calibration.

MotorLab is infrastructure for the same low-cost open-source manipulation stack that keeps showing up in the wiki’s recent robotics ingest — the Feetech STS bus is what SO-100/SO-101 and many of the “cheap teleop rig” projects tracked by Aero Hand Open: low-cost, open-source, lightweight, anthropomorphic dexterous hand and LeRobot Sim-to-Real Tutorial — 72% real-SO-100 success from LuckyEngine sim demos only are built on, and the failure modes MotorLab guards against (mis-IDed motors, silent EEPROM corruption, torque-on-connect) are exactly the ones that make Sim2Real tutorials fragile in practice. It complements RAIDEN: A Toolkit for Policy Learning with YAM Bimanual Robot Arms (policy-learning toolkit for the higher-end YAM bimanual arm) at the opposite end of the price/precision axis: RAIDEN targets ML iteration on capable hardware, MotorLab targets safely getting the hardware to work on the cheapest widely-available bus servos. It also contrasts with AI Sapiens Open Source — ROBOTIS Docs Directory and Cyclo — ROBOTIS Open-Source Modular Physical AI Framework which push a vertically-integrated modular platform — MotorLab is intentionally device-agnostic on the adapter side and refuses to depend on LeRobot, positioning itself as tooling that any Feetech-based project can adopt independent of the ML stack above it.