LeRobot documentation
YAM
YAM
YAM 是 I2RT Robotics 推出的一款用于模仿学习和具身智能的 6 自由度机械臂。在 LeRobot 中,yam_follower 用于驱动配备线性 DM4310 夹爪的单支标准 YAM v1 机械臂,而 bi_yam_follower 用于驱动两支。请配合 lerobot-calibrate、lerobot-rollout 和 lerobot-replay 使用。LeRobot 目前尚无 YAM 主臂,因此 YAM 机械臂由策略驱动,或通过重放数据集来驱动。
按照 I2RT 的指南组装并连接机械臂;本页介绍 LeRobot 部分。
| 指南 | 涵盖内容 |
|---|---|
| YAM 机械臂系列 | 开箱、安装、接线、电机和夹爪 |
| 软件配置 | CAN 适配器、比特率和固定接口名称 |
| YAM 单元 | 配备两个跟随者和领导者的双手操作站 |

YAM 跟随器(左)和 YAM Cell 双手操作站(右)。LeRobot 驱动跟随器。图片由 I2RT Robotics 提供。
硬件与安全
每条机械臂有七个电机,ID 为 1 到 7:关节 1 到 3 使用 DM4340,关节 4 到 6 以及夹爪使用 DM4310。YAM Pro、Ultra、BIG YAM 以及其他夹爪目前尚不支持。
您需要:
- Linux, and one USB-to-CAN adapter per arm (SocketCAN, classic CAN at 1 Mbit/s).
- 每个电机的 CAN 超时时间设置为最多 400 毫秒(
8000个 tick,即 I2RT 的值),例如使用 I2RT SDK 中的set_timeout.py --timeout。如果 LeRobot 停止发送命令,该超时机制是最后的保障措施,因此 LeRobot 在未设置该超时的情况下不会启用扭矩。 - 首次连接时需要访问互联网:重力补偿功能会从
lerobot/robot-urdfs存储桶下载 YAM 模型,并将其缓存到HF_LEROBOT_HOME/robot-urdfs/yam/v1下。
将机械臂固定到稳定的表面上,并确保其工作区域畅通无阻。断开连接会禁用扭矩,机械臂将在重力作用下掉落:请先支撑住它。如果在运行过程中电源或 CAN 适配器断开,请停止程序,支撑住机械臂,然后重新连接。
安装 LeRobot 🤗
按照安装指南操作,然后安装 YAM 支持:
pip install -e ".[yam]"这将为机械臂安装 motorbridge 和 python-can,并为重力补偿安装 placo。
连接硬件
每条机械臂都需要自己的 CAN 接口,因为两条机械臂使用了相同的电机 ID。
lerobot-setup-can --mode=setup --interfaces=can0 --use_fd=false对于双臂,请使用 --interfaces=can0,can1。该命令会通过 sudo ip link 配置 Linux 接口,且不会发送任何电机指令。在双臂情况下,重启后 can0 和 can1 可能会互换:请检查每个接口驱动的是哪只手臂,或者使用 I2RT 的 软件设置 为它们指定固定名称(例如 can_follower_l),并在端口中使用这些名称。
设备类型
| 类型 | 设备 |
|---|---|
yam_follower | 单个跟随者 |
bi_yam_follower | 双手跟随 |
对于双臂,使用 --robot.left_arm_config.<option> 和 --robot.right_arm_config.<option> 分别设置每个手臂的选项。
校准
校准仅测量夹爪的极限位置,即完全闭合和完全张开:各关节保持出厂时的零点。请先将机械臂折叠,如下图所示。测量期间扭矩处于关闭状态:请托住机械臂,仅用手移动夹爪,并在每个提示处按 Enter。如果已存在校准数据,连接后将直接启动控制:按 Enter 以复用现有校准,或输入 c 重新测量,LeRobot 会在关闭扭矩前提示您托住机械臂。

