环境配置:
环境:Ubuntu 18.04 + ROS Melodic(不能是虚拟机!!)
更新cmake版本,不然有些包无法编译:
第一步:卸载系统旧版本 CMake(可选,但避免冲突)
# 卸载默认的cmake 3.10.2 sudo apt remove --purge cmake sudo apt autoremove第二步:安装新版 CMake(3.28+,适配 Ubuntu 18.04)
Ubuntu 18.04 的官方源没有高版本 CMake,需从 CMake 官网下载预编译二进制包:
# 进入临时目录(方便清理) cd /tmp # 下载CMake 3.28.3预编译包(x86_64架构,适配Ubuntu 18.04) wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.tar.gz # 解压到/usr/local(系统级路径,全局可用) sudo tar -zxvf cmake-3.28.3-linux-x86_64.tar.gz -C /usr/local # 创建软链接(让系统识别cmake命令) sudo ln -s /usr/local/cmake-3.28.3-linux-x86_64/bin/cmake /usr/bin/cmake sudo ln -s /usr/local/cmake-3.28.3-linux-x86_64/bin/cpack /usr/bin/cpack sudo ln -s /usr/local/cmake-3.28.3-linux-x86_64/bin/ctest /usr/bin/ctest第三步:验证 CMake 版本(确认升级成功)
cmake --version✅ 成功标志:输出
cmake version 3.28.3(而非 3.10.2)。
安装基础常用功能包:
sudo apt install ros-melodic-joint-trajectory-controller #下载关节控制包
sudo apt install ros-melodic-moveit-core #下载moveit包
sudo apt install ros-melodic-gazebo-ros ros-melodic-gazebo-ros-pkgs ros-melodic-gazebo-ros-control #下载gazebo包
sudo apt install ros-melodic-tf-conversions
sudo apt install ros-melodic-robot-state-publisher
sudo apt install ros-melodic-joint-state-publisher ros-melodic-robot-state-publisher
sudo apt install libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev
创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make #编译
source devel/setup.bash
安装 Elfin E03 功能包及其依赖:
cd ~/catkin_ws/src
git clone -b melodic https://github.com/huayan-robotics/elfin_robot.git
cd ..
rosdep install --from-paths src --ignore-src -r -y #安装需要的相关依赖
cd src
git clone https://github.com/OpenEtherCATsociety/SOEM.git #soem(Simple Open EtherCAT Master,轻量级 EtherCAT 主站库)没有 ROS Melodic 官方预编译的 deb 包(无法用apt install直接装),而你的elfin_ethercat_driver(埃尔芬机械臂 EtherCAT 驱动)依赖该库
#如果github无法克隆,就直接在虚拟机打开github仓库下载,然后拖到src目录下
cd ..
catkin_make #要在工作空间目录下编译
source devel/setup.bash
roslaunch elfin_robot_bringup elfin3_bringup.launch #启动 Elfin3 机器人的基本模型发布和状态发布服务,为后续的 RViz 可视化、MoveIt 运动规划、仿真或真实机器人控制做准。(Elfin E03 对应 elfin3 模型;配置 IP 为 192.168.1.10 或实际地址)。该包提供 API 如 /elfin_ros_control/elfin/get_current_cartesian_position 服务,用于实时获取 XYZWPR 位姿。
#启动rviz测试
#打开新终端
catkin_make #要在工作空间目录下编译
source devel/setup.bash
roslaunch elfin3_moveit_config moveit_planning_execution.launch #启动rviz,测试
部署librealsense SDK:
sudo apt install ros-melodic-realsense2-camera
sudo apt install ros-melodic-realsense2-description
安装 librealsense2-dkms librealsense2-utils librealsense2-dev功能包:

