尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

中国机器人大赛自动分拣实战:视觉识别、手眼标定与抓取规划全解析

中国机器人大赛自动分拣实战:视觉识别、手眼标定与抓取规划全解析 简介这份资源是中国机器人大赛机器人自动分拣项目的完整参赛资料包面向高校自动化、电子信息、人工智能、物联网等专业的学生、教师及科研从业者可用于毕业设计、课程设计、竞赛备赛或项目立项演示。压缩包共1140个文件约119.62MB以592个C源文件与284个头文件为核心辅以rob、d、o、crf等编译与工程配置文件以及txt说明、md文档、png/gif图示、mp4演示视频和docx设计文档完整覆盖从底层驱动到分拣逻辑的实现链路。资源包含经过测试、可正常运行的源码与齐全的设计资料读者可据此理解自动分拣的算法流程、任务调度与硬件控制思路也能在现有代码基础上修改扩展实现其他功能。目前已有141人学习下载适合需要系统参考与进阶学习的开发者。1. 从一摞参赛资料里拆出自动分拣的最小闭环中国机器人大赛里的机器人自动分拣项目本质是让机械臂在有限时间内把散乱堆叠的目标物逐个识别、抓取、投放到指定料框全程不能人工干预。很多人第一次接触这类赛项第一反应是去搜“源码全部参赛资料”拿到压缩包后却卡在环境跑不起来、标定对不上、抓取节拍超时这三件事上。这篇笔记不打算复述某一份资料包的内容而是按一线做分拣项目的实际路径把视觉识别、手眼标定、抓取规划、状态机调度这几块拆开讲清楚让新手能照着搭出最小可跑闭环熟手能对照检查自己的参数边界。适合正在准备中国机器人大赛自动分拣赛项、或想把分拣逻辑迁移到教学与科研平台的人。2. 自动分拣系统的四个技术模块与选型逻辑2.1 视觉识别为什么先用传统方法兜底再上深度学习自动分拣的第一道坎是“看见”。赛项现场光照不可控、目标物表面反光、背景与物料颜色接近这些都会让纯深度学习方案在训练集之外翻车。我一般建议先用颜色阈值轮廓提取做兜底确认相机内参、工作距离、视野覆盖没问题再叠加轻量检测模型。传统方法的核心是HSV空间分割。RGB对光照敏感HSV的H通道相对稳定配合S/V双阈值能过滤掉大部分高光干扰。下面这段代码是OpenCV下的最小可用版本import cv2 import numpy as np def detect_by_hsv(frame, lower, upper, min_area800): frame: BGR图像 lower/upper: HSV阈值下界/上界格式 [H,S,V] min_area: 最小连通域面积过滤噪点 hsv cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) mask cv2.inRange(hsv, np.array(lower), np.array(upper)) # 开运算去毛刺闭运算补空洞 kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) mask cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) mask cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) contours, _ cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) results [] for cnt in contours: area cv2.contourArea(cnt) if area min_area: continue rect cv2.minAreaRect(cnt) # 返回中心、宽高、角度 results.append(rect) return results逻辑说明先转HSV再inRange得到二值掩膜形态学操作去掉小噪点和内部空洞最后用minAreaRect拿到带角度的旋转矩形这个角度对后续抓取姿态计算很关键。参数上min_area要根据实际像素当量调一般取目标物在图像中面积的60%左右H通道阈值跨度建议不超过30否则相邻颜色物料会串。如果物料种类超过5种或表面有纹理传统方法就不够了。这时上YOLO系列或轻量分割网络但要注意训练集必须包含赛项现场的光照条件否则模型在比赛时会出现置信度集体跳水。常见做法是现场采集200张以上、覆盖不同摆放角度的图用labelImg标完后做Mosaic增强。2.2 手眼标定Eye-in-Hand和Eye-to-Hand怎么选视觉给出的是像素坐标机械臂需要的是基坐标系下的三维坐标中间靠手眼标定搭桥。选型上Eye-in-Hand相机装在末端适合视野随臂动、精度要求高的场景但标定流程复杂Eye-to-Hand相机固定视野稳定、标定简单适合分拣台面固定的赛项。我一般用Eye-to-Hand打比赛因为分拣区域就那么大固定相机一次标定能管全程。标定用棋盘格流程是机械臂末端带标定针依次触碰棋盘格上若干个已知点同时记录像素坐标和机械臂基座坐标解AXXB。OpenCV的calibrateHandEye可以直接用import cv2 import numpy as np # R_gripper2base, t_gripper2base: 机械臂末端在基座下的旋转和平移 # R_target2cam, t_target2cam: 标定板在相机下的旋转和平移 R_cam2gripper, t_cam2gripper cv2.calibrateHandEye( R_gripper2base, t_gripper2base, R_target2cam, t_target2cam, methodcv2.CALIB_HAND_EYE_TSAI )参数说明method有TSAI、PARK、HORAUD、ANDREFF、DANIILIDIS五种TSAI在噪声小的场景下最稳PARK对旋转轴单一的情况更鲁棒。标定误差要控制在1mm以内否则抓取时会出现“看着对准了但夹爪偏了”的玄学现象。验证方法是让机械臂走到标定板某个角点上方看末端与角点的偏差。2.3 抓取规划从像素坐标到关节角度的完整链路拿到目标物的像素坐标和角度后要转成机械臂能执行的位姿。链路是像素坐标 → 相机坐标系用内参反投影深度→ 基坐标系用标定矩阵→ 抓取位姿加偏置和姿态约束→ 逆运动学求解关节角。深度获取有两种常见方案RGB-D相机直接给深度或单目平面假设分拣台面高度固定时可用。后者成本低但要求台面绝对水平稍有倾斜就会累积误差。逆运动学求解用MoveIt或自己写解析解都行。六轴机械臂解析解存在多解要按“关节行程最短”或“远离奇异位形”来选。下面是一个选解的判断逻辑def select_ik_solution(solutions, current_joints): solutions: 逆解列表每个元素是6个关节角 current_joints: 当前关节角 返回与当前关节角欧氏距离最小的解 best None min_dist float(inf) for sol in solutions: dist sum((a - b) ** 2 for a, b in zip(sol, current_joints)) if dist min_dist: min_dist dist best sol return best这个逻辑能避免机械臂在相邻两次抓取之间大幅甩动节拍能提升20%以上。参数上如果关节速度限制严格还要加时间最优规划用MoveIt的computeTimeStamps。2.4 状态机调度让识别、抓取、投放不打架分拣不是单次动作是“拍照→识别→抓取→移动→投放→复位”的循环。多个目标物时如果识别和抓取并行容易出现“抓了一个另一个被碰跑”的情况。我一般用有限状态机FSM串行调度状态包括IDLE、DETECT、PICK、PLACE、ERROR。状态转移用事件驱动比如DETECT完成后触发PICKPICK到位后触发PLACE。每个状态设超时超时进ERROR并报警。这样即使某个目标物识别失败也不会卡死整个流程。class SortFSM: def __init__(self): self.state IDLE self.timeout 5.0 # 秒 def step(self, event): if self.state IDLE and event start: self.state DETECT elif self.state DETECT and event detected: self.state PICK elif self.state PICK and event picked: self.state PLACE elif self.state PLACE and event placed: self.state IDLE elif event timeout: self.state ERROR return self.state实际部署时每个状态里要加日志和可视化方便赛后复盘。状态机的超时时间根据节拍要求设一般单次抓取循环控制在8秒内。3. 从零跑通自动分拣的实操步骤3.1 环境搭建与依赖安装先确认硬件机械臂常见Aubo、埃夫特、Estun等、相机RGB或RGB-D、夹爪气动或电动、分拣台面。软件栈用ROSMoveItOpenCVPython版本建议3.8以上。安装命令sudo apt install ros-noetic-moveit ros-noetic-realsense2-camera pip install opencv-python numpy scipy如果机械臂厂商提供ROS驱动优先用官方包否则用通用驱动如universal_robot。注意不同厂商的关节角零位定义不同接进来第一件事是核对零位否则逆解全错。3.2 相机内参与手眼标定实操内参标定用棋盘格拍15张以上不同角度图跑OpenCV的calibrateCamera。手眼标定按2.2节流程记录至少10组点对。标定结果保存成yaml每次启动加载。# 保存标定结果 import yaml data {R_cam2gripper: R_cam2gripper.tolist(), t_cam2gripper: t_cam2gripper.tolist()} with open(handeye.yaml, w) as f: yaml.dump(data, f)验证拿一个已知位置的目标物用视觉算出的坐标和实际坐标对比偏差超过2mm就重新标。3.3 识别-抓取-投放的代码串联把2.1的识别、2.2的坐标转换、2.3的逆解、2.4的状态机串起来。主循环伪代码fsm SortFSM() while True: if fsm.state DETECT: frame camera.get_frame() targets detect_by_hsv(frame, lower, upper) if targets: fsm.step(detected) elif fsm.state PICK: target targets[0] pose pixel_to_base(target, handeye, camera_intrinsics) joints select_ik_solution(ik_solver.solve(pose), arm.get_joints()) arm.move_joints(joints) gripper.close() fsm.step(picked) elif fsm.state PLACE: arm.move_joints(place_joints) gripper.open() fsm.step(placed)参数上pixel_to_base里的深度值如果来自RGB-D要做滤波中值或双边否则单点噪声会让抓取高度跳变。3.4 节拍优化与多目标处理单目标跑通后节拍是下一个瓶颈。优化点识别和抓取并行用双线程识别线程持续更新目标列表抓取线程取最新抓取路径用MoveIt的OMPL规划器设好速度缩放因子投放点如果固定可以预先算好关节角省去每次逆解。多目标时按“先近后远”或“先高后低”排序避免机械臂跨过已抓目标造成碰撞。排序逻辑targets.sort(keylambda t: t[distance_to_base])4. 自动分拣项目避坑与排查记录4.1 标定误差导致抓取偏移现象视觉显示对准了但夹爪总是偏几毫米换目标物后偏移方向还不一样。 原因手眼标定的旋转矩阵有误差或者相机内参标定时棋盘格不平。 解决重新标定棋盘格用刚性好的铝板标定针尖要尖标定后做残差分析剔除误差大的点对。4.2 光照变化让识别率骤降现象上午调好的HSV阈值下午就识别不到了。 原因自然光色温变化或现场补光灯角度变了。 解决加遮光罩用主动光源环形灯HSV阈值留足余量或改用自适应阈值形态学。4.3 逆解跳变导致机械臂抖动现象相邻两次抓取机械臂突然大幅甩动。 原因逆解多解时选了关节距离远的解。 解决按2.3的选解逻辑选与当前关节角最近的解如果还抖加关节速度限制。4.4 状态机卡死现象某个目标物识别失败后整个流程停住。 原因状态机没有超时处理。 解决每个状态加超时超时进ERROR并跳过当前目标继续下一个。4.5 夹爪抓取力不当现象轻物料被夹飞重物料夹不住。 原因夹爪力固定没有按物料调。 解决电动夹爪设力控模式气动夹爪加调压阀抓取前用视觉估重量面积×材质系数。5. 把分拣逻辑迁移到新物料的三个技巧换物料是分拣项目最常见的需求。我的习惯是先跑一遍传统识别看HSV能不能分不能分就上深度学习但训练集必须包含新物料的现场光照。第二个技巧是标定复用——如果相机和机械臂没动手眼标定不用重做只调识别阈值。第三个技巧是节拍验证——新物料如果形状差异大抓取位姿要重新算用仿真环境先跑一遍确认无碰撞再上真机。验证方法拿10个新物料随机摆放跑20次分拣统计成功率和平均节拍。成功率低于90%就回去查识别节拍超过10秒就查路径规划。我一般会在代码里加一个统计模块每次循环记录时间和结果赛后直接看数据。希望帮到你。本文还有配套的精品资源点击获取
返回列表