折叠位置,所有关节均为零(左),以及线性 DM4310 夹爪(右)。图片由 I2RT Robotics 提供。
lerobot-calibrate --robot.type=yam_follower --robot.port=can0 --robot.id=yam
首先测量左侧夹爪,然后测量右侧夹爪,分别写入 <id>_left 和 <id>_right 文件。
lerobot-calibrate --robot.type=bi_yam_follower --robot.id=bimanual_yam \ --robot.left_arm_config.port=can0 --robot.right_arm_config.port=can1
在后续命令中使用相同的 --robot.id,以便 LeRobot 加载已保存的文件。
观察与操作
一只手臂包含从 joint_1.pos 到 joint_6.pos 的关节,然后是 gripper.pos,用于观测和动作。关节为以度为单位的绝对角度,夹爪范围从 0(闭合)到 100(张开)。use_degrees=false 会切换为弧度制和 0 到 1 的范围,与 I2RT 和 MolmoAct2 数据一致。use_velocity_and_torque=true 会添加 .vel 和 .torque 观测。动作为绝对关节目标值,并被裁剪至关节限位范围内。
两条机械臂使用相同的名称,并带有 left_ 和 right_ 前缀。安装在机械臂上的相机也会加上前缀,而顶层的 --robot.cameras 则保留其原始名称。
运行策略
在连接之前,请将机械臂置于折叠位置,使所有关节角度均为零:LeRobot 会检查每个关节是否与该位置偏差在 11.5° 以内,然后从测量到的位置开始控制。在策略发出动作之前,机械臂不会移动。
lerobot-rollout \
--robot.type=yam_follower --robot.port=can0 --robot.id=yam \
--robot.cameras='{"wrist": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}}' \
--policy.path=<user>/<policy> \
--task="Pick up the cube"对于双臂,请使用 --robot.type=bi_yam_follower --robot.id=bimanual_yam --robot.left_arm_config.port=can0 --robot.right_arm_config.port=can1。添加 --dataset.repo_id=<user>/rollout_<name> 以记录 rollout;请参阅 运行推理并评估您的策略。lerobot-replay 会使用相同的 --robot.* 选项重放已记录的 episode。
在第一个动作之前,以及当在 command_timeout_s(1 秒)内没有收到任何动作时,机械臂会保持当前位置。如果设置 idle_mode=float,则关节会进行重力补偿并施加轻微阻尼,以便您可以手动移动机械臂,同时夹爪保持其开合状态;跟踪将从您移动到的位置恢复。
安全性
- 电机故障或缺失反馈会停止所有命令。对于双臂系统,任一臂发生故障都会导致两臂均停止。请断开并重新连接以继续操作。
- 重力模型涵盖了不带相机或负载的标准机械臂。添加其中任意一项后,请检查机械臂在浮动模式下是否发生漂移,如有漂移,请调整
gravity_factors。
配置选项
| 选项 | 默认 | 描述 |
|---|---|---|
port | 必需 | SocketCAN 接口,例如 can0 |
use_degrees | true | 角度和 0–100 夹爪;false 表示弧度和 0–1 |
use_velocity_and_torque | false | 添加 .vel 和 .torque 观测值 |
idle_mode | hold | hold 保持当前仓位,或在未收到操作指令时 float |
command_timeout_s | 1.0 | 进入空闲模式前未执行任何操作的秒数 |
initial_position_deg | 全零 | 必需的初始位置;None 将跳过检查 |
initial_tolerance_deg | 11.5 | 与初始位置之间的允许距离 |
gripper_force_limit_n | 50.0 | 夹爪被物体卡住时的手指力 |
gravity_factors | [1.0, 1.1, 1.1, 1.2, 1.0, 1.0] | 重力补偿的每个关节乘数 |
cameras | {} | 安装在机械臂上的相机 |
示例:MolmoAct2
lerobot/MolmoAct2-BimanualYAM-LeRobot 是 allenai/MolmoAct2-BimanualYAM 的 LeRobot 格式版本,并附带其发布的归一化统计信息。该模型在两条 YAM 机械臂上训练,关节角度以弧度为单位,夹爪开合度范围为 0–1,并使用了三台相机,顺序依次为顶部、左侧、右侧;详见 MolmoAct2。
pip install -e ".[yam,molmoact2,dataset]"
lerobot-rollout \
--robot.type=bi_yam_follower --robot.id=bimanual_yam \
--robot.left_arm_config.port=can0 --robot.right_arm_config.port=can1 \
--robot.left_arm_config.use_degrees=false --robot.right_arm_config.use_degrees=false \
--robot.cameras='{
"top": {"type": "opencv", "index_or_path": "/dev/v4l/by-id/TOP_CAMERA", "width": 640, "height": 480, "fps": 30},
"left": {"type": "opencv", "index_or_path": "/dev/v4l/by-id/LEFT_CAMERA", "width": 640, "height": 480, "fps": 30, "fourcc": "MJPG"},
"right": {"type": "opencv", "index_or_path": "/dev/v4l/by-id/RIGHT_CAMERA", "width": 640, "height": 480, "fps": 30, "fourcc": "MJPG"}
}' \
--policy.path=lerobot/MolmoAct2-BimanualYAM-LeRobot \
--inference.type=rtc --inference.rtc.execution_horizon=20 --inference.queue_threshold=20 \
--device=cuda --interpolation_multiplier=2 \
--interactive=true --play_sounds=false \
--task="Pick up the red block and place it in the green bin"输入 /start 以运行策略,输入 /subtask <text> 以更改指令,输入 /reset 以返回初始位置,输入 /stop 以退出。返回过程持续固定时间,且 YAM 的速度限制仍然生效,因此远离初始位置的机械臂可能会提前停止。
Float 模式允许你从任意位置启动策略:添加 --robot.left_arm_config.idle_mode=float --robot.right_arm_config.idle_mode=float。在首次执行 /start 之前,以及在 /reset 完成后的 1 秒内,手动将机械臂移动到你想要的位置,然后输入 /start 从该位置运行策略。不要为此使用 /stop:它会结束会话并禁用力矩。
故障排除
| 问题 | 检查 |
|---|---|
| CAN 接口缺失或已断开 | 检查适配器的电源和 USB 线缆,并运行 ip link show。再次运行 lerobot-setup-can。 |
missing or stale motor feedback | 检查 24 V 电源、CAN 接线和终端电阻、电机 ID 1 到 7,以及 port 是否为该机械臂的接口。 |
| 错误的臂移动 | 检查每个接口驱动的是哪个臂,或者为接口指定固定名称。 |
unsafe motor CAN timeout | 使用 I2RT SDK 将每个电机的 CAN 超时设置为最多 400 毫秒。 |
not within initial_tolerance_deg | 在连接之前,将机械臂折叠起来,使每个关节都归零。 |
| 连接时会要求你再次进行校准 | 使用与校准时相同的 --robot.id。 |
| 手臂在浮动模式下漂移 | 调整相机或机械臂上有效载荷的 gravity_factors。 |
| MolmoAct2 将手臂移动到了错误的位置 | 在两个臂上均设置 use_degrees=false:模型将使用弧度以及 0–1 夹爪。 |
参考
- YAM 机械臂系列:硬件、电机和夹爪
- 软件设置:CAN 比特率和固定接口名称
- YAM 单元:双手操作工位
- I2RT SDK:电动工具、URDF 和 MuJoCo 模型
- YAM 产品页面
- MolmoAct2:在 LeRobot 中加载策略