LeRobot documentation

YAM

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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 follower arm with the linear gripper YAM Cell bimanual station

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 会在关闭扭矩前提示您托住机械臂。

YAM arm in its folded position Linear DM4310 gripper

折叠位置,所有关节均为零(左),以及线性 DM4310 夹爪(右)。图片由 I2RT Robotics 提供。

单臂
两个分支
lerobot-calibrate --robot.type=yam_follower --robot.port=can0 --robot.id=yam

在后续命令中使用相同的 --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_degreestrue角度和 0–100 夹爪;false 表示弧度和 0–1
use_velocity_and_torquefalse添加 .vel 和 .torque 观测值
idle_modeholdhold 保持当前仓位,或在未收到操作指令时 float
command_timeout_s1.0进入空闲模式前未执行任何操作的秒数
initial_position_deg全零必需的初始位置;None 将跳过检查
initial_tolerance_deg11.5与初始位置之间的允许距离
gripper_force_limit_n50.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 夹爪。

参考

Update on GitHub