✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅如需沟通交流查看文章底部二维码1双目视觉与手眼标定融合的目标定位及YOLOv5检测优化针对双机械臂协同分拣中目标工件精确定位的需求搭建了双目立体视觉系统。首先进行双目标定获得左右相机的内外参数和旋转平移矩阵。然后采用YOLOv5s网络检测工件类别和2D边界框再结合SGBM立体匹配算法生成视差图通过重投影获得边界框中心点的三维坐标。为了提高检测精度对YOLOv5进行了改进在Neck部分加入坐标注意力模块增强工件边缘特征的表达并在训练中使用Mosaic数据增强和标签平滑。在自制数据集包含5种异形件共12000张图像上训练后平均精度达到91.1%检测速度45FPS。手眼标定采用眼在手外构型通过采集多组机器人末端与标定板的位姿求解相机坐标系到机器人基座标系的变换矩阵。标定后三维定位误差在0.5mm以内。2基于分阶段碰撞检测与改进RRT-Connect的双臂协同路径规划为防止双机械臂在分拣过程中发生自碰撞和互碰撞设计了一种基于包围盒的分阶段碰撞检测策略第一阶段用粗AABB包围盒剔除明显不碰撞的连杆对第二阶段对可能碰撞的连杆用圆柱体精确计算距离。当距离小于安全阈值时触发避让。路径规划采用改进的RRT-Connect算法从起始点和目标点同时生长两棵树引入偏向目标扩展和路径平滑修剪。对双机械臂主臂先行规划路径从臂将主臂的运动轨迹视为动态障碍物采用动态窗口法进行局部实时调整。仿真实验表明在复杂异形件分拣场景下双机械臂同时运动无碰撞规划成功率为98.7%规划时间平均0.85秒。3多模态协同调度策略及ROS系统集成实验为了实现双臂同时分拣和时序分拣码垛的灵活切换设计了一个多模态调度器。调度器根据任务队列的状态工件到达顺序、优先级、机器人负载动态选择作业模式当两个工件独立时采用同时分拣模式当存在干涉时采用时序分拣模式主臂抓取后移动到安全区域再启动从臂。调度器基于有限状态机实现通过ROS topic与视觉节点和规划节点通信。在实际搭建的双机器人平台上两台UR3e进行了200次分拣实验结果显示同时分拣模式下循环时间平均为7.2秒时序模式下为10.5秒整体成功率96%。碰撞检测模块在实验过程中未发生碰撞事故验证了算法的可靠性。import cv2 import numpy as np import torch import torch.nn as nn # 改进YOLOv5的坐标注意力模块 class CoordAttention(nn.Module): def __init__(self, in_channels, out_channels): super().__init__() self.pool_h nn.AdaptiveAvgPool2d((None, 1)) self.pool_w nn.AdaptiveAvgPool2d((1, None)) self.conv1 nn.Conv2d(in_channels, out_channels, kernel_size1) self.conv_h nn.Conv2d(out_channels, out_channels, kernel_size1) self.conv_w nn.Conv2d(out_channels, out_channels, kernel_size1) self.sigmoid nn.Sigmoid() def forward(self, x): n, c, h, w x.size() x_h self.pool_h(x).permute(0,1,3,2) x_w self.pool_w(x) y torch.cat([x_h, x_w], dim2) y self.conv1(y) y self.sigmoid(y) y_h, y_w torch.split(y, [h, w], dim2) y_h y_h.permute(0,1,3,2) y_w y_w a_h self.conv_h(y_h) a_w self.conv_w(y_w) return x * a_h * a_w # 圆柱体包围盒碰撞检测 def cylinder_intersection(p1, r1, p2, r2, axis1, axis2): # 简化为线段间最短距离 def closest_point_segment(a, b, p): ab b - a; t np.dot(p - a, ab) / np.dot(ab, ab) t np.clip(t, 0, 1) return a t * ab # 取两端点 mid1 p1; mid2 p2 closest1 closest_point_segment(mid1, mid1axis1, mid2) closest2 closest_point_segment(mid2, mid2axis2, closest1) dist np.linalg.norm(closest1 - closest2) return dist (r1 r2) # RRT-Connect改进双向搜索 class BiRRTConnect: def __init__(self, start, goal, obstacle_fn): self.start start; self.goal goal self.obstacle obstacle_fn def plan(self): tree_a [self.start] tree_b [self.goal] for _ in range(2000): # 扩展a树 new_a self.extend(tree_a, tree_b, swapFalse) if new_a is not None: # 检查是否连接b树 pass return None # 多模态调度器有限状态机 class TaskScheduler: def __init__(self): self.mode idle def update(self, task_queue, arm1_busy, arm2_busy): if self.mode idle: if len(task_queue) 2 and not arm1_busy and not arm2_busy: self.mode simultaneous elif len(task_queue) 1 and not arm1_busy: self.mode sequential elif self.mode simultaneous: # 检查是否会产生干涉 if self.check_interference(): self.mode sequential return self.mode def check_interference(self): # 简化干涉检查 return False # 手眼标定函数眼在手外 def hand_eye_calibration(robot_poses, camera_poses): # robot_poses: 机器人末端位姿 (4x4矩阵列表) # camera_poses: 标定板在相机坐标系的位姿 from scipy.linalg import svd A []; B [] for i in range(len(robot_poses)): Rr, tr robot_poses[i][:3,:3], robot_poses[i][:3,3] Rc, tc camera_poses[i][:3,:3], camera_poses[i][:3,3] # 构建方程 A * X X * B - 使用Tsai方法 pass return np.eye(4) # 占位如有问题可以直接沟通