跳到主要内容
Projects/SmolVLA 高反光与透明物体抓取复现教程:方案总览与核心改造 · 第 4 阶段

SmolVLA 高反光与透明物体抓取复现教程:方案总览与核心改造 · 第 4 阶段

基于双 奥比中光 相机、增强深度、B601-DM 主从臂和 SmolVLA,复现高反光桌面上透明瓶与香蕉模型的自主整理链路。

Apache-2.0 / MIT

01 / DOCUMENTATION 内容概述

系列教程第 4/7 阶段:完成主从臂校准、重力补偿遥操和夹爪映射,并建立电机失能、掉线与 episode 故障恢复机制。

02 / DOCUMENTATION 7.1 MotorBridge 不是can0

最初使用 SocketCAN 扫描时,can0 即使处于 ERROR-ACTIVE,也不代表 MotorBridge 后面的 7 个 DM 电机能够通过该接口直接响应。若机械臂使用 Seeed MotorBridge USB 串口,应该配置:

代码块
纯文本
transport = motorbridgeport      = /dev/ttyACM0 或 /dev/ttyACM1baudrate  = 921600

如果握手提示所有电机都不响应,优先检查端口、24 V、电源、急停、MotorBridge 和线束,而不是继续扩大 SocketCAN ID 扫描范围。

03 / DOCUMENTATION 7.2 校准主臂和从臂

将两条机械臂放到尽可能一致的安全零位:

代码块
Bash
lerobot-calibrate   --robot.type=rebot_b601_follower   --robot.port=/dev/ttyACM0   --robot.transport=motorbridge   --robot.id=b601_follower
lerobot-calibrate   --teleop.type=rebot_b601_leader   --teleop.port=/dev/ttyACM1   --teleop.transport=motorbridge   --teleop.id=b601_leader

如果遥操刚开始就频繁出现相对目标限幅,先比较两条机械臂的零位、关节方向和初始姿态。不要第一反应就把 max_relative_target 调得很大。

04 / DOCUMENTATION 7.3 重力补偿必须逐级测试

第一步只计算,不使能力矩:

代码块
Bash
python examples/rebot_b601_smolvla_record/debug_leader_gravity_comp.py   --port /dev/ttyACM1   --id b601_leader   --no-calibrate   --dry-run   --duration-s 5

第二步只开一个承重关节,并从小倍率开始。确认方向正确后,才运行整臂参数:

代码块
Bash
python examples/rebot_b601_smolvla_record/debug_leader_gravity_comp.py   --port /dev/ttyACM1   --id b601_leader   --no-calibrate   --enabled-joints joint_1,joint_2,joint_3,joint_4,joint_5,joint_6   --torque-scale 0.95   --torque-limit 8.0   --kp 1.9   --kd 0.75   --hz 100

如果抬起后缓慢下坠,可按以下顺序调试:

  1. 先确认重力方向和关节角零点正确。

  2. 小幅提高 torque_scale,不要越过已验证范围。

  3. kp 用于减小姿态漂移,过高会变得难拖。

  4. kd 用于抑制晃动,过高会有明显黏滞感。

  5. torque_limit 是安全上限,不是越大越有力越好。

05 / DOCUMENTATION 7.4 先不接相机做主从臂遥操

代码块
Bash
lerobot-teleoperate   --robot.type=rebot_b601_follower   --robot.port=/dev/ttyACM0   --robot.transport=motorbridge   --robot.id=b601_follower   --teleop.type=rebot_b601_leader   --teleop.port=/dev/ttyACM1   --teleop.transport=motorbridge   --teleop.id=b601_leader   --teleop.manual_control_mode=gravity_comp   --fps=30   --teleop_time_s=60

当前默认参数已经包含:

  • 主臂关节重力补偿 0.95 / 8.0 / 1.9 / 0.75。

  • 主臂夹爪张开偏置 0.09 Nm,总上限 0.15 Nm。

  • 主臂夹爪 kp=0、kd=0,避免位置弹簧与人手对抗。

  • 主臂端点 5 → -310 映射到从臂端点 10 → -320。

  • 从臂夹爪物理范围 -330 → 10。

06 / DOCUMENTATION 7.5 夹爪映射不对怎么办?

先直接测试从臂,不经过主臂映射:

代码块
Bash
python examples/rebot_b601_smolvla_record/debug_follower_gripper_command.py   --port /dev/ttyACM0   --target -320   --min-pos -330   --max-pos 10

再测试闭合和软物体接触:

代码块
Bash
python examples/rebot_b601_smolvla_record/debug_follower_gripper_command.py   --port /dev/ttyACM0   --target 10   --duration-s 6   --control-mode torque_limited_close   --close-torque 1.0   --hold-torque 0.30

如果直接命令能到达全行程,而遥操不能,问题是映射或相对限幅;如果直接命令也到不了,检查机械限位、方向、线束、增益和电机状态。

