Skip to content
Interlock

Interlock

Safety layer for AI-driven SO-ARM101 robot arms

Created on 23rd October 2026

•

Interlock

Interlock

Safety layer for AI-driven SO-ARM101 robot arms

The problem Interlock solves

The problem

When you let an AI model control a real robot arm, nothing stops it from making a dangerous move. With the Seeed SO-ARM101 and its standard software (LeRobot, LeLab), every command goes straight to the motors. Nothing checks whether the move hits the table or overloads a servo, and a person has no STOP button to take control back.

On top of that, each program opens the arm's serial port by itself. Run two at once (an AI agent and a teleop script, say) and you get "Error: Port is in use". Almost every new owner sees this error first.

Cheap robot arms are spreading fast and AI models will control more and more of them (59 % of new industrial robots in 2025 were installed in China, IFR). They need an open safety layer.

What we built

Interlock is the only program connected to the arm. Every other program (a person's dashboard, an AI model, LeRobot) sends it requests, and Interlock checks each move before sending it to the motors. It has three layers: Core, Link and Console.

Who is in control: a person is in control when Interlock starts. Only a person can hand control to an AI. Anyone can press STOP, but only a person can restart the arm afterwards.

Features

Interlock Core — the program that owns the arm

Runs next to the arm, holds the serial port, and checks every request before the motors move.

Arm access

  • Only program connected to the arm, so "Port is in use" goes away.
  • One documented HTTP + WebSocket API for every client.
  • Reads every servo 20 times a second (angle, load, temperature).
  • Lends the arm to LeRobot for recording or teleop, then takes it back.

Who is in control

  • Control switch with four holders: person, AI agent, leader arm (teleop), or released to LeRobot.
  • A person is in control at start; only a person can hand control to an AI or take it back.
  • STOP from anyone; only a person can resume.
  • Local and remote AI agents: the local one goes first, and a person can block the remote one.

Move checks

  • Table check: refuses any move whose path comes within 1.5 cm of the table, and says by how much.
  • Contact check: freezes the arm when a servo's load or lag spikes during a move.
  • Joint limits: every target is clamped to the servo's safe range.
  • One move at a time: a second move while one is running is refused as "busy".
  • Torque-off guard: refuses to cut motor power while the arm is raised unless confirmed.
  • Unit and name checks: wrong units or unknown servo names are refused, not guessed.

Records and health

  • Every command and its result logged, one line each.
  • Demonstrations: record a task, then search, read and replay it; failures are kept too.
  • Servo temperature read every 2.5 s and logged every 10 s.
  • Fake-arm mode and 167 tests that run without hardware.

Interlock Link — the connection for AI models

An MCP server that lets any AI model drive the arm. Every tool goes through Core, so every check applies.

Access

  • 31 MCP tools: look, move, nudge, named poses, gripper, align, grasp, place, demos, stop, and more.
  • Works locally (stdio) and over the network (HTTP with a bearer token), e.g. an agent on a Raspberry Pi.

Seeing

  • Annotated gripper-camera view: 1 cm table grid, object sizes and positions.
  • A band showing what is between the jaws, so the AI can tell before it closes.
  • Object height measurement, so offsets stay right for objects standing on something.

Acting

  • Clear outcome on every call: ok, refused (with reason), frozen, not_aligned, touch, lost, empty, slipped.
  • Align-then-grasp: the gripper stays open unless the object is between the jaws.
  • Hold check: after lifting, the camera confirms the object is actually held.
  • Searchable demonstrations: the AI finds a past run of the same task and reuses its grasp height and steps.

Rules for the AI

  • Rules for each outcome (e.g. touch: report it, never repeat the move).
  • 3-try limit: after 3 failed grabs the AI must stop and ask a person.

Interlock Console — the web page for people

Opens in a browser at the arm's address, nothing to install. A person and the AI see the same data.

Watching

  • Live 3D model of the arm from the real part meshes, with angle, load and temperature on each joint.
  • Servo colour shows temperature; a ring shows load; a ghost shows where the arm is going.
  • Live gripper camera with the same grid and labels the AI sees.
  • Live log of every move result from every client, person or AI.

Controlling

  • Control switch: hand control to the AI, take it back, or block the remote agent.
  • STOP and Resume buttons.
  • Servo sliders, ±2° nudges, named poses, torque on/off.
  • Start and stop a demonstration recording.

Does it work?

On 23 October an AI model drove a real SO-ARM101 through Interlock for 8 hours:

  • 1,013 moves were sent, each logged with its result.
  • 43 moves were refused before the arm moved. 19 of them would have hit the table, the worst by 5 cm.
  • The AI never took control away from a person.
  • We then sent 28 bad commands on purpose (into the table, out of reach, a servo that does not exist). Interlock refused all 28.

How it fits with LeLab: LeLab trains a model. Interlock runs it safely on the real arm.

What we will release

All open source: Interlock Core (one documented API, 167 tests that run without an arm), Interlock Link (MCP tools plus rules for when the AI must stop and ask), Interlock Console (opens in a browser), servo temperature logs and a safe-use guide, the safety rules with tests that prove each one, and every test run record, failures included.

Not built yet: running a LeLab-trained model through Interlock with the same checks.

Challenges I ran into

  • The gripper closed beside the object, not on it. In one test the camera tracker followed the gripper's own white finger. We added a camera check of the area between the jaws: the tool now refuses to close (not_aligned) unless the object is between them.
  • A servo overheated. The elbow servo reached 71 °C, above its 70 °C limit. We stopped, let it cool to 36 °C, and added live temperature readings every 2.5 s, logged every 10 s. In 3 hours of logs, the shoulder servo (which holds the arm up) stays at about 39 °C during steady work.
  • Programs fought over the serial port. We made Interlock Core the only owner of the port and had it lend the arm to LeRobot on request.
  • Incomplete logs. Not every run that day was logged, so we report only what the log shows (1,013 moves, 43 refused) and no success rate.

Discussion

Builders also viewed

See more projects on Devfolio