拓冰建站拓冰建站
首页 / 资讯中心 / 正文

ROS下睿尔曼RM65与RealSense D455手眼标定实操指南

简介面向Ubuntu系统下从事机器人开发的工程师与学习者教程围绕睿尔曼机械臂与RealSense摄像头之间的手眼标定眼在手上展开完整呈现从环境搭建到标定实现的全过程。内容基于Ubuntu 18.04与ROS melodic系统依次讲解OpenCV视觉库编译、RealSense驱动安装、Aruco标记识别功能包配置、easy_handeye标定功能包运行、Moveit运动规划整合、RM机械臂ROS功能包部署并补充环境变量、启动文件编写、依赖项处理等注意事项每一步都给出可验证的配置方法帮助读者降低踩坑概率。资源包共包含1137个文件压缩后体积62.24MB文件类型以launch启动文件、C/Python源码、yaml参数配置、xacro机器人模型、srv/msg消息服务定义为主同时配有cmake/make构建脚本、stl三维模型和调试备份文件对应节点启动、功能定制、参数调整、模型描述与通信定义等不同用途目录按模块组织查找便利。已有5153人学习适合需要完成机械臂视觉标定、搭建视觉抓取平台或研究“眼在手上”方案的开发者作为手边参考。 做机器人抓取项目最容易卡住人的往往不是算法本身而是手眼标定这一步。最近我在Ubuntu 20.04下把睿尔曼RM65六轴机械臂和Intel RealSense D455深度相机做了一次完整的联合标定从ROS环境搭建、相机驱动、标定板识别到位姿采集和矩阵计算全都过了一遍。这篇教程就按我实际走通的流程来写把每条命令、每个参数、每个报错都讲清楚给正在搭视觉抓取环境的同学一个可以直接参考的路径。1. 标定思路与方案选型1.1 手眼标定到底在标什么先说清楚一个容易混淆的概念。机械臂自己知道自己末端在底座坐标系下的位置和姿态但它不知道相机看到的东西在哪个位置相机知道目标物体在自身坐标系下的坐标但不知道这个坐标和机械臂坐标系怎么对应。要让机械臂去抓相机看到的物体就必须求出相机坐标系和机械臂坐标系之间的变换关系这个关系的求解过程就是手眼标定。数学上它对应的是 AX XB 问题。A 是机械臂末端相对底座的变化量B 是标定板相对相机的变化量X 就是我们要的相机到机械臂的固定变换矩阵。通过让机械臂带动标定板移动到多个不同位姿采集多组 A 和 B就能把 X 解出来。所以标定采集的位姿质量直接决定了 X 的精度这也是后面采样环节要特别小心的原因。1.2 两种方案怎么选手眼标定分两种常见情况。第一种叫眼在手外Eye-to-Hand相机固定在一个支架或者工作台旁边标定板装在机械臂末端标定过程中机械臂带着标定板在相机视野里移动。第二种叫眼在手上Eye-in-Hand相机装在机械臂末端标定板固定在工作台上机械臂带着相机去看标定板。我这里用的是眼在手外的方案。原因很直接视觉抓取项目里相机一般固定在工作区上方或侧面视野范围不变标定一次后长期有效逻辑上也更符合“相机看到目标机械臂去抓”的直觉。眼在手上的方案在狭小空间或需要避障的场景中更合适但每次机械臂姿态变化相机视野也会跟着变后续视觉算法的坐标映射会更绕。1.3 工具链选型标定工具我选的是 ROS 生态里最常用的 easy_handeye搭配 aruco_ros 做标定板检测相机驱动用 realsense-ros机械臂用睿尔曼官方的 ROS 包。这套组合的好处是全链路可视化从图像检测到采样计算都在 Rviz 和 GUI 里操作不需要手动去解矩阵很大程度上降低了入门门槛。对比直接用棋盘格加 OpenCV 自己写标定流程的方案aruco 单标记的鲁棒性更好允许部分遮挡检测也更快easy_handeye 自带采样、计算、保存全流程还会在计算后直接给出误差反馈非常适合第一次做标定的同学。要自己写完整套流程也不是不行但排查问题的成本会高很多。2. 环境准备与依赖安装2.1 Ubuntu与ROS版本搭配我用的系统是 Ubuntu 20.04ROS 版本对应的是 Noetic。这个组合非常成熟MoveIt、vision_visp、相机驱动都有现成的二进制包社区问题也最多出问题一搜就有答案。如果系统还没装 ROS先处理软件源国内用户直接配置清华或阿里云的 ROS 镜像源下载速度快很多。嫌手动配置麻烦的可以用鱼香ROS的一键安装脚本能省不少事装完之后记得重新 source 一下环境然后验证一下 roscore 能不能正常起来。我还需要再补一段实际安装ROS时的细节 装完 ROS Noetic 之后强烈建议把 MoveIt 一起装上因为后面控制睿尔曼机械臂移动会用到。命令是 sudo apt install ros-noetic-moveit。准备工作做得越完整后面标定流程越顺。 ### 2.2 RealSense相机驱动安装 RealSense 相机的驱动分两层底层是 Intel 官方的 librealsense2 SDK上层是 realsense-ros 这个 ROS 功能包。先装底层库用官方 apt 源最省事以 Ubuntu 20.04 也就是 focal 为例注册密钥和源之后直接安装 librealsense2-utils 和 librealsense2-dev装完插上相机运行 rs-enumerate-devices 能看到设备序列号就说明底层驱动正常。补一个点D455、D435 这些相机对 USB 带宽要求高实测中插在 USB 3.0 口上并能识别到 SuperSpeed 设备才算正常。如果插在 USB 2.0 口上深度图会掉帧严重标定时精度也会受影响。所以装完驱动第一件事就是确认接口类型。再补上层 realsense-ros 的安装建议放在 catkin_ws 里源码编译git clone 后切换到对应分支。ROS1 下一般是 ros1-legacy 分支catkin_make 完之后用 roslaunch realsense2_camera rs_camera.launch 验证能否发布 /camera/color/image_raw 话题。2.3 睿尔曼机械臂ROS包睿尔曼机械臂的 ROS 包一般由厂商提供拿到后放到 catkin_ws/src 下编译即可。RM65 这类六轴协作臂通常通过以太网连接需要先在机器人示教器或者配置文件里把机械臂 IP 设置好保证工控机和机械臂在同一个网段然后 roslaunch 机械臂驱动节点成功之后会发布 /joint_states 以及 TF 变换。实际生产中机械臂驱动节点的 launch 文件名以厂商包为准常见的是 roslaunch realman_ros realman_api.launch 这种形式。启动后先看 /joint_states 是否有数据同时检查机械臂报不报错。注意机械臂上电之后默认是抱闸状态需要先在示教器上使能伺服否则后续控制指令发过去机械臂也不会动。 ### 2.4 标定工具包aruco_ros和easy_handeye aruco_ros 可以直接用 apt 装命令是 sudo apt install ros-noetic-aruco-ros装完自带 aruco 检测节点和 marker 生成节点。easy_handeye 一般需要源码编译clone 到 catkin_ws/src 后 catkin_make。它依赖 ros-noetic-vision-visp 和 visp_hand2eye_calibration这些都是视觉标定的底层计算库缺失的话编译或运行时会直接报缺包。这里有个小坑要提一下easy_handeye 对 move_group 的命名空间比较敏感如果你的机械臂 move_group 不在默认的 /move_group 下需要去 launch 里改 robot_move_group 参数。我一开始就是没注意这点导致 easy_handeye 怎么都获取不到机械臂位姿后来排查了挺久才发现是命名空间对不上。3. 标定实操完整流程3.1 启动相机和机械臂确认数据流标定之前先把两个核心节点拉起来。相机端启动 realsense2_camera机械臂端启动睿尔曼的 ROS 驱动。然后用 rqt_graph 或者 rostopic list 确认话题都出来了至少要有/camera/color/image_raw 彩色图像/camera/color/camera_info 相机内参/joint_states 机械臂关节状态/tf 机械臂和相机的 TF 变换这里的重点是 TF。easy_handeye 需要从 /tf 读取机械臂末端相对基座的位姿如果驱动包没有正确发布这两个 frame 之间的变换标定界面会一直提示 waiting for robot pose。 ### 3.2 配置 eye_on_base 标定 launch 我的外部相机方案对应的是 eye_on_base_calibration需要手动写一个 launch 文件把相机图像、aruco 检测、easy_handeye 节点统一拉起来。核心配置大致这样 xml launch arg namecamera_topic default/camera/color/image_raw / arg namecamera_info_topic default/camera/color/camera_info / arg namemarker_size default0.05 / arg namemarker_id default10 / arg namerobot_base_frame defaultbase_link / arg namerobot_effector_frame defaulttool0 / node pkgeasy_handeye typecalibrate namehandeye_calibration outputscreen remap fromcamera/image_raw to$(arg camera_topic) / remap fromcamera/camera_info to$(arg camera_info_topic) / param nameeye_on_hand valuefalse / param namerobot_base_frame value$(arg robot_base_frame) / param namerobot_effector_frame value$(arg robot_effector_frame) / param namemarker_size value$(arg marker_size) / param namemarker_id value$(arg marker_id) / /node /launch这几个参数每个都很关键marker_size 是标定板 marker 的实际边长单位米必须量准这个值差 1 毫米最终的平移误差就会放大好几倍robot_base_frame 和 robot_effector_frame 要和睿尔曼 URDF 里的 frame 名称完全一致名字对不上就会一直卡在 waiting for posemarker_id 要和标定板上打印的 ID 对应默认是 10打印出来的文件上是什么 ID 就改成什么。 ### 3.3 移动机械臂并采集标定位姿 启动完标定 launch 之后Rviz 里会出现一个 Hand-Eye Calibration 的界面会实时显示相机画面中检测到的标定板位置。这时候要做的事情就是通过 MoveIt 或者机械臂的示教器把机械臂末端移动到不同位置每动一次就点一次 Take Sample。 采样是全程最容易出问题也最关键的一步。我实际走下来总结的规则是 - 采集点数不要少于 12 组我一般采到 15 组以上再计算。 - 姿态变化要大除了平移之外末端还要有俯仰、偏航、翻滚方向的转动。只平移不旋转是标定里最典型的错误会导致 AXXB 退化算出来的结果在部分方向上是错的。 - 标定板要尽量出现在相机画面的不同区域包括画面中央、边缘、远近不同距离覆盖范围越广结果越稳定。 - 每一次采样前都等机械臂完全停稳运动中的位姿采进去就是噪声。如果用的是示教器手动移动那就在每个采样点位停留一两秒再点采样确保 TF 已经收敛到稳定值。Rviz 界面上的图像会高亮显示当前检测到的 marker如果画面里没有高亮绿色框说明标定板没有被识别到先排查检测环节再继续采样。3.4 计算与保存标定结果采样完成后点一下 Computeeasy_handeye 会调用 VISP 库做手眼标定计算界面上会直接显示重投影误差。这个误差单位是像素数值越小越好。通常超过几个像素就说明采集的位姿质量不高建议重新采样。计算结果没问题后点 Save 会生成一个 YAML 文件里面就是相机到机械臂基座的变换矩阵和对应的平移旋转参数。这个文件最好统一存放在一个固定路径下后续在视觉抓取程序里直接加载。4. 标定结果验证与常见问题4.1 验证标定是否真的可用计算完成不代表标定一定好用必须实测验证。简单有效的方法是把标定板固定在机械臂末端然后让机械臂运动到任意几个不同姿态相机实时检测标定板位姿再通过标定结果变换到机械臂基座坐标系和机械臂自己反馈的末端位姿对比。这两者的差值在 X、Y、Z 方向各小于 5 到 10 毫米在一般视觉抓取场景里基本够用了。如果误差是几十毫米级别返回去重新采样比强行补偿更靠谱。另外验证时不要用和标定时完全相同的一组位姿换几个新位姿更容易暴露标定误差。4.2 常见问题快速排查表把实操中真正遇到过的几类问题整理成一张表基本覆盖了新手标定时 90% 的卡点现象可能原因解决办法相机节点启动后不出图像USB 2.0 接口或带宽不够换 USB 3.0 口用 rs-enumerate-devices 确认 SuperSpeed标定界面一直等待机械臂位姿robot_effector_frame 名字不对或机械臂 TF 没发布用 tf_echo 对比 frame 名称统一 URDF 中的名字图像中检测不到 markermarker 太小、反光、曝光过高换大尺寸标定板调低相机曝光和增益用哑光纸打印标定板能检测到但采样失败标定板和机械臂末端工具没有建立刚体约束确保标定板固定牢固不要有相对晃动计算结果误差很大位姿变化不够或标定板测量尺寸不准确重新采样增加末端旋转角度重测 marker_size4.3 提高标定精度的几个关键点环境光照对 aruco 检测的影响比想象中大。强光直射标定板容易反光暗光下图像噪声也大。在工业现场尽量让标定区域光照均匀必要时用补光灯从侧面打光避免光源正对相机或标定板。标定板本身也要用平整的材料。普通打印纸贴在纸盒上很容易翘边标记一变形检测出来位姿就不准。有条件的话用 3D 打印一个背板把标定板贴在铝板或亚克力板上这块投入非常值得。另外RealSense 出厂自带的相机内参通常会比较准但经过长期使用或温度变化后会有漂移。如果追求高精度用棋盘格做一次相机内参标定再手眼标定效果会更好。5. 实操心得与后续扩展5.1 我踩过的几个坑第一次做标定的时候我把采样点全都集中在一个小的局部区域姿态变化也基本只有平移计算结果看起来好像正常但一实测就发现机械臂稍微转一点角度目标点就偏出去好几厘米。后来才明白姿态变化少会让求解退化看似算完了实际没解出正确结果。还有一个坑是标定板的 frame 变换。标定板装在机械臂末端上之后一定要保证 aruco_ros 检测出的 marker frame 和机械臂末端 tool0 之间的链接是刚性的。如果标定板是通过一个容易晃动的夹具固定的那每次机械臂变换姿态标定板都会有微小晃动这些晃动都会被当成有效位姿计算进矩阵里去误差很小但很致命。5.2 标定结果怎么接进视觉抓取流程标定完成后把保存的 YAML 加载进抓取程序流程就变成了RealSense 先通过物体检测或点云分割拿到目标在相机坐标系下的位姿然后乘以标定的变换矩阵得到目标在机械臂基座坐标系下的位姿最后发给 MoveIt 规划抓取路径。整个流程里的坐标变换链路变清晰之后后续换相机、换夹具甚至换机械臂都只需要重新做一次标定即可。在实际操作中我建议把整个标定启动流程整理成一个脚本每次开机一条命令全部启动不然手动敲 roslaunch 太容易漏节点。标定不是一次性的移动过相机、换过镜头、换过末端工具都应该重新标。把标定当成设备维护的一部分比每次出问题再来回折腾要舒服很多。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门