07 / DOCUMENTATION 为什么从臂会突然失能坠落?⚠️

B601-DM 电机失能、供电与命令流安全恢复
B601-DM 电机失能、供电与命令流安全恢复

这是整个项目最值得认真记录的一段。

08 / DOCUMENTATION 8.1 不要把所有失能都叫“奇异点”

主从臂姿态差异不大时,从臂仍可能失能。后来通过我的调试日志证明,问题可能来自完全不同的层面:

  • MotorBridge 命令流被相机、写盘或视频编码阻塞。

  • 从臂 24 V 电源压降、插座接触或电源限流。

  • MotorBridge、急停链路或固件 watchdog。

  • 运动到某个区域时,数据线被夹住、急弯或拉扯。

  • 夹爪长时间高刚度顶住物体。

  • 单个驱动器保护,或多个驱动器共同变为 DISABLED。

软件状态 0x0 只表示驱动器现在已经 DISABLED,并不能完整保留之前究竟是欠压、通信丢失还是保护动作。要用时间相关日志判断,而不是只看最后一行。

09 / DOCUMENTATION 8.2 独立 500 Hz 命令流

当前代码持续输出每个 MotorBridge stream 的:

  • 当前命令年龄。

  • 有效发送频率。

  • 完整 7 电机批次最大耗时。

  • 历史最大 gap 及发生距今时间。

  • 最近一次告警 gap 距今时间。

  • 当前目标位置。

  • 连续发送失败与反馈丢失计数。

使用下面的脚本验证“主线程故意暂停 5 秒时,从臂是否仍被高频线程稳稳保持”:

代码块
Bash
python examples/rebot_b601_smolvla_record/debug_follower_command_stream.py   --port /dev/ttyACM0   --duration-s 20   --stall-s 5   --stream-hz 500

10 / DOCUMENTATION 8.3 多个关节一起DISABLED

如果命令流当前年龄很小、发送频率接近 500 Hz,但多个驱动仍一起 DISABLED,优先排查:

  1. 从臂 24 V 电源和电流余量。

  2. 两台机械臂是否共用接触不良的插排。

  3. 急停链路和 MotorBridge 固件。

  4. 串口线、臂内 CAN/数据线和连接器。

  5. 运动范围内是否存在压线点。

一次现场排查中,把两台机械臂电源改接到独立供电后,程序维持时间明显变长;另一个高风险点是从臂运动时数据线会被结构压迫。这两个现象都不是最终定论,但足以把电源和线束提升为最高优先级检查项。

11 / DOCUMENTATION 8.4 只剩夹爪DISABLED

这通常更像局部机械负载、夹爪线束或驱动器保护。当前限力闭合控制正是为减少持续堵转而加入。不要通过无限提高力矩掩盖问题。

12 / DOCUMENTATION 8.5 episode 故障恢复

采集开始时记录从臂初始姿态。如果安全限幅被触发:

  1. 当前 episode 标记为重采。

  2. 从臂按每步 1.5°、20 Hz、低增益回到起始姿态。

  3. 等待操作者把主臂放回起始姿态附近。

  4. 清空未完成 episode buffer。

  5. 从同一个 episode 重新开始。

驱动器已经报告异常或通信已经不健康时,代码不会自动重新使能。这是有意的安全选择。

硬件

软件应用和在线服务

实现步骤

01

确认 MotorBridge 串口

使用稳定的 /dev/serial/by-id 识别主臂和从臂,不将串口桥误当板载 can0

02

校准主从臂

分别完成关节方向、零位、范围和主从映射检查

03

逐级测试重力补偿

从低增益与物理支撑开始,逐步验证主臂六关节重力前馈和阻尼

04

不接相机测试遥操

先隔离机械臂链路,确认 7 维目标、相对限幅和运动方向正确

05

验证夹爪映射

检查主臂夹爪坐标到从臂坐标的映射、力矩上限和接触保持

06

建立独立 500 Hz 命令流

让采集线程只更新目标,高频线程持续发送最近一次完整电机命令

电机命令流、供电和失能故障示意
电机命令流、供电和失能故障示意
07

处理关节失能与掉线

区分整臂 DISABLED、单夹爪 DISABLED、供电压降、watchdog 和线束问题

08

验证 episode 故障恢复

安全中止、保持当前姿态、从臂低速回起点,并等待主臂回到起始姿态

项目结果

SmolVLA 高反光与透明物体抓取复现教程:方案总览与核心改造 · 第 4 阶段 项目结果
SmolVLA 高反光与透明物体抓取复现教程:方案总览与核心改造 · 第 4 阶段

完成 B601-DM 主从臂校准、重力补偿、无相机遥操和夹爪映射。通过独立高频命令流、状态检查和 episode 恢复降低相机处理或写盘阻塞导致的失能风险,并保留急停与物理支撑作为最终安全边界。

Bladewin Smith
我成功复现了

评论

0 comments