尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于YOLOv5与MoveIt的垃圾分类机械臂系统设计与实现

基于YOLOv5与MoveIt的垃圾分类机械臂系统设计与实现 简介计算机视觉与机器人控制的交叉应用正在重塑智能分拣领域。深度学习目标检测模型能够对物体进行实时定位与分类而运动规划框架则为机械臂提供安全可靠的轨迹生成能力。YOLOv5作为轻量级检测模型在推理速度与识别精度之间取得了良好平衡MoveIt作为ROS生态下的机器人运动规划框架可高效完成运动学求解、碰撞检测与路径规划。将二者结合可构建“感知-决策-执行”的完整闭环在垃圾自动分类、工业抓取、服务机器人等场景中具有广泛的应用价值。以一套基于YOLOv5和MoveIt的桌面垃圾分类机械臂项目为例系统介绍了从数据集构建、模型训练、手眼标定、URDF建模到状态机集成的完整技术链路并针对实机调试中的识别混淆、坐标转换误差、规划失败等典型问题给出了具体解决方案为从事视觉机械臂开发的工程师和学生提供了一份可落地的工程实践参考。 做这个项目的起因特别朴素实验室楼下的垃圾分类督导员每天要拆开几百个垃圾袋把塑料瓶、易拉罐、纸张、剩饭分门别类工作量巨大。当时正好在啃YOLOv5和MoveIt就想着能不能做一个长了眼睛的机械臂自动识别垃圾类别然后抓起来扔进对应垃圾桶。断断续续折腾了三个多月整套系统跑通之后我把源码、设计文档、训练好的权重和调试记录整理成了一个压缩包也就是你在标题里看到的那个分类机器人源码设计文档.zip。这篇博文就把整个项目从选型到落地、从原理到踩坑的过程梳理一遍给打算做类似视觉机械臂项目的朋友一个比较完整的参考。这个项目适合两类人看一类是正在做机器人类毕业设计或竞赛项目的学生YOLOv5MoveIt的组合覆盖面广、工程量适中、演示效果好另一类是刚接触ROS和机械臂控制、想找一个完整案例把视觉和运动控制串起来的开发者。我会先讲为什么选这套方案再拆解视觉模块和机械臂模块各自怎么实现然后是联动和调试最后说说源码和文档怎么用以及后续可以怎么扩展。1. 为什么选YOLOv5MoveIt选型背后的真实考量很多人一上来就问为什么用YOLOv5不用YOLOv8为什么用MoveIt不用自己写逆解这类问题其实没有标准答案关键看项目约束条件。我这个项目的约束非常明确ROS Melodic环境下开发机械臂是自组装的6自由度桌面臂算力平台是带GTX 1660Ti的笔记本目标物体是塑料瓶、易拉罐、废纸团、果皮等常见垃圾识别类别一共四类。在这个前提下YOLOv5和MoveIt几乎是当时最稳的组合。1.1 视觉方案对比YOLOv5比传统图像处理和更重模型更合适传统图像处理方案我也试过比如用颜色阈值提取塑料瓶的蓝色、用形状匹配识别易拉罐的圆柱轮廓。效果在单一光照、单一背景的实验室里还可以但只要把垃圾桶放到窗边阳光一照颜色全飘误检率直接崩到没法看。深度学习检测模型对光照、角度、遮挡的鲁棒性明显更好而YOLOv5在速度和精度的平衡上刚刚好。为什么不选更重的模型当时也考虑过Faster R-CNN和YOLOv5x。Faster R-CNN在COCO上的mAP确实高一些但在笔记本CPU上跑一次推理要两三百毫秒加上机械臂运动时间整个流程会拖得很长YOLOv5x同理权重文件150多MB前向推理速度快不到哪去。垃圾识别场景的物体类别不算精细不需要检测出农夫山泉还是怡宝只要能区分塑料瓶易拉罐这种大类YOLOv5s或者YOLOv5m的精度完全够用而且推理时间能压到20ms以内给后面的机械臂规划留出了充足的系统余量。还有一个很实际的原因YOLOv5的生态太成熟了。从数据标注到训练、导出onnx、推理脚本网上有海量现成资料遇到问题搜一下就有解决方案。对于一个需要控制整体进度的项目来说选一个社区活跃度高的模型框架比单纯追求指标上的一点提升重要得多。1.2 机械臂控制框架MoveIt在ROS生态中的地位与优势机械臂控制的方案选择上我当时纠结过三条路一是用厂商自带的SDK直接控制二是用ROS Industrial的插件三是用MoveIt。自组臂用的是舵机步进电机没有厂商SDK所以第一条路直接pass。ROS Industrial的驱动链虽然成熟但主要面向工业机器人配置起来相当繁琐而且对自组臂不友好。剩下MoveIt它其实不是一个控制库而是一个运动规划框架把运动学求解、碰撞检测、路径规划、轨迹执行这些模块整合到了一起还提供了图形化配置工具。也就是说我只需要提供机械臂的URDF模型MoveIt就能自动生成运动学求解器、规划场景、执行器接口然后用几行代码就能让机械臂从A点运动到B点。MoveIt还内置了多种规划器比如OMPL里的RRT、RRTConnect、BKPIECE等。我实际用得最多的是RRTConnect原因后面细讲。对ZERO基础的人来说可能一下子理解不了MoveIt是框架这句话可以类比成Photoshop你不用自己写图像处理算法只需要通过它提供的界面和接口把素材拖进去选择合适的工具就能处理图像。MoveIt就是机械臂领域的Photoshop你负责提供模型和期望的目标位姿它负责算出一条无碰撞的轨迹。1.3 整体系统框架与数据流整个系统的物理组成其实很简单一台带GPU的电脑一个RGB相机一台6自由度桌面机械臂几个对应类别的垃圾桶。软件层面分成三个模块视觉识别节点YOLOv5推理、决策调度节点状态机、机械臂控制节点MoveIt控制器。数据流是这样的相机实时采集桌面画面YOLOv5推理出画面中垃圾的类别和像素坐标决策节点拿到检测结果后根据预设的类别-垃圾桶映射表计算出机械臂的目标抓取位姿和投放位姿MoveIt规划出从当前位姿到目标位姿的无碰撞轨迹发布给底层控制器执行机械臂抓取垃圾后移动到对应垃圾桶上方松开夹爪完成一次分类投放。这套流程听起来直接但实际调试时每一步都有坑尤其是坐标转换和状态同步这两个环节后面我会单独拿出两个章节重点讲。2. 视觉识别模块从数据集构建到YOLOv5模型部署的完整链路视觉模块是整个系统里工程量最大、也最容易出问题的地方。网上很多人分享YOLO训练教程大多是拿公开数据集跑一遍demo但到了自己采集数据、标注、训练、部署就会发现各种意想不到的问题。我把这一整条链路拆成三个关键阶段每个阶段里面都标注了我认为最重要的细节。2.1 垃圾数据集的采集与标注细节垃圾数据集的第一个问题就是样本不均衡。网上的公开垃圾数据集比如TrashNet塑料瓶和易拉罐的图片非常多但果皮、废纸团的样本相对少。如果直接用这个数据集训练模型对果皮的识别效果会很差。我的做法是自己采集了一部分真实场景数据把桌面背景、光照条件、垃圾形态都做了一次扩充。采集时我踩了一个很大的坑只采集了干净、完整的物体忽略了真实垃圾往往有变形、压扁、贴标签、沾污渍等情况。比如一个压扁的易拉罐角度稍微偏一点模型就认为是塑料瓶。后来我在采集中特意加入了残缺、遮挡、堆叠、不同光照时段的样本识别率才真正提上来。如果你也想做类似项目建议一开始就收集脏乱差样本而不是商品展示图样本。标注环节用LabelImg格式选的YOLO的txt格式也就是每个目标一行包括类别id和归一化的中心点坐标、宽高。这里有个细节标注框不要紧贴物体边界。我一开始标注时为了框得准贴得很紧训练出来的模型预测框在推理时经常比实际物体小一圈导致机械臂抓取时定位偏上。后来我重新把标注框扩大到物体边界外2%到5%左右问题才解决。原因是YOLO的预测框回归在边界处不稳定稍微留一点余量可以让框的中心点更准机械臂抓取中心位置也更可靠。2.2 模型训练关键参数与调优笔记我选的预训练权重是YOLOv5s训练了大概200轮batch size选16输入分辨率640x640。官方默认的hyp.scratch.yaml里很多超参数直接可用但有两个参数我单独做了调整一是mosaic增强的概率保持默认0.7这个对垃圾这类小目标很有用二是fliplr水平翻转我调到了0.2因为机械臂抓取时物体从相机视角看主要是正立和略带旋转的状态太强的水平翻转会引入不自然的视角。还有一个容易被忽略的参数image_weights。这个参数如果开启采样时会优先选那些损失较大的图片能缓解样本不均衡。我在训练后期开了它val集的mAP提升了大概2个百分点。不要小看这两个点在垃圾识别这种类别间相似度较高的场景里mAP的微小提升可能就意味着某些易混淆类别能被分对。训练过程中最需要盯的是PR曲线和混淆矩阵。我最初训练的模型在易拉罐和塑料瓶之间频繁混淆看混淆矩阵发现铝罐在强光下的反光区域非常像塑料瓶的高光纹理。解决方法是采集数据时特意加入强反光样本同时把亮度增强参数hsv_v调低从默认的0.4降到0.2避免模型把反光当成目标特征。调完训练一轮后这两类的混淆比例降了大概40%。2.3 实时推理的性能优化TensorRT与模型轻量化训练完的PyTorch模型直接跑推理在1660Ti上大概30ms一帧纯看视觉是够用的但一旦和MoveIt同时跑CPU、GPU争抢资源整个系统的响应延迟会明显上升。为了给机械臂规划留出余量我把模型导出成TensorRT的FP16 engine。导出流程网上资料很多但有几个坑值得提醒一是YOLOv5官方仓库的export.py在导出TensorRT时如果CUDA、cuDNN和TensorRT版本不匹配很容易报错或者导出的engine体积异常。我最后用的组合是CUDA 10.2cuDNN 7.6.5TensorRT 7.1.3在2023年之后这个组合偏旧但稳定性非常好。二是FP16的精度损失在垃圾识别里完全可接受我实测mAP只掉了0.8%推理时间从30ms降到了12ms。三是TensorRT的engine文件跟推理环境强绑定换一台电脑必须重新导出没法直接拷着用这个要提前在交付文档里写清楚。还有一个更轻量的优化是降低输入分辨率。640x640降到480x480推理时间从12ms降到7msmAP仅下降1.1%。在桌面固定抓取场景下物体距离相机很近YOLO在低分辨率下同样能检测到所以我觉得这个trade-off很划算。最终部署时我选了480x480输入这样即使MoveIt规划需要占用大量计算资源视觉端的帧率也能稳定在25FPS以上。3. 机械臂控制模块MoveIt运动规划与抓取逻辑的实现机械臂控制是整个系统的执行层任何识别上的误差最终都会体现在抓不到或者碰倒物体上。MoveIt本身封装了很多东西但用好它需要理解几个核心概念URDF机器人模型、规划组、运动学求解器、规划场景和坐标系变换。3.1 机械臂URDF建模与MoveIt配置助手的使用自组机械臂没有现成的URDF我是从零开始建的。建模时最重要的事情是把每个关节的运动范围搞对。拿我用的MG996R舵机来说名义上是180度但实际PWM信号在500到2500微秒之间对应的角度才稳定超出这个范围舵机要么堵转要么抖动。我当时没仔细测实际行程直接按180度建模结果MoveIt规划的路径经常让舵机到达物理极限执行时咔咔响。后来用角度尺实测了每个关节的极限角度重新改URDF问题才解决。URDF建好后用moveit_setup_assistant生成MoveIt配置包。这个工具会引导你定义规划组Planning Group、生成碰撞矩阵并检查URDF的完整性。需要注意的是规划组里必须把末端执行器也就是夹爪单独列成一个group后面做抓取时可以直接指定末端目标位姿否则MoveIt只控制机械臂本体夹爪的开合状态没法纳入规划。还有一个细节moveit_setup_assistant生成的默认碰撞矩阵采用的是相邻连杆不检查碰撞的自动碰撞矩阵。我原本以为这个就很可靠但实际有一个非相邻连杆在特定姿态下会干涉比如大臂在抬高到某个角度时会碰到肩部的一个支架。所以我后来手动给这两个连杆添加了碰撞对让规划器把它们视为不可碰撞才彻底避免了规划出的路径扫过自身支架的情况。3.2 抓取位姿估计与坐标变换TF的坑视觉检测出来的是像素坐标机械臂要用的是机器人基座坐标系下的三维坐标。两者之间的桥梁是TF树。我这边固定了相机在机械臂正上方大约70cm处要求相机坐标系camera_link到机械臂基座坐标系base_link的变换是固定的。这个变换可以通过手眼标定得到也可以直接通过精确测量安装位置和角度推导出来。我当时图省事想直接量尺寸算坐标变换结果误差大到离谱。为什么相机安装的俯仰角只要偏2度在60cm远的桌面上位置误差就能到3cm以上机械臂夹爪张开宽度才5cm直接抓空。后来老老实实做了手眼标定。用的事OpenCV的经典张正友标定板配合eye-in-hand标定算法但这里的eye-in-hand其实是错误说法因为相机是固定的应该是eye-to-hand。网上大量代码把eih和eth混在一起我一开始照着eye-in-hand的流程走标定结果一直在跳查了半天才发现坐标系关系搞反了。标定流程总结下来就是机械臂带着标定板或者相机带着标定板看你用哪种方法移动到多个不同姿态采集标定板图像并记录各个姿态下机械臂末端位姿然后通过AXXB方程求解相机相对机械臂基座的变换。手眼标定的误差非常依赖采样数据的多样性机械臂姿态变化范围越大、标定板在图像中的位置越分散标定结果越准确。我只做了一次旋转角范围较小结果误差有5mm后来重新采集了30个姿态覆盖不同高度和不同水平位置误差稳定在1.5mm以内。3.3 运动规划与避障基于实际场景的规划器选择MoveIt默认的规划器是RRTConnect我一开始照默认用。RRTConnect的原理是同时从起点和终点生长两棵树直到两棵树相遇所以它在无障碍场景下规划速度非常快。但缺点是生成的路径通常比较绕路径平滑度差。机械臂执行时会出现不自然的摆动速度控制也没那么流畅。后来我测试了OMPL里的RRTstar和STOMP。RRTstar的路径质量明显好但规划时间动不动就几秒在实时交互场景里太慢。STOMP需要配置代价代价函数调起来麻烦。最后我的方案是先让MoveIt用RRTConnect快速规划一条路径然后对路径做一步简化再通过MoveIt的平滑处理模块做轨迹重采样最终的轨迹既快又平滑。这种快速规划后处理的思路效果非常显著机械臂运动过程中的抖动基本消除。规划场景Planning Scene里的障碍物设置也是一个重要环节。如果你不告诉MoveIt桌面上哪里有障碍物它规划时只考虑机械臂自身碰撞可能规划出一条直接穿桌子的路径。我在项目中把桌面、垃圾桶都作为固定障碍物加到了规划场景里。做法是在节点的/planning_scene话题上发布CollisionObject消息几何形状用box表示加上对应的位姿。这样MoveIt规划出的路径会自然地绕过垃圾桶而不是把机械臂的手臂插进垃圾桶里。4. 视觉与机械臂的联动系统集成的关键代码路径与状态机视觉和机械臂单独跑都能工作但把它们连起来才真正暴露问题。这一章重点讲ROS节点怎么组织、坐标怎么转换、状态机怎么设计这些是系统能否稳定跑通的关键。4.1 ROS节点划分与消息通信设计整个项目我拆成了四个ROS节点camera_node负责读取相机图像发布sensor_msgs/Image和sensor_msgs/CameraInfodetection_node订阅图像用TensorRT engine做推理发布检测结果自定义的消息类型trashDetectionArray包含类别、置信度、像素坐标和检测框大小controller_node订阅检测结果做决策生成目标位姿调用MoveIt接口规划并执行运动gripper_node订阅夹爪开合指令控制夹爪舵机节点之间用ROS话题通信好处是解耦清晰。detection_node和controller_node之间不需要等待函数调用检测结果一发布控制节点就会触发回调。调试时还可以用rostopic echo实时查看检测数据非常方便。这里有一个设计细节值得说为什么不在detection_node里做坐标转换而是把像素坐标直接发布出去因为detection_node不需要关心机械臂的坐标转换参数如果相机换了安装位置只需要在controller_node里修改变换关系视觉节点完全不用动。这种低耦合设计让我在后期调整标定时省了大量时间。4.2 从检测框到抓取点的坐标转换流程检测到目标类别后下一个问题就是抓哪里。我用最直接的办法用检测框的中心点作为抓取点在图像上的投影。由于桌面上的垃圾主要是一个个平放或稍微倾斜的物体它们的抓取点大致在物体几何中心。通过相机内参将像素坐标转为相机坐标系下的坐标再通过手眼标定得到的变换矩阵转到机械臂基座坐标系下。公式上其实很简单[X, Y, Z, 1]^T T_eye_to_base * [x_cam, y_cam, z_cam, 1]^T。但真正的问题是Z坐标怎么确定。相机是固定朝下的桌面就在一个固定的高度我直接设Z为桌面高度。这样如果物体有一定高度取点会偏低但夹爪有足够的容错空间只要能抓住物体上半部分就行。另一个重要参数是抓取姿态。垃圾不具备固定朝向我用的是竖直向下的姿态夹爪末端朝向Z轴负方向垂直于桌面。这样机械臂第五轴和第六轴的姿态是确定的只需要控制XY位置。实际上我测试过带一点倾斜角度去抓取斜坡上的物体但成功率反而不如竖直抓取因为物体的实际朝向很难提前判断。竖直向下抓取配合软指夹爪对大多数扁平垃圾纸团、果皮和圆柱垃圾易拉罐都有不错的适应性。4.3 状态机设计检测、定位、抓取、投放的调度逻辑整个系统的核心逻辑是一个状态机用Python实现状态包括IDLE、DETECTED、REACHING、GRASPING、LIFTING、MOVING_TO_BIN、RELEASING、RETURNING。状态之间的切换由MoveIt的回调和夹爪传感器反馈触发。这里我踩的坑是一开始没有考虑到机械臂持续运动时的状态同步。比如MoveIt执行完REACHING状态后需要夹爪闭合但夹爪闭合需要时间必须等夹爪完全闭合后才能进入LIFTING状态。我最初用固定延时1秒结果机械臂上升太快把物体甩掉了。后来改成夹爪霍尔传感器检测到物体夹紧后再切换到下一状态成功率一下子从70%提升到95%。状态机还有一个关键点是超时和失败处理。抓取不是每次都能成功比如物体太滑或者位置太偏。我给GRASPING状态加了一个超时设定如果超过3秒还没有检测到夹紧信号状态机就回到IDLE让机械臂重新等待识别或调整目标点。否则机械臂会卡在原地整个系统就僵住了。5. 实机调试中踩过的坑与排查思路这一章是全文最想让你仔细看的因为这些坑我都是在连续调试十几个小时之后才找到根因的。每一类问题都值得拿出来单独说。5.1 相机标定与手眼标定失败的原因分析手眼标定失败的最常见原因是数据采集不够好而不是算法本身有问题。我第一次标定时机械臂只转了10来种姿态而且标定板在图像里的位置几乎都在中间。标定结果每次运行都不一样旋转矩阵的方差特别大。后来我意识到手眼标定的核心是让标定板在相机视野的不同区域都有足够的约束姿态变化要足够大才能解出稳定的变换矩阵。另一个容易踩的坑是标定板角点的亚像素提取失败。光照太强或标定板太旧时OpenCV的findChessboardCorners经常返回False或者角点顺序错乱。解决办法是把标定板放在阴影下并且事先做一次灰度归一化。在采集时保持标定板平整不要弯折。否则标定出来的矩阵也会有明显偏差。标定完成后一定要做一次交叉验证把标定板放在桌面上几个已知位置用机械臂末端去触碰标定板上的特定角点对比两个位置的实际坐标和通过标定矩阵换算出的坐标。如果误差超过3mm就要重新标定。这套验证流程看起来多花时间但能避免后面所有调试都在错误误差前提下的浪费时间。5.2 MoveIt规划失败与碰撞检测误判的处理MoveIt规划失败最典型的报错是Unable to solve the planning problem原因通常是目标位姿在机械臂的不可达区域之外。我画了机械臂的工作空间包络把所有目标抓取点都限制在包络之内但仍然有一小部分点规划失败。深入排查后发现原因是末端执行器的默认方向太苛刻。我指定目标位姿时用了orientation constraint要求夹爪完全垂直于桌面但实际可达的抓取姿态会略微倾斜。后来我去掉了过于严格的方向约束只限定Z轴方向在正负5度范围内规划成功率从85%提升到了100%。碰撞检测误判是指MoveIt认为某个路径会碰撞但目测明明不会。这种情况多半是碰撞矩阵里包含了不该包含的碰撞对或者物体模型尺寸设置错了。我用的是自组臂有些连杆的STL模型是从网上找的简化版几何形状和实物有一定差异。比如末端夹爪的STL模型比实际夹爪长了一截导致MoveIt认为任何靠近桌面的抓取动作都会碰撞。解决办法是直接简化夹爪碰撞模型用一个圆柱体代替尺寸略小于实际夹爪给规划器留一点冗余。5.3 实时性瓶颈排查CPU占用与推理延迟整个系统在运行时我用htop和nvtop监控资源占用。发现MoveIt规划时CPU单核占用达到100%而YOLOv5推理在GPU上只占60%但GPU内存却异常高导致显存不足报警。排查后发现是TensorRT engine的输入输出buffer没有释放每次推理都重新分配内存导致显存泄漏。修正的方式是初始化时一次性分配好固定大小的buffer推理时只复制数据不重新分配。这一个小修改让显存占用从2.1GB降到了0.9GB长时间运行也不会再报错。另一个瓶颈是ROS话题的传输延迟。默认的TCPROS在大图像传输时会有几百毫秒的延迟我通过设置roscpp的传输类型为UDPROS解决了这个问题。核心原理是UDP掉包重传机制比TCP轻量适合图像这种大流量实时性要求高的数据。实际测试下来图像从相机到视觉节点的延迟从180ms降到了35ms这个提升对整个系统的实时响应非常有帮助。6. 项目源码与设计文档的使用指引把源码和设计文档打包交付时我特意做了目录整理和README说明因为我知道如果不写清楚别人拿到这堆文件很容易卡在环境配置上。这里我也把源码结构和使用步骤大致讲一下帮你少走弯路。6.1 源码目录结构与关键文件说明压缩包解压后顶层目录大概是这样的trash_sorting_robot/ ├── README.md ├── src/ │ ├── vision/ │ │ ├── yolo_detector.py │ │ ├── export_tensorrt.sh │ │ └── weights/ │ ├── controller/ │ │ ├── state_machine.py │ │ ├── moveit_control.py │ │ └── gripper_control.py │ ├── calibration/ │ │ ├── hand_eye_calibration.py │ │ └── camera_calibration.py │ └── launch/ │ ├── system.launch │ └── moveit_plan.launch ├── docs/ │ ├── 设计文档.pdf │ ├── 操作手册.md │ └── 实验数据记录.xlsx └── requirements.txtvision/yolo_detector.py是视觉节点的核心文件里面包含了TensorRT engine的加载和推理逻辑。如果你没有TensorRT环境也可以直接改成PyTorch推理但要注意修改输入预处理的部分。controller/moveit_control.py封装了MoveIt的所有接口包括设置目标位姿、执行规划、等待执行完成等。controller/state_machine.py是完整的状态机实现里面有一个TrashSortingStateMachine类你可以在__init__里修改垃圾桶对应的类别列表比如把易拉罐对应到可回收桶、纸团对应到纸类桶。calibration/hand_eye_calibration.py是手眼标定脚本需要配合标定板使用。代码里有详细的注释按步骤运行即可。6.2 环境部署步骤与ROS版本注意事项环境依赖写在了requirements.txt里主要包括Python 3.6.9、PyTorch 1.7.1、TensorRT 7.1.3、OpenCV 4.5.2、ROS Melodic、MoveIt 1.0.3。这些版本组合我是实测过的如果完全照抄可以最大程度避免版本冲突。ROS版本这里重点说一下如果你用的是ROS NoeticUbuntu 20.04那么MoveIt版本是2.xAPI和Melodic下的1.x有一些差异主要的坑是moveit_commander的接口在Noetic下没那么稳定建议优先使用MoveIt的C API。如果你仍然想用Python API需要切换到moveit_py包或者使用ROS2的moveit2。我这边因为没有ROS2的需求所以最终选择了MelodicC接口组合稳得很。在编译过程中如果遇到moveit_ros_planning找不到的问题可以在安装MoveIt时把ros-melodic-moveit和ros-melodic-moveit-ros-planning都装全不要只装核心包否则会缺失一些头文件。6.3 设计文档中不被注意但很实用的细节设计文档里除了常规的需求分析、系统架构、模块设计还有三块我觉得价值最大一是实验数据记录.xlsx其中原始记录了不同光照、不同角度下识别成功率的具体数据比如在光照充足时四类垃圾的平均识别率是97.2%逆光时降到了88.5%这些数据可以帮你预判实际使用环境的表现二是机械臂末端夹爪的结构设计图纸我用了3D打印的软性硅胶指套比硬塑胶夹爪对不规则垃圾的适应性好很多设计文档里有STL文件三是操作手册.md里关于硬件上电顺序的警告控制器必须先上电再启动ROS节点否则机械臂会处于未使能状态导致无法规划。这些细节单独看起来不起眼但都是我在实测中累积出来的经验如果你只是照着设计文档的框架去做很可能忽略掉这些隐藏信息然后在某个环节卡住很久。7. 后续扩展与个人心得项目做到这个程度已经能在实验室稳定演示了。但如果你有兴趣往更实用方向走或者想把这套东西改造成更完整的系统我有几个思路和一些发自肺腑的建议。7.1 从单分类到可回收资源分拣的升级思路目前的系统只能做一次抓一个的离散抓取吞吐量不高。想提升效率的话可以把视觉模块升级为流式检测多目标排队也就是一次识别画面里多个垃圾然后按优先级逐个规划抓取不需要每次抓完都重新识别整个场景。这样能减少机械臂空等时间吞吐量理论上能提升50%以上。另外可以尝试把识别类别扩展到更多细分比如把塑料瓶细分为PET、HDPE等材质类型。这需要更多的数据样本和更精细的模型但意义很大直接对接后端回收产业链。如果你对垃圾分类感兴趣可以往细粒度材质识别方向深挖这个方向目前公开数据集相对较少但也是实际需求比较旺盛的领域。机械臂部分也可以做动态抓取。目前桌面上的物体是静止的如果你把物体放到一个缓慢转动的转盘上让YOLOv5在运动过程中实时识别并预测抓取点MoveIt就需要和视觉联动做在线轨迹规划。这个复杂度会上升好几个台阶但做好了就是一个完整的视觉伺服项目含金量很高。7.2 关于学习路径的一些建议做这类项目最忌讳一上来就摊大饼把YOLO、MoveIt、ROS、标定、机械臂建模一起学很容易被劝退。我的建议是分三步走第一周先跑通YOLOv5官方训练流程用公开数据集训练一个模型重点理解模型接口和推理流程第二周用MoveIt控制机械臂到达固定点不做视觉理解TF和规划流程第三周才开始把两者串起来。每走一步都要确保自己能解释清楚原理再进入下一步。还有一个小建议项目中出现问题时尽量自己通过rostopic echo、rosrun rqt_graph、rosrun rqt_tf_tree这些工具去定位而不是直接查代码。因为很多问题出在运行时的话题连接或坐标系关系上看代码看不出什么但一看TF树和数据流就一目了然了。我用这套排查方法节省了大把时间。最后动手做永远比看教程学得快。哪怕你的机械臂很简陋、相机是几十块的USB摄像头先把一个最简单的识别-抓取-投放闭环跑通后面的优化才有意义。真实项目里你学到的排错能力才是完全不亚于技术本身的东西。本文还有配套的精品资源点击获取
返回列表