1. 项目概述
在机器人自动化领域,将视觉识别与机械臂控制相结合实现物品抓取是一个经典而实用的应用场景。最近我使用史河机器人-MMC1复合机器人平台,成功实现了对小鸡玩偶的识别与抓取。这个项目涉及从YOLOv5模型训练到实际部署的全流程,其中模型转换和系统集成是关键难点。
复合机器人配备了6轴机械臂、四指软爪和RealSense D435i深度相机,配合Nvidia Jetson NX工控机,构成了一个完整的视觉抓取系统。本文将详细记录从模型转换到实际抓取的全过程,特别是那些官方文档中不会提及的实操细节和避坑经验。
2. 模型转换全流程
2.1 环境准备与项目下载
首先需要获取tensorrtx项目的yolov5-v6.0分支,这是模型转换的基础。我推荐直接下载ZIP压缩包而不是使用git clone,因为在机器人平台上网络连接可能不稳定。下载地址为:
code复制https://github.com/wang-xinyu/tensorrtx/tree/yolov5-v6.0
注意:必须确认下载的是yolov5-v6.0分支,其他版本会导致后续转换失败。我在第一次尝试时忽略了这一点,结果浪费了两小时排查各种莫名其妙的错误。
2.2 模型格式转换
转换过程分为两个关键步骤:
- 将训练好的.pt模型转换为.wts中间格式
- 将.wts文件转换为TensorRT引擎.engine文件
首先将gen_wts.py脚本复制到YOLOv5项目根目录,然后执行:
bash复制python gen_wts.py -w ./runs/train/exp17/weights/best.pt -o ./runs/train/exp17/weights/best.wts
这个步骤通常很顺利,但要注意:
- 确保使用的Python环境与训练时一致
- 模型路径要准确,特别是当你有多个训练实验时
2.3 在机器人上完成最终转换
将生成的best.wts文件传输到机器人后,需要进行以下关键操作:
- 修改yololayer.h中的类别数量:
cpp复制static constexpr int CLASS_NUM = 1; // 原为5,改为你的实际类别数
- 标准编译流程:
bash复制mkdir build
cd build
cmake ..
make
- 生成最终引擎文件:
bash复制./yolov -s best.wts best_toy.engine s
实测发现:在Jetson NX上编译时,内存不足可能导致进程被杀死。解决方法是在编译前执行
sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile创建一个4GB的交换空间。
3. 模型部署与系统集成
3.1 文件替换与配置修改
将生成的best_toy.engine和libmyplugins.so复制到目标目录后,需要修改检测脚本yolo5rt_detector.py的关键参数:
python复制# 模型文件配置
wfname="best_toy.engine" # 修改为你的引擎文件名
categories = ["chickenToy"] # 与训练时类别标签一致
# 预测函数参数修改
def PredictionProcess(...,classname=["chickenToy",],...,wfname="best_toy.engine"):
常见问题:
- 文件权限问题:确保引擎文件有读取权限
- 库版本冲突:建议使用虚拟环境隔离
- 路径错误:所有路径都应该是绝对路径或相对于脚本位置的相对路径
3.2 机器人系统启动流程
启动顺序至关重要,错误的顺序会导致系统无法正常工作:
- 启动MoveIt和机械臂驱动
- 启动相机驱动
- 确认仿真模型与实际机器人姿态一致
- 启动识别程序
- 运行行为树
- 执行抓取测试
经验分享:在启动相机驱动后,建议等待10秒再启动识别程序,确保相机完全初始化。我曾遇到因相机未就绪导致的识别失败问题。
4. 实际抓取操作与调试
4.1 识别姿态调整
机械臂会首先移动到预设的识别姿态,这个姿态需要满足:
- 相机视野覆盖目标区域
- 避免机械臂遮挡目标
- 与目标保持适当距离(对于D435i建议0.3-1.2米)
可以通过修改~/rpp_ws/src/robot/yolo5_detector/scripts/tensoRT/pose_config.json调整识别姿态。
4.2 抓取参数优化
成功的抓取依赖于几个关键参数:
- 抓取高度补偿:根据目标高度调整
- 抓取力度:软爪的压力参数
- 预抓取姿态:机械臂接近目标的路径
我通过多次试验得出的优化参数:
json复制{
"grasp_height_offset": 0.02,
"gripper_force": 0.6,
"approach_distance": 0.1
}
4.3 常见问题排查
- 识别失败:
- 检查相机画面是否正常
- 确认引擎文件加载无误
- 验证光照条件(实测发现500-700lux效果最佳)
- 抓取失败:
- 检查目标点云数据
- 确认机械臂标定准确
- 调整抓取高度和角度
- 系统卡死:
- 检查CPU/GPU负载
- 查看ROS节点通信状态
- 确认电源供应稳定
5. 性能优化技巧
经过两周的实测,我总结出以下提升系统稳定性的方法:
- TensorRT引擎优化:
bash复制./yolov -s best.wts best_toy.engine s # 使用s模式而非m或l
- 相机设置优化:
- 分辨率设为640x480
- 帧率设为30FPS
- 关闭自动曝光,手动设置为300
- ROS参数调整:
bash复制rosparam set /use_sim_time false
rosparam set /rosdistro melodic
- Jetson NX性能调优:
bash复制sudo nvpmodel -m 0 # 最大性能模式
sudo jetson_clocks # 锁定最高频率
6. 扩展应用思考
这个基础框架可以扩展到更多场景:
- 多目标识别:修改模型支持多类别
- 动态抓取:结合移动底盘实现追踪抓取
- 分拣系统:添加传送带和多个抓取点
- 质量检测:在抓取过程中进行外观检查
我在实验中发现,对于反光物体,添加偏振滤镜可以提高识别率;而对于透明物体,则需要调整点云处理算法。