1. 项目概述与核心需求
在工业自动化领域,机械臂与视觉传感器的协同作业已经成为智能制造的关键技术之一。"眼在手上"(Eye-in-Hand)配置方式通过将深度相机直接安装在UR5机械臂末端,实现了高精度的动态目标识别与抓取。本项目基于Ubuntu 18.04系统,使用Intel RealSense D415深度相机与UR5协作机器人完成完整的手眼标定流程。
这种配置相比固定式相机(Eye-to-Hand)具有三大优势:
- 可随机械臂移动获取多角度视野
- 避免固定安装导致的视觉盲区
- 特别适合小空间内的精密操作场景
2. 环境准备与硬件连接
2.1 系统环境配置
推荐使用Ubuntu 18.04 LTS系统,因其对ROS Melodic和RealSense驱动有最佳兼容性。基础环境搭建步骤如下:
bash复制# 安装ROS Melodic完整版
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-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
sudo apt install ros-melodic-desktop-full
# 安装RealSense SDK
sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
sudo apt install librealsense2-dkms librealsense2-utils librealsense2-dev
注意:安装RealSense驱动时需确保内核版本为4.15.0-xx-generic,其他版本可能需要手动编译DKMS模块
2.2 硬件连接拓扑
典型连接方式如下图所示(文字描述):
- UR5通过网线直连工控机(建议使用静态IP配置)
- RealSense D415通过USB3.0接口连接
- 确保机械臂与相机供电稳定(D415工作电流需≥1A)
3. 标定工具链搭建
3.1 ROS功能包安装
需要安装的关键ROS包及其作用:
| 功能包名称 | 作用 | 安装命令 |
|---|---|---|
| ur_modern_driver | UR5通信驱动 | sudo apt install ros-melodic-ur-modern-driver |
| realsense2_camera | RealSense ROS接口 | sudo apt install ros-melodic-realsense2-camera |
| easy_handeye | 手眼标定工具 | sudo apt install ros-melodic-easy-handeye |
| aruco_ros | 标定板识别 | sudo apt install ros-melodic-aruco-ros |
3.2 标定板选择与制作
推荐使用7x5的Charuco标定板(棋盘格+ArUco标记组合),其优势在于:
- 同时利用棋盘格亚像素精度和ArUco标记鲁棒性
- 可自动校正镜头畸变
- 打印尺寸建议不小于A3幅面
生成标定板参数命令:
bash复制rosrun aruco_ros create_marker -m 7 -s 0.05 -d 0.025 -o charuco_board.pdf
4. 手眼标定全流程
4.1 标定前准备工作
-
机械臂运动空间检查:
- 确保标定板始终在相机视野内
- 规划15-20个均匀分布的机械臂位姿
- 各位置间保持明显视角变化(建议旋转>15°)
-
相机参数配置:
yaml复制# realsense_camera.yaml depth_width: 640 depth_height: 480 depth_fps: 30 enable_color: false # 仅使用深度流
4.2 自动标定步骤
-
启动基础节点:
bash复制
roslaunch ur_modern_driver ur5_bringup.launch robot_ip:=192.168.1.10 roslaunch realsense2_camera rs_camera.launch roslaunch aruco_ros single.launch markerId:=0 markerSize:=0.05 -
运行标定程序:
bash复制
roslaunch easy_handeye calibrate.launch -
按照GUI提示完成以下操作:
- 点击"Take Sample"采集当前位姿数据
- 移动机械臂到新位置后再次采样
- 重复15-20次后点击"Compute"计算标定结果
4.3 标定结果验证
获得的手眼变换矩阵格式示例:
code复制translation:
x: 0.032
y: -0.015
z: 0.128
rotation:
x: -0.707
y: 0.0
z: 0.707
w: 0.0
验证方法:
- 固定标定板位置
- 控制机械臂移动,观察相机坐标系下的标定板位置变化
- 使用rviz查看各坐标系对齐情况
5. 常见问题与解决方案
5.1 标定精度不足
可能原因及对策:
| 现象 | 原因分析 | 解决方案 |
|---|---|---|
| 重复标定结果差异大 | 机械臂定位误差 | 检查UR5的TCP标定精度 |
| Z轴误差明显 | 镜头畸变未校正 | 改用Charuco标定板 |
| 采样时识别失败 | 光照条件变化 | 保持恒定光照或使用红外模式 |
5.2 RealSense特定问题
-
深度流不稳定:
- 检查环境红外干扰(避免阳光直射)
- 调整深度滤波器参数:
bash复制
rosrun rqt_reconfigure rqt_reconfigure
-
USB带宽不足:
bash复制# 查看带宽占用 lsusb -t # 解决方案:关闭彩色流或降低分辨率
6. 进阶优化技巧
6.1 动态标定补偿
对于高精度场景,建议实现:
- 温度补偿:记录标定时的环境温度,运行时进行温度差值补偿
- 负载补偿:不同末端工具重量导致的机械臂形变补偿
6.2 标定自动化脚本
示例自动采样脚本片段:
python复制#!/usr/bin/env python
import rospy
from moveit_commander import MoveGroupCommander
arm = MoveGroupCommander("manipulator")
positions = [...] # 预定义的20个位姿
for pos in positions:
arm.set_joint_value_target(pos)
arm.go(wait=True)
rospy.sleep(1)
# 触发采样信号
...
6.3 标定结果应用
将标定结果集成到MoveIt中的配置示例:
xml复制<!-- ur5_moveit_config/config/fake_controllers.yaml -->
controller_manager_ns: /controller_manager
default_controller: "joint_group_position_controller"
handeye_calibration:
camera_frame: "camera_color_optical_frame"
robot_base_frame: "base_link"
robot_effector_frame: "tool0"
transform: !include handeye_result.yaml
实际项目中我们发现,标定后的重复定位精度可达到±0.3mm以内,完全满足精密装配、分拣等工业场景需求。建议每三个月或在机械结构受到冲击后重新标定,以维持最佳性能。