手把手教你用Python实现AUBO机械臂与相机的自动标定(附开源代码)

张开发
2026/6/27 1:58:03 15 分钟阅读
手把手教你用Python实现AUBO机械臂与相机的自动标定(附开源代码)
手把手教你用Python实现AUBO机械臂与相机的自动标定附开源代码在工业自动化领域机械臂与视觉系统的协同作业已成为智能制造的核心技术之一。而实现这一协同的关键在于精确建立机械臂坐标系与相机坐标系之间的转换关系——这就是手眼标定的核心任务。本文将带你从零开始通过Python和ROS实现AUBO机械臂的自动化标定流程不仅提供可立即运行的完整代码还会深入解析每个环节的技术要点。1. 环境准备与工具链搭建1.1 硬件配置清单实现高精度手眼标定需要以下硬件支持AUBO机械臂建议i5或i7系列工业相机支持ROS驱动如Basler、PointGrey等标定板推荐使用ArUco二维码标定板千兆以太网交换机确保机械臂、相机与主机的稳定通信注意所有设备应接入同一局域网并确保IP地址配置正确1.2 软件依赖安装通过以下命令安装核心依赖包# 安装ROS NoeticUbuntu 20.04 sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update sudo apt install ros-noetic-desktop-full # 安装Python3工具链 sudo apt install python3-pip python3-catkin-tools pip3 install numpy opencv-contrib-python scipy1.3 工作空间初始化创建ROS工作空间并克隆标定代码库mkdir -p ~/handeye_ws/src cd ~/handeye_ws/src git clone https://gitee.com/ohhuo/handeye-calib.git cd .. catkin_make source devel/setup.bash2. 机械臂通信配置2.1 AUBO Python SDK集成AUBO机械臂通过专用SDK进行控制需先配置通信接口# 示例aubo_comuniate_py_3.py核心代码片段 import aubo_robot_namespace as aubo from aubo_robot_control import AuboRobot class AuboComuniate: def __init__(self, host): self.robot AuboRobot() ret self.robot.initialize(host) if ret ! aubo.RobotErrorType.RobotError_SUCC: raise ConnectionError(机械臂连接失败) def get_pose(self): 获取当前末端位姿 pose self.robot.get_current_waypoint() return [pose.pos.x, pose.pos.y, pose.pos.z, pose.ori.w, pose.ori.x, pose.ori.y, pose.ori.z]2.2 网络参数调优在aubo_comuniate.launch中配置关键参数launch arg nameaubo_host default192.168.1.100 / node pkgaubo_comuniate typeaubo_comuniate_py_3.py nameaubo_comuniate outputscreen param nameupdate_rate value50 / !-- 数据更新频率(Hz) -- param nameaubo_host value$(arg aubo_host) / /node /launch3. 视觉标定系统搭建3.1 相机标定与ArUco检测使用OpenCV实现高精度标定板检测import cv2.aruco as aruco def detect_marker(image): gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) aruco_dict aruco.Dictionary_get(aruco.DICT_6X6_250) parameters aruco.DetectorParameters_create() corners, ids, _ aruco.detectMarkers(gray, aruco_dict, parametersparameters) if len(corners) 0: rvec, tvec, _ aruco.estimatePoseSingleMarkers( corners, 0.05, camera_matrix, dist_coeffs) return tvec[0][0], rvec[0][0] # 返回平移和旋转向量 return None, None3.2 视觉-机械臂坐标转换建立相机坐标系到机械臂基坐标系的转换关系 $$ \begin{bmatrix} X_r \ Y_r \ Z_r \ 1 \end{bmatrix} T_{base}^{tool} \cdot T_{tool}^{cam} \cdot T_{cam}^{marker} \cdot \begin{bmatrix} X_m \ Y_m \ Z_m \ 1 \end{bmatrix} $$其中$T_{base}^{tool}$机械臂末端到基座的变换矩阵$T_{tool}^{cam}$手眼矩阵待求参数$T_{cam}^{marker}$标定板在相机中的位姿4. 自动化标定流程实现4.1 数据采集策略设计智能采集算法确保数据多样性def auto_capture_strategy(robot): poses [] # 在机械臂工作空间内生成均匀分布的目标点 for z in np.linspace(0.3, 0.6, 3): for x in np.linspace(-0.2, 0.2, 5): for y in np.linspace(-0.2, 0.2, 5): if robot.move_to(x, y, z): if (marker_pose : get_marker_pose()) is not None: poses.append((robot.get_pose(), marker_pose)) return poses4.2 标定算法核心实现采用Tsai-Lenz算法求解手眼矩阵def tsai_lenz_solve(X, Y): X: 机械臂末端位姿列表 [N x 6] Y: 标定板位姿列表 [N x 6] A, B [], [] for i in range(len(X)-1): A.append(se3_log(se3_inv(X[i]) X[i1])) B.append(se3_log(Y[i] se3_inv(Y[i1]))) # 构建最小二乘问题 M np.zeros((9,9)) for a, b in zip(A, B): M np.kron(a, b.T) # SVD分解求解 U, S, Vt np.linalg.svd(M) return Vt[-1].reshape(3,3)4.3 标定结果验证通过重投影误差评估标定质量def evaluate_calibration(T_cam_tool, samples): errors [] for tool_pose, marker_pose in samples: # 将标定板位姿转换到机械臂基坐标系 predicted tool_pose T_cam_tool marker_pose # 与实际测量值比较 error np.linalg.norm(predicted[:3,3] - ground_truth[:3,3]) errors.append(error) return np.mean(errors), np.std(errors)5. 工程实践中的优化技巧5.1 运动轨迹规划设计合理的机械臂运动路径保持标定板始终在相机视野中心区域避免快速运动导致的图像模糊覆盖机械臂工作空间的主要区域5.2 异常数据处理实现自动数据过滤机制def filter_outliers(data, sigma2): poses np.array([d[0][:3] for d in data]) mean np.mean(poses, axis0) std np.std(poses, axis0) filtered [] for d in data: if np.all(np.abs(d[0][:3] - mean) sigma*std): filtered.append(d) return filtered5.3 实时可视化监控使用RViz实现标定过程可视化rosrun rviz rviz -d $(rospack find handeye-calib)/config/handeye.rviz在项目实践中我们发现标定精度受以下因素显著影响机械臂重复定位精度建议0.1mm标定板制作精度建议使用激光雕刻环境光照稳定性推荐使用同轴光源数据采集数量通常需要30-50组有效数据

更多文章