X-Trainer平台刚性物体操作实践
ALOHA系统
X-Trainer平台实际上是一个ALOHA(A Low-cost Open-source Hardware System for Bimanual Teleoperation)即低成本开源双手遥操作系统。
其创新设计实现了在成本仅为传统系统(如Da Vinci手术机器人)的1/10的情况下,仍然能支持毫米级精密操作。
硬件设计基于双机映射原理:操作者拖动"领导臂","跟随臂"实时镜像动作并记录关节角。
此外"手柄-剪刀"的执行机构设计可以有效降低操作力度要求,并且可以实现夹爪开合角度的连续控制而非二进制开合。
同时搭载4路RGB相机(顶部+正面静态视角 + 双腕部移动视角),有效解决了不透明物体遮蔽和透明物体的感知难题。
工作原理:
graph TB A[操作者拖动领导臂] --> B{关节角度传感器} B --> C[Joint-Space映射算法] C --> D[PID控制器] D --> E[跟随臂实时镜像] E --> F[四路摄像头监控] F --> G[操作者视觉反馈]
ACT算法
ACT(Action Chunking with Transformers)是一种创新的模仿学习算法,专门解决精细操作中的两大核心问题:误差累积和非马尔可夫行为。
1. 算法核心设计
(1) 动作分块(Action Chunking)
- 问题:传统单步预测中,毫米级误差会随时间累积(如抓歪1mm → 后续插入失败)
- 方案:一次性预测未来k步动作序列(而非单步)
- 数学表达:
\( \pi_{\theta}(a_{t:t+k}|s_t) \) 取代 \( \pi_{\theta}(a_t|s_t) \) - 效果:任务步长缩短k倍,误差累积降低80%(实验验证)
(2) 时序集成(Temporal Ensembling)
- 问题:动作分块导致轨迹阶跃式更新(机器人运动卡顿)
- 方案:高频查询策略 + 重叠动作加权平均
- 权重公式: \( w_i = \exp(-m \cdot i) \) (指数衰减)
- 例:k=100时,每步融合5个重叠预测
- 效果:动作平滑度提升40%(对比无集成方案)
(3) 条件变分自编码器(CVAE)
- 问题:人类演示存在多模态行为(同一场景不同操作路径)
- 方案:
- 训练阶段:编码器压缩动作序列→隐变量z
- 推理阶段:丢弃编码器,z=0时解码生成动作
2. 网络架构详解
(1) 输入层
- 4路RGB图像(480×640):
- 顶部/正面静态摄像头
- 双腕部移动摄像头
- 关节位置:14维(双臂7+7自由度)
- 隐变量z:32维(训练时由编码器生成)
(2) 特征提取
- 图像编码:ResNet18 → 15×20×512特征图
- 位置编码:2D正弦位置嵌入(保留空间信息)
- 特征融合:4摄像头特征拼接(1200×512) + 关节位置 + z → 1202×512序列
(3) Transformer结构
- 编码器:8层Transformer,聚合多模态输入
- 解码器:4层Transformer,生成k步动作序列
(输出维度:k×14,对应双臂14关节目标位置)
3. 推理执行流程
graph TB A[获取当前状态 s_t] --> B[策略预测 a_t:t+k] B --> C{时序集成} C -->|加权平均| D[执行动作 a_t] D --> E[滑动窗口 t←t+1] E --> A
- 关键参数:k=100(约2秒动作序列)
- 执行频率:50Hz(每0.02秒执行一次)
- 耗时:单次推理10ms(RTX 2080 Ti)
4. 对比实验关键结果
任务 | ACT成功率 | 单步预测最优基线 |
---|---|---|
开拉链袋 (Slide Ziploc) | 88% | 0% |
插电池 (Slot Battery) | 96% | 0% |
开调料杯 (Open Cup) | 84% | 0% |
突破性优势:在透明物体(杯盖)、低对比度场景(黑色扎带)等挑战性任务中,ACT仍保持80%+成功率。
机械臂初始化
X-Trainer有4个机械手:2个主手和2个从手。
启动时需要将4个开关全部打开,其中2个从手上电后顶部环形灯会呈蓝色并持续闪烁,待其不再闪烁时代表从手启动完毕。
端口初始化
运行scripts\1_find_port.py
脚本,它会
- 自动扫描系统中所有可用的串口设备
- 智能识别并分配左右手控制器和夹爪的端口号
- 将发现的端口配置信息自动写入dobot_settings.ini配置文件
如果硬件设备与软件配置正确对应的话,运行后会输出Success信息,若有端口未正确配对,则会报错告知有几个端口配置失败。
经验
当有端口配置失败时,将机械手连接在电脑上的串口总线拔掉重新插上,一般就可以解决问题。
主从手同步姿态
运行scripts\3_just_buttonA.py
脚本,运行后可解锁并拖动主手。分别握住左右主手的末端手柄并短按黄色按键解锁主手,拖动两个主手,直至主手姿态与从手的初始姿态相同,再次短按两个主手的黄色按键锁定主手,随后手动停止运行该脚本。
接下来运行scripts\2_gello_get_offset.py
脚本,将主手和从手的当前姿态设置为同步的基准值。
录制数据集
运行experiments\launch_nodes.py
脚本,开启从手的服务端进程,它会启动ZMQ服务器并提供网络通信接口。如果运行时报错诸如TCP/IP错误的问题,先检查来自机械手的网线是否正确插入主机,然后检查是否在使用示教程序后未将网络模式切换回TCP/IP二次开发。保持该脚本持续运行。
打开experiments\run_control.py
文件,根据实际要训练的任务修改Args
类中的project_name
(数据集名称),save_data_path
(数据集保存地址)也可以按需修改,然后保存并运行脚本(需要新开一个终端窗口),此时会上述指定地址下生成一个collect_data
文件夹,当按下主手上的录制按钮后,该文件夹会生成以当前时间戳命名的文件夹,里面将存储本次操作过程中机械手的姿态数据和4个(或3个)相机的图像数据。
危险
出于安全考虑,越疆针对遥操作设置了一些速度和操作位置相关的安全限制,触发这些限制会导致遥操作停止且台面上的指示灯亮红灯报警。此时需要停止后重新运行上述两个脚本使机械手回到初始位置。若机械臂与环境发生了碰撞导致无法自动回正,则需要利用示教软件手动纠正。
数据预处理
打开scripts\4_collect2train_data.py
文件,首先修改Args
类中的dataset_name
(数据集名称,与上面的project_name
相同)和task_name
(起一个任务名称)。
然后打开scripts\constants.py
文件,在SIM_TASK_CONFIGS
字典中新添加一个键值对,键为刚才设置的task_name
,值为一个字典,包含以下键值对:
键 | 含义 | 说明 |
---|---|---|
dataset_dir |
数据集存储的目录 | 指向要处理的数据集所在的地址 |
num_episodes |
数据集中的操作回合数 | 定义了你要从数据集中加载和处理多少个完整的操作回合 |
episode_len |
每个操作回合的长度 | 定义了每个回合被处理时的固定长度(时间步数) |
train_ratio |
训练集占比 | 保持默认即可 |
camera_names |
相机名称列表 | 保持默认即可 |
其中dataset_dir
指向数据集所在的地址,num_episodes
和episode_len
根据实际数据采集情况和任务耗时决定。
运行scripts\4_collect2train_data.py
脚本,它会将数据集中的数据按照指定格式转换为训练所需的格式,在数据集collect_data
目录下生成output_videos
和train_data
两个文件夹。
训练模型
首先打开ModelTrain\constants.py
文件,注意和数据预处理的constants.py
不是同一个文件。这里也是在TASK_CONFIGS
中新添加一个键值对,内容同scripts\constants.py
中添加的一致即可。
然后打开ModelTrain\model_train.py
文件,在arg_config()
中定义了一系列模型训练相关的参数。其中需要修改的一个是--ckpt_dir
,将default
设置为训练完成后输出模型的保存地址(自己起一个名字,与模型完成的操作任务有关即可)。另一个是--task_name
,将default
设置为刚才在ModelTrain\constants.py
中定义的键名即可。最后还有一个是--num_steps
,这是训练时的总迭代次数,默认为10000,可以根据实际情况调整。一般来讲,像叠衣服这样的柔性复杂任务往往需要100000甚至更多轮,而像抓取物块这样的刚性简单操作可能4000轮就能取得不错的效果。
根据实测,在RTX 4090显卡的加持下,50个操作回合的数据集训练4000轮的用时约为24分钟。
自主推理运行
打开experiments\run_inference.py
文件。修改其中的model_name
为模型训练时定义的输出文件夹中的ckpt
后缀文件,一般每训练2000轮后都会将当前模型状态保存为一个子模型,选择其中一个即可。而model
实例的ckpt_dir
参数也需要设置为训练完成后输出模型的保存地址。
随后先运行experiments\launch_nodes.py
脚本开启从手的服务端进程,保持该进程不动,再新开一个终端运行experiments\run_inference.py
脚本,此时机械手会自动初始化姿态并开始根据模型推理复现数据集中的操作。
该脚本中的控制框图为:
sequenceDiagram participant C as 摄像头线程 participant M as 主控制器 participant R as 机器人 participant A as AI模型 C->>M: 持续发送三路RGB图像 M->>R: 发送安全位置指令 R-->>M: 返回关节位置反馈 loop 每帧控制 M->>A: 提交(图像+关节数据) A-->>M: 返回预测动作 M->>安全系统: 动作安全检查 安全系统-->>M: 安全验证结果 alt 安全 M->>R: 执行动作指令 else 危险 M->>操作员: 请求确认 操作员-->>M: 响应指令 end R-->>M: 返回新关节状态 end M->>C: 发送停止信号