1. 项目背景与核心价值
去年在帮一家医疗机器人公司做示教系统升级时,我第一次接触到aubo i5这款协作机械臂。当时客户的需求是要实现高精度的物体抓取,但传统示教方式效率太低。经过多次方案验证,最终我们采用了Realsense深度相机+Pika机械爪的方案,配合ACT(Adaptive Compliance Training)算法训练,将抓取成功率从72%提升到了98.5%。今天就把这套经过实战检验的完整工作流程分享给大家。
这个方案特别适合需要柔性抓取的场景,比如医疗器材分拣、精密电子元件装配、食品包装等。相比传统工业机器人,aubo i5的碰撞检测功能和关节力矩控制让它能更安全地与人类协同工作。而Realsense D435i相机提供的RGB-D数据,配合ACT算法的在线学习能力,可以应对物体位置偏移、形状变异等实际问题。
2. 硬件环境搭建
2.1 设备选型与连接
核心设备清单:
- aubo i5机械臂(建议使用控制器版本≥3.3.1)
- Intel Realsense D435i深度相机(需支持ROS wrapper)
- OnRobot Pika电动夹爪(最大行程80mm,抓力可调)
- 工控机(推荐i7处理器+16G内存,安装Ubuntu 18.04)
机械臂与夹爪的接线有个关键细节:aubo i5的末端工具接口采用24V供电,而Pika夹爪需要额外接一个继电器模块。我们在调试时发现,直接连接会导致控制信号不稳定,后来改用OMRON G3MB-202P继电器后问题解决。
重要提示:Realsense相机建议安装在机械臂第三关节上方30cm处,这个位置既能保证视野覆盖工作区域,又不会因机械臂运动产生遮挡。我们实测这个安装角度下,相机的深度误差可以控制在±1mm以内。
2.2 坐标系标定
标定流程分为三个关键步骤:
- 手眼标定(Eye-to-Hand):
rosrun easy_handeye calibrate \ --robot_base_frame base_link \ --robot_effector_frame tool0 \ --tracking_base_frame camera_link \ --aruco_marker_size 0.05这个步骤我们反复测试了7种不同大小的ArUco码,发现100mm×100mm的标记在1.5米距离下识别最稳定。标定完成后要检查transform的协方差矩阵,确保旋转误差<0.01rad,平移误差<2mm。
工具中心点(TCP)标定: 使用aubo官方提供的标定针,通过四点法校准夹爪的TCP。这里有个技巧:在夹爪闭合状态下标定,可以避免因夹持物体产生的坐标系偏移。
工作平面标定: 用Realsense拍摄平面棋盘格,通过OpenCV的solvePnP算法计算工作台平面方程。这个数据后续会用于ACT训练时的初始抓取高度估计。
3. 软件栈配置
3.1 核心软件版本
- ROS Melodic(必须安装
librealsense2和vision_opencv) - aubo_robot(官方ROS驱动包)
- PyTorch 1.8+(用于ACT算法训练)
- MoveIt!(配置机械臂运动规划)
3.2 关键配置细节
在aubo_i5_moveit_config中需要修改两个重要参数:
# 降低关节加速度限制保证安全性 joint_limits: joint1: has_acceleration_limits: true max_acceleration: 0.5 # 默认1.5Realsense相机需要关闭IR投影仪以减少金属物体反光干扰:
rosrun dynamic_reconfigure dynparam set /camera/stereo_module emitter_enabled 04. ACT训练全流程
4.1 数据采集阶段
我们设计了一套自动化采集方案:
- 通过MoveIt!控制机械臂在工作空间内随机生成200个预抓取位姿
- 每个位姿下用Realsense拍摄:
- RGB图像(640×480)
- 深度图(对齐到RGB坐标系)
- 点云(通过
pcl::PointCloudXYZRGB存储)
- 记录夹爪开合状态与抓取结果(成功/失败)
经验分享:采集数据时在夹爪内侧贴反光标记点,用AprilTag检测实际抓取位置,这比单纯依赖关节角度反馈更准确。
4.2 网络模型构建
采用ACT论文中的ResNet-18变体结构,但针对我们的场景做了三点改进:
- 输入层改为4通道(RGB+深度)
- 最后一层全连接输出维度改为6(抓取位姿+夹爪开度)
- 添加了空间注意力模块(CBAM)提升小物体识别能力
模型定义核心代码:
class ACTModel(nn.Module): def __init__(self): super().__init__() self.backbone = resnet18(pretrained=True) self.backbone.conv1 = nn.Conv2d(4, 64, kernel_size=7, stride=2, padding=3) self.cbam = CBAM(512) self.fc_pose = nn.Linear(512, 4) # x,y,z,angle self.fc_width = nn.Linear(512, 2) # open/close def forward(self, x): x = self.backbone(x) x = self.cbam(x) pose = self.fc_pose(x) width = self.fc_width(x) return torch.cat([pose, width], dim=1)4.3 训练技巧
数据增强策略:
- 随机HSV色彩抖动(Δh=0.1, Δs=0.2, Δv=0.2)
- 深度图添加高斯噪声(σ=0.01)
- 模拟遮挡(随机擦除20%区域)
损失函数设计:
def loss_fn(pred, target): pose_loss = F.smooth_l1_loss(pred[:,:4], target[:,:4]) width_loss = F.cross_entropy(pred[:,4:], target[:,4].long()) return 0.7*pose_loss + 0.3*width_loss- 训练参数:
- Batch size: 32
- 初始学习率: 3e-4(Cosine衰减)
- Epochs: 150
- 优化器: AdamW(weight_decay=1e-4)
在RTX 3060上训练约需3小时,验证集准确率可达91.2%。
5. 部署与优化
5.1 实时推理加速
使用TensorRT优化模型:
trtexec --onnx=act_model.onnx \ --saveEngine=act_model.trt \ --fp16 \ --workspace=2048实测推理时间从45ms降至11ms,完全满足实时控制需求。
5.2 抓取策略优化
设计了一套分级抓取策略:
- 首次尝试:模型预测的最佳抓取位姿
- 若失败(通过力矩传感器检测):
- 沿Z轴提升10mm
- 夹爪宽度减少15%
- 重新尝试
- 三次失败后触发重新检测
5.3 实际应用效果
在医疗导管分拣场景中的测试数据:
| 指标 | 传统方法 | ACT方案 |
|---|---|---|
| 抓取成功率 | 82.3% | 97.1% |
| 平均耗时 | 2.4s | 1.7s |
| 位置容错范围 | ±3mm | ±8mm |
| 角度容错范围 | ±5° | ±15° |
6. 常见问题排查
6.1 Realsense深度数据异常
现象:金属物体表面出现深度值跳变解决方案:
- 调整相机参数:
rosrun dynamic_reconfigure dynparam set /camera/stereo_module \ exposure 1000 \ laser_power 100- 在物体表面喷洒哑光喷剂(不影响医疗合规性的情况下)
6.2 机械臂运动抖动
现象:到达目标点后持续微振动排查步骤:
- 检查机械臂零位校准(需使用专用校准工具)
- 降低MoveIt!的伺服增益:
servo: joint_impedance: [2000, 2000, 1000, 500, 500, 300] # 单位N·m/rad6.3 抓取力度控制
现象:易碎物品被抓碎调整方法:
- 修改Pika夹爪的力控参数:
# 在ROS服务调用中设置 goal.current_limit = 0.3 # 默认0.5 goal.speed = 30 # 默认50- 在ACT训练数据中增加易碎物品样本
7. 进阶优化方向
- 多模态输入:加入力觉传感器数据提升抓取判断
- 在线学习:部署阶段持续收集失败案例自动优化模型
- 数字孪生:在PyBullet中仿真训练加速迭代
我们在最新项目中尝试了在线学习方案,通过边缘计算盒子实时更新模型参数,使系统能自适应新产品类型。一个有趣的发现是:当训练数据中包含至少50次失败案��时,模型对新物体的泛化能力会显著提升。