LeRobot.js
我一直认为机器人非常昂贵且极其难以使用。直到我开箱了我的第一台机器人SO-100,这种看法才彻底改变。结合Hugging Face的LeRobot Python库,我能够在几分钟内让我的机器人动起来,因为入门过程非常简单:
- 找到机器人连接到计算机的USB端口
- 校准每个关节,让机械臂学习其完整的运动范围
- 通过键盘或主机械臂遥控机械臂
一切正常,但有一件事一直困扰着我:我生活在JavaScript的世界里。为什么Web开发者仅仅因为原始工具是Python的就不能享受这种乐趣呢?所以我问自己:有什么能阻止我构建LeRobot.js,让任何人都能在JS中与机器人交互呢?而学习新事物(至少对我而言)最好的方法就是从头开始构建它。
LeRobot.js就是这样诞生的。

为什么要把LeRobot引入JS?
在我看来,机器人技术弥合了人工智能和现实世界之间的鸿沟,使人工智能能够超越屏幕。为了确保尽可能多的人能够真正表达他们对未来机器人的看法,我们需要跳出Python生态系统,提供让庞大的JS社区感到原生的工具。
因此,LeRobot.js的使命是直接的:同样的简洁性,同样的心智模型,只是用JavaScript实现。
如果你已经熟悉Python API,LeRobot.js应该会让你立刻感到熟悉。如果你先从JS开始,你也能无缝切换到Python,无需重新学习一切。
从Python到JavaScript
我首先重新实现了每个人第一天都会用到的必备功能:
行动 | Python | JavaScript |
---|---|---|
连接 | find_port() |
findPort() |
释放电机 (禁用扭矩) |
(校准时自动) | releaseMotors() |
校准 | calibrate(robot) |
calibrate({ robot }) |
遥控 | teleoperate(robot, calib) |
teleoperate({ robot, calibrationData }) |
为什么是releaseMotors()
?
在Python LeRobot中,当你进入校准时,电机扭矩会自动关闭。在浏览器中,我们将这一步骤作为显式辅助函数公开,以便你可以随时自由移动机械臂。
快速入门
LeRobot.js 目前以 `@lerobot/web`(Node/CLI 支持即将发布)的形式发布,并支持基于 Chromium 的浏览器中的 SO-100(因为我们需要 Web Serial 与电机交互,以及 Web USB 获取每个连接设备的序列号)。
但让我们看看这是如何工作的
import { findPort, releaseMotors, calibrate, teleoperate } from "@lerobot/web";
// 1. Find and connect to the hardware
const findProcess = await findPort();
const [robot] = await findProcess.result;
// 2. Disable torque so you can move joints by hand
await releaseMotors(robot);
// 3. Guide the arm through its full range to record min/max positions
const calibrationProcess = await calibrate({
robot,
onProgress: (msg) => console.log(msg),
onLiveUpdate: (data) => console.log("Live positions:", data),
});
calibrationProcess.stop();
const calibrationData = await calibrationProcess.result;
// 4. Control the arm with your keyboard
const teleop = await teleoperate({
robot,
calibrationData,
teleop: { type: "keyboard" },
});
teleop.start();
// 5. later → teleop.stop();
浏览器支持
- 基于Chromium的浏览器(如Chrome或Edge)版本89或更高(因为需要Web Serial)。
在线演示
立即在您的浏览器中尝试完整流程:https://huggingface.co/spaces/NERDDISCO/LeRobot.js
它允许您添加 SO-100(更多硬件将很快添加),校准它,然后使用键盘或 UI 控制它(更多遥控方式也将很快添加)。该空间还包含完整的文档和即将推出的路线图。

幕后
LeRobot.js 使用 TypeScript 构建,通过 Vite 打包,并在 GitHub 和 npm 上以 Apache 2.0 许可证发布。
演示 UI 是在 v0.dev 中使用 React、shadcn/ui 和 Tailwind 进行原型设计的。
路线图
我的目标是在 JS 中实现 LeRobot 的所有功能,但目前我专注于以下关键里程碑:
特性 | 描述 | 状态 |
---|---|---|
Node/CLI | 发布 @lerobot/node |
进行中 |
SO‑100 主机械臂 | 将主机械臂添加为从机械臂的遥控器 | 进行中 |
record() | 捕获轨迹和传感器数据 | 计划中 |
replay() | 回放录制片段 | 计划中 |
train() | 在录制数据上训练策略 | 计划中 |
eval() | 运行自主推理 | 计划中 |
如何提供帮助
目前,LeRobot.js 正式支持 SO-100。为了拓宽硬件覆盖范围,我需要:
- 拉取请求,添加新设备
- 获得额外机器人的访问权限,以便我能够测试并添加对新设备的支持
如果您有希望在这里看到的硬件,请开一个 issue 或在 LeRobot Discord 上私信我(我是 NERDDISCO)。
任何关于通过 ONNX 使训练/推理工作起来的帮助,都将不胜感激。
致谢
这一切都离不开这些人的支持和启发:
- Partabot - 感谢您提供 SO‑100 主从机械臂。
- Xenova - 感谢您创建 Transformers.js 并向世界展示机器学习可以在 JS 中和谐共存。
- BamBot - 感谢您证明浏览器优先的机器人控制是真实可行的。