眼在手上外参标定保姆级教学(Ubuntu 18.04 + ROS)

环境配置:

环境: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
  • 启动顺序

    1. roscore (主节点,终端1):

      复制代码
      roscore
    2. 相机 (终端2):

      复制代码
      roslaunch realsense2_camera rs_camera.launch
      • 测试:输入rostopic list 看是否有 /camera/color/image_raw话题。
    3. 机械臂 (终端3):

      复制代码
      roslaunch elfin_robot_bringup elfin3_bringup.launch
      • 测试:rostopic echo /joint_states 看关节数据。
    4. 标定板检测 (终端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. 标定服务器 (终端5):

      复制代码
      rosrun visp_hand2eye_calibration visp_hand2eye_calibration_calibrator
    6. 标定客户端 (终端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。成功后,您的手眼标定就完成了!

验证标定精度(关键!避免白忙活)

标定后必须验证精度,否则无法确定转换矩阵是否可用。常用验证方法:

  1. 重投影误差验证
    • 用求解出的 X,将机械臂末端的 3D 坐标(或标定板的 3D 坐标)投影到相机图像上,计算投影点与实际像素点的距离(重投影误差);
    • 合格标准:平均误差 < 1 像素(误差越小,精度越高)。
    • 原理: 既然标定板在地面上没动,那么通过不同位置的机械臂坐标和求得的 X,反推回去的标定板在基坐标系下的位置应该是完全重合的。
    • 数学推理逻辑:
  2. 实物抓取验证 (最直接):
    • 让相机识别一个已知尺寸的目标(如立方体),通过 X 转换得到目标在机械臂基坐标系下的坐标;
    • 控制机械臂移动到该坐标进行抓取,观察是否能精准抓住(重复 5-10 次,成功率 > 90% 说明标定有效)。
  3. 轨迹跟踪验证 (视觉伺服场景):
    • 让目标沿已知轨迹移动,相机实时输出目标坐标,通过 X 转换为机械臂关节指令,观察机械臂是否能精准跟踪目标(跟踪误差 <±0.5mm 为合格)。

影响标定精度的关键因素(避坑指南)

  1. 相机内参标定不准确:这是最常见的坑!如果内参(尤其是畸变系数)标错,后续外参求解再精准也没用 ------ 务必用足够多的姿态拍摄标定板,避免镜头边缘区域的畸变未被修正。

  2. 机械臂重复性误差大:机械臂自身的关节精度、末端重复性会直接影响数据采集质量(比如同一姿态两次移动的位姿误差 > 0.1mm,标定结果会失真)------ 标定时先检查机械臂的重复定位精度。

  3. 标定板特征提取失败:标定板反光、模糊、遮挡,或格子尺寸测量错误,会导致姿态 B 计算错误 ------ 选择哑光材质的标定板,确保拍摄时图像清晰,格子尺寸用卡尺精确测量。

  4. 姿态采集不足或分布不均:采集的姿态太少(<10 组),或只在一个小范围移动,会导致 X 矩阵解不唯一 ------ 务必让机械臂覆盖全工作空间,姿态包含旋转(±30°)和平移(不同距离)。

  5. 安装松动:眼在手模式下相机与末端连接松动,或眼在基座模式下标定板与末端连接松动 ------ 标定时务必拧紧固定螺丝,避免运动中移位。

  6. 位姿单位(mm vs m)一致;D435 畸变需 undistortImage 处理

  7. 标定板务必测量并记录格子尺寸(精确到 0.1mm)

  8. 标定的精度依赖数据量和姿态分布,关键是 "让机械臂移动到不同位置,采集足够多的独立姿态"。需避免姿态重复

六、实际应用场景(结合你的研究方向)

  1. 机械臂抓取:眼在手模式下,相机拍摄目标物体,通过手眼矩阵 X 将目标的图像坐标转换为机械臂基坐标系下的 3D 坐标,机械臂根据该坐标规划路径,精准抓取(比如抓取传送带上的零件)。
  2. 视觉伺服:眼在基座模式下,相机实时跟踪机械臂末端和目标,通过 X 矩阵建立图像误差(目标像素与末端像素的偏差)与机械臂关节运动的映射,实现闭环控制(比如冗余机械臂的轨迹跟踪,通过视觉反馈修正关节误差)。
  3. 精密装配:通过手眼标定建立相机与机械臂的高精度坐标映射,让机械臂能根据相机反馈调整姿态,完成微小零件的装配(如电子元件焊接、芯片封装)。
相关推荐
南山电子nscn7 小时前
长晶高PSRR LDO产品在高速相机与手机摄像头中的应用分析
数码相机·智能手机·ldo
春日见9 小时前
眼在手上外参标定保姆级教学---离线手眼标定(vscode + opencv)
linux·运维·开发语言·人工智能·数码相机·计算机视觉·matlab
Tel1992530800419 小时前
高速相机触发脉冲计数器信号采集模块 4倍频 5Mhz 的高速脉冲进行计数
数码相机·物联网·3dsmax·工业自动化·仪器仪表·工控设备
qq_526099131 天前
稳定耐用工业图像采集卡 | 宽温工作环境,适配恶劣工业场景
数码相机
思维新观察1 天前
理光 GR IV HDF 版发布:用喷墨技术重构光影质感
数码相机
春日见1 天前
如何跑通,吃透一个开源项目?
linux·运维·开发语言·数码相机·matlab
博图光电2 天前
当常规视觉 “束手无策”,BTIR 短波红外相机开启 “穿透式” 成像革命
数码相机
Tel199253080042 天前
CCD相机同步外触发拍照抓拍识别高速脉冲计数器信号采集模块
单片机·数码相机·物联网·自动化·工业自动化·仪器仪表
TTGGGFF2 天前
具身智能:零基础入门睿尔曼机械臂(六)——手眼标定代码库详解,从原理到实践
数码相机·机械臂·具身智能