测试:
roslaunch realsense2_camera rs_camera.launch #(发布 /camera/color/image_raw、depth/image_rect_raw 和 /camera/color/camera_info 话题)。
realsense-viewer #打开gui界面测试
安装手眼标定工具:
easy_handeye(推荐,简单自动化):克隆到 src:
cd ~/catkin_ws/src
git clone https://github.com/IFL-CAMP/easy_handeye.git
安装依赖:
- rosdep install --from-paths src --ignore-src -r -y
- 然后 catkin_make。
- 备用:visp_hand2eye_calibration:sudo apt install ros-melodic-visp-hand2eye-calibration。
- OpenCV:ROS Melodic 默认包含 OpenCV 3.2;如果需更高版本,手动编译,但通常足够。
安装所需包(visp_hand2eye_calibration、aruco_ros、realsense2_camera、elfin_robot)
完整手眼标定过程:从硬件连接到软件启动和标定计算
设备型号:
大族 Han's Robot Elfin E03 机械臂
Intel RealSense D435 相机)
(相机固定在机械臂末端,标定板固定在外部)
准备工作
- 安全注意:确保机械臂启用低速模式(<250mm/s)
- 标定板:打印 ArUco marker(ID=582,大小80mm)。固定在工作台上,确保相机视野覆盖
- 电脑:Ubuntu 18.04,ROS Melodic 已安装,环境已经配置好。电脑需有 Ethernet 端口(机械臂以太网接口)和 USB 3.0 端口(相机)
步骤 1: 连接硬件设备
1.1 连接 Elfin E03 机械臂
- 电源连接 :
- 将机械臂控制器电源线插入 220V AC 插座(确认电压匹配,手册指定 200-240V AC)。
- 按控制器上的电源开关打开(绿色灯亮表示正常)。
- Ethernet 连接 :
- 用网线连接电脑 Ethernet 端口到控制器 LAN 端口(默认 IP: 192.168.0.10)。
- 在电脑设置静态 IP:打开设置 → 以太网→ IPv4 → 手动,IP: 192.168.0.99,子网: 255.255.255.0
- 测试连接:ping 192.168.0.10(应有响应)。
- 末端执行器连接:相机固定在末端 flange 上(用螺丝固定,确保稳定)。如果有工具,设置 TCP(Tool Center Point)在软件中调整。
- 安全连接:连接急停按钮和安全门(如果有),确保协作模式启用。
1.2 连接 RealSense D435 相机
- USB 连接 :
- 用 USB 3.0 线缆连接相机到电脑 USB 3.0 端口(必须 3.0,否则深度数据丢帧)。
- 相机不需要外部电源(USB 供电)。
- 固定相机 :
- 用螺丝或支架固定在机械臂末端 flange 上,镜头朝外。
- 确保线缆固定,不影响臂运动。
- 将usb接口切换到虚拟机下(虚拟机---可移动设备----选择你的相机----连接)
- 测试硬件 :
-
打开终端运行 lsusb 检查设备,应该看到类似以下一行(关键是 8086:0b07 VID:PID,这是 D435 的 USB ID):
Bus 00X Device 00Y: ID 8086:0b07 Intel Corp. Intel(R) RealSense(TM) Depth Camera 435用 RealSense Viewer 测试:rs-enumerate-devices #
rs-enumerate-devices是 Intel RealSense SDK(librealsense2)提供的核心命令行调试工具 ,核心作用是:扫描并列出当前系统上已连接的所有 Intel RealSense 深度相机的详细硬件信息、功能配置和连接状态 ,无需图形界面(如realsense-viewer),是排查相机连接 / 驱动问题的首选工具 -
终端运行
realsense-viewer进行测试,看看是否需要更新固件
-

