基于视觉检测的双机器人标定与协作运动【附代码】
✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)双目视觉与加权最小二乘手眼标定算法:
针对双机器人基座坐标系标定精度低且依赖昂贵激光跟踪仪的问题,设计了一种基于双目视觉与加权最小二乘手眼标定的方法。在主机器人和从机器人的末端分别固定一个非对称圆形靶标,双目相机同步采集两个靶标的图像。通过改进的Canny边缘检测与椭圆拟合算法提取圆心亚像素坐标,并利用PnP求解器获得每个靶标相对于相机坐标系的位姿。然后构建一个双闭环标定模型:主机器人末端与靶标A的变换、相机与靶标A的变换、主机器人基座到相机的关系,以及从机器人的类似链条。为了融合多组观测数据,提出加权最小二乘求解齐次变换矩阵,其中权重系数根据靶标检测的重复性误差动态分配。实验中使用15组不同姿态下的观测数据,标定后的双机器人基座相对位置误差降至0.21mm,角度误差小于0.03度。
(2)动态协同运动与基于速度势场的防碰撞规划:
在双机器人协作搬运异形工件时,为防止末端执行器相互碰撞,设计了一种融合速度势场与模型预测控制的协同运动规划器。首先建立了双机器人工作空间的距离场模型,将每个连杆简化为胶囊体包围盒。然后定义了协作约束条件:主从机器人末端之间的相对位姿必须满足工件夹持的几何关系。在此基础上,提出速度势场法,其中斥力势场不仅包括机器人自身连杆与障碍物,还引入了机器人之间的互斥项。为了平滑轨迹,采用五次B样条曲线对关节空间进行插值,并利用模型预测控制滚动优化未来N个时间步内的关节速度,以最小化跟踪误差和能量消耗。仿真显示,该方法保证了双机器人末端间距始终大于安全阈值40mm,轨迹最大加速度降低了26%。
(3)基于迁移学习的协作误差在线补偿策略:
由于标定残留误差和环境变化,双机器人协作运动的实际轨迹与理论路径存在偏差。为此设计了一种在线误差补偿网络,该网络采用长短时记忆网络与注意力机制,利用历史时刻的实际位置与指令位置误差序列,预测未来时刻的误差补偿量。训练数据来自于虚拟环境中的大量模拟协作任务,通过域随机化生成不同标定误差、负载变化和摩擦系数的场景。将预训练的网络迁移到实体机器人,并使用少量在线采样数据进行微调。在搬运实验中,补偿后主从机器人末端的相对位置误差从标定后的0.5mm进一步降低到0.13mm,同时协作抓取成功率从89%提升到98.5%。该方法无需额外的外部测量设备,完全依靠机器人本体反馈实现。
import cv2 import numpy as np import torch import torch.nn as nn from scipy.optimize import least_squares # 改进椭圆拟合亚像素提取 def detect_circle_subpixel(image): contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt in contours: if len(cnt) < 5: continue ellipse = cv2.fitEllipse(cnt) center, axes, angle = ellipse # 亚像素精度修正 subpix = cv2.cornerSubPix(image, np.int0(center), (5,5), (-1,-1), criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)) return subpix[0] return None # 加权最小二乘手眼标定 def hand_eye_weighted_svd(A_list, B_list, weights): U, _, Vt = np.linalg.svd(np.sum([w * np.kron(a, b) for w, a, b in zip(weights, A_list, B_list)], axis=0)) R = U @ Vt if np.linalg.det(R) < 0: Vt[-1] *= -1 R = U @ Vt t = np.mean([b - R @ a for a, b in zip(A_list, B_list)], axis=0) return R, t # 速度势场防碰撞模块(核心力计算) def velocity_potential_field(pos_self, pos_other, v_self, safe_dist=0.05): diff = pos_self - pos_other dist = np.linalg.norm(diff) if dist < safe_dist: rep_dir = diff / (dist + 1e-6) force_magnitude = 1.0 / (dist + 1e-3) - 1.0 / safe_dist f_rep = force_magnitude * rep_dir v_desired = v_self + 0.1 * f_rep return v_desired return v_self # LSTM在线补偿器 class LSTMCompensator(nn.Module): def __init__(self, input_size=6, hidden_size=64, output_size=6): super().__init__() self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.lstm(x) return self.fc(out[:, -1, :]) # 模拟在线补偿循环 def online_compensation(model, history_errors, device='cpu'): model.eval() with torch.no_grad(): # history_errors shape: (batch, seq_len, 6) input_tensor = torch.tensor(history_errors, dtype=torch.float32).unsqueeze(0).to(device) compensation = model(input_tensor).cpu().numpy().squeeze() return compensation如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