-
rqt_image_view 实时查看相机图像
-
步骤 2: 启动程序(软件环境)
-
每个终端先清理 Anaconda 干扰 (复制以下到每个新终端):
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin" unset PYTHONPATH source /opt/ros/melodic/setup.bash source ~/catkin_ws/devel/setup.bash -
启动顺序 :
-
roscore (主节点,终端1):
roscore -
相机 (终端2):
roslaunch realsense2_camera rs_camera.launch- 测试:输入rostopic list 看是否有 /camera/color/image_raw话题。
-
机械臂 (终端3):
roslaunch elfin_robot_bringup elfin3_bringup.launch- 测试:rostopic echo /joint_states 看关节数据。
-
标定板检测 (终端4,用 ArUco):
roslaunch aruco_ros single.launch markerId:=582 markerSize:=0.08 image:=/camera/color/image_raw camera_info:=/camera/color/camera_info marker_frame_name:=marker- 测试:把标定板放进视野,rostopic echo /aruco_single/pose 看位姿数据。
-
标定服务器 (终端5):
rosrun visp_hand2eye_calibration visp_hand2eye_calibration_calibrator -
标定客户端 (终端6,弹出 RViz):
rosrun visp_hand2eye_calibration visp_hand2eye_calibration_client
-
步骤 3: 执行标定计算
- RViz 打开后,移动臂,让标定板完整可见(ArUco 绿色框)。
- 按 s 保存样本(终端输出 added sample)。
- 重复 15-20 次(不同位姿)。
- 按 c 计算(输出 X 矩阵)。
- 按 q 退出。
步骤 4: 验证和使用 X
-
X 输出如:
hand_camera: translation: x: 0.1 y: 0.2 z: 0.3 rotation: x: 0.086 y: -0.086 z: 0.216 w: 0.969 -
发布 TF:
#在 ROS 的 TF(坐标系变换)系统中,发布一个相机与机械臂末端安装关系的「静态(固定不变)」的坐标变换关系 rosrun tf static_transform_publisher 0.1 0.2 0.3 0.086 -0.086 0.216 0.969 elfin_end_link camera_color_optical_frame 100 -
测试:用 RViz 查看 TF 树,确保连接正常。
如果报错,检查 IP、端口或重新 catkin_make。成功后,您的手眼标定就完成了!
验证标定精度(关键!避免白忙活)
标定后必须验证精度,否则无法确定转换矩阵是否可用。常用验证方法:
- 重投影误差验证 :
- 用求解出的 X,将机械臂末端的 3D 坐标(或标定板的 3D 坐标)投影到相机图像上,计算投影点与实际像素点的距离(重投影误差);
- 合格标准:平均误差 < 1 像素(误差越小,精度越高)。
- 原理: 既然标定板在地面上没动,那么通过不同位置的机械臂坐标和求得的 X,反推回去的标定板在基坐标系下的位置应该是完全重合的。
- 数学推理逻辑:

- 实物抓取验证 (最直接):
- 让相机识别一个已知尺寸的目标(如立方体),通过 X 转换得到目标在机械臂基坐标系下的坐标;
- 控制机械臂移动到该坐标进行抓取,观察是否能精准抓住(重复 5-10 次,成功率 > 90% 说明标定有效)。
- 轨迹跟踪验证 (视觉伺服场景):
- 让目标沿已知轨迹移动,相机实时输出目标坐标,通过 X 转换为机械臂关节指令,观察机械臂是否能精准跟踪目标(跟踪误差 <±0.5mm 为合格)。
影响标定精度的关键因素(避坑指南)
-
相机内参标定不准确:这是最常见的坑!如果内参(尤其是畸变系数)标错,后续外参求解再精准也没用 ------ 务必用足够多的姿态拍摄标定板,避免镜头边缘区域的畸变未被修正。
-
机械臂重复性误差大:机械臂自身的关节精度、末端重复性会直接影响数据采集质量(比如同一姿态两次移动的位姿误差 > 0.1mm,标定结果会失真)------ 标定时先检查机械臂的重复定位精度。
-
标定板特征提取失败:标定板反光、模糊、遮挡,或格子尺寸测量错误,会导致姿态 B 计算错误 ------ 选择哑光材质的标定板,确保拍摄时图像清晰,格子尺寸用卡尺精确测量。
-
姿态采集不足或分布不均:采集的姿态太少(<10 组),或只在一个小范围移动,会导致 X 矩阵解不唯一 ------ 务必让机械臂覆盖全工作空间,姿态包含旋转(±30°)和平移(不同距离)。
-
安装松动:眼在手模式下相机与末端连接松动,或眼在基座模式下标定板与末端连接松动 ------ 标定时务必拧紧固定螺丝,避免运动中移位。
-
位姿单位(mm vs m)一致;D435 畸变需 undistortImage 处理
-
标定板务必测量并记录格子尺寸(精确到 0.1mm)
-
标定的精度依赖数据量和姿态分布,关键是 "让机械臂移动到不同位置,采集足够多的独立姿态"。需避免姿态重复
六、实际应用场景(结合你的研究方向)
- 机械臂抓取:眼在手模式下,相机拍摄目标物体,通过手眼矩阵 X 将目标的图像坐标转换为机械臂基坐标系下的 3D 坐标,机械臂根据该坐标规划路径,精准抓取(比如抓取传送带上的零件)。
- 视觉伺服:眼在基座模式下,相机实时跟踪机械臂末端和目标,通过 X 矩阵建立图像误差(目标像素与末端像素的偏差)与机械臂关节运动的映射,实现闭环控制(比如冗余机械臂的轨迹跟踪,通过视觉反馈修正关节误差)。
- 精密装配:通过手眼标定建立相机与机械臂的高精度坐标映射,让机械臂能根据相机反馈调整姿态,完成微小零件的装配(如电子元件焊接、芯片封装)。