YAOTU INSIGHTS

睿尔曼机械臂与RealSense手眼标定实战:从坐标系对不齐到精准抓取

睿尔曼机械臂与RealSense手眼标定实战:从坐标系对不齐到精准抓取
简介面向机器人开发者与 ROS 学习者的手眼标定实践教程基于 Ubuntu 18.04 与 ROS Melodic针对睿尔曼机械臂和 RealSense D435 摄像头实现“眼在手上”配置。内容涵盖 ROS 系统搭建、OpenCV 3.2.0 环境编译、Aruco 标记识别、easy_handeye 手眼标定、Moveit! 运动规划以及 RM 机械臂 ROS 功能包的编译与测试并附 Catkin-tools 工具链配置可支撑从环境搭建到标定运行的完整链路。资源共 1137 个文件以 cmake/make 构建脚本、launch 启动文件、xacro 模型、yaml 参数配置以及 py/cpp 源码为核心同时包含 srv/msg 消息定义、rviz 视图和 shell 环境脚本便于理解工程结构与二次开发。压缩包整体约 62.24MB目录结构清晰按模块分类存放。目前已有 5153 人学习适合希望快速复现 ROS 机械臂视觉标定流程并深入理解各功能包协作方式的开发者。 把睿尔曼机械臂和 RealSense 相机摆到同一张桌子上装好 Ubuntu 和 ROS第一次在 rviz 里把机械臂模型和相机点云放在一起时你会看到两个互相不认识的世界机械臂在/base_link坐标系里活动相机的点云却挂在/camera_link下位置对不上、姿态也对不上。要让机械臂去抓相机看到的杯子就必须先在两个坐标系之间建立一座桥这座桥就是一次机械臂与相机的手眼标定。本文就把 Ubuntu、ROS、睿尔曼机械臂、RealSense 相机这套组合下的标定流程完整走一遍适合已经能独立启动机械臂和相机、但还卡在“两个坐标系对不上”这一关的开发者。不过先泼一盆冷水这篇文章讲的手眼标定不是相机内参标定。内参标定解决的是“像素坐标对应相机坐标系里的哪个方向”手眼标定解决的是“相机坐标系和机械臂坐标系之间的位置姿态关系”。这两个问题经常被混在一起说实操中必须先分清否则到后面你都不知道自己标出来的矩阵到底用在哪一步。1. 别急着敲命令先搞清楚标定要算的是哪个坐标变换很多人一上来就装 aruco、装 easy_handeye然后对着 rviz 面板乱点最后拿到的矩阵看着像模像样一跑实际抓取就翻车。问题往往不是工具不好用而是连要标定什么都还没想清楚。1.1 从像素到机械臂坐标中间隔了几层变换一个物体从相机画面到机械臂能抓坐标至少经历了四次变换像素坐标系 → 相机内参 → 相机坐标系 → 手眼外参 → 机械臂基座坐标系。相机内参描述的是镜头本身的畸变和焦距这个通常由相机出厂参数或单独的相机标定得到比较稳定我们常说的机械臂与相机标定要算的是后面那个手眼外参也就是相机坐标系和机械臂坐标系之间那个平移加旋转的关系。如果跳过了手眼外参哪怕你像素检测得再准机械臂也只会朝错误方向抓。这里有个很直观的类比你站在楼上看到楼下花园里有把椅子你只知道椅子的方向却不知道自己所在的楼相对于花园在哪个位置你是没法走过去拿到椅子的。手眼外参就是“你这栋楼在花园旁边的位置和朝向”没有它方向看得再清楚也没用。1.2 先回答相机是装在机械臂上还是固定在旁边手眼标定分两种术语叫 eye-in-hand 和 eye-to-hand。判断方法非常简单机械臂运动的时候相机跟着动就是 eye-in-hand机械臂运动相机纹丝不动就是 eye-to-hand。睿尔曼机械臂最常见的两种部署正好对应这两种模式把 RealSense 用支架固定在机械臂前方工作台上让它盯着整个操作区域这是 eye-to-hand把 D405 直接装在机械臂末端法兰上让相机跟着机械臂靠近工件这是 eye-in-hand。两种模式的标定流程、启动参数、输出坐标系都不一样选错了后面所有数据都白采。1.3 AXXB 还是 AXZB别被公式吓到手眼标定的底层数学是解一个刚性变换方程。eye-in-hand 时标定板固定不动机械臂带着相机移动解的是 AXXB机械臂末端在两个位姿之间的变换是 A相机观察到标定板在两个位姿之间的变换是 B中间固定的手眼关系是 Xeye-to-hand 时标定板通常装在机械臂末端相机固定方程会变成 AXZB 这种形式多出来的 Z 是相机到机械臂基座的固定变换。你不需要手动推这些公式easy_handeye 这类工具会根据你选择的模式自动求解。但你必须理解一件事不管解哪个方程背后的约束都是“同一个标定板在不同坐标系下的几何关系不能矛盾”。理解了这一点你看到求解结果时才会判断它到底合理不合理而不是工具给个数字你就敢拿去用。2. 环境搭建里最容易翻车的三个细节睿尔曼机械臂和 RealSense 的驱动安装本身不算难真正让人头疼的是各种版本配对和通信问题。我把实操中踩过、也看别人踩过的坑集中说一下。2.1 Ubuntu、ROS 与驱动版本配对比较顺手的组合是 Ubuntu 20.04 ROS Noetic librealsense2 realsense-ros这套组合资料最多、兼容问题最少。如果机器性能吃紧Ubuntu 18.04 ROS Melodic 也能跑但没必要给自己找不痛快。ROS 本身的安装如果你不想一行行手动装可以用鱼香ROS一键安装脚本国内社区用得很多它会自动处理换源、依赖库这些琐事装完基本不会卡住。装完之后记得把source /opt/ros/noetic/setup.bash写进~/.bashrc否则每个新开的终端都找不到 ros 命令。2.2 睿尔曼机械臂连不上八成是网段问题睿尔曼机械臂的 ROS 驱动通常走网口通信。我见过太多人驱动编译半天结果问题根本不在编译而是电脑有线网卡和机械臂不在同一个网段。机械臂的默认 IP 在官方驱动包的 README 里写得清清楚楚你把电脑有线网卡配到同一个网段先在终端里ping机械臂的 IP通了再启动 ROS 驱动。ping 通了也不代表万事大吉。启动驱动后先rostopic list找到关节状态话题再rostopic echo看一下话题是否有数据、数据里的关节角是否随手动示教在变化。这一步是为了确认话题名、坐标系名和后续标定工具配置一致。很多标定失败不是算法问题而是驱动发布的话题名和标定工具默认监听的话题名对不上。2.3 RealSense先跑通 viewer再跑 ROS 包RealSense 在 Ubuntu 下分两层底层是 librealsense 驱动上层是 realsense-ros 功能包。安装后我强烈建议先用realsense-viewer验证一下相机彩色图、深度图都能正常显示再继续往下走。如果 viewer 里就是黑屏或者报错说明底层驱动或 USB 带宽有问题这种状态下去跑 ROS 包只会得到一堆空话题。确认相机正常后再roslaunch realsense2_camera rs_camera.launch。这里的细节是把深度对齐选项打开让深度图和彩色图对齐到同一个坐标系。后面做像素级定位时对不齐的图会让你多折腾好几个小时不如一开始就统一。3. 手眼标定实操从打印标定板到拿到外参矩阵环境都跑通之后就到了最核心的部分。按下面的流程走正常情况下一个小时以内能拿到一份可用的外参。3.1 工具选型为什么直接用 easy_handeye而不是 OpenCV 裸求解OpenCV 里也有calibrateHandEye函数但它是纯求解器你需要自己写采样管理、可视化标定结果、发布 tf 这一整套流程对很多项目来说工作量不小。easy_handeye 把这些事打包好了它内置标定板检测、位姿采样、求解、结果保存还在 rviz 里提供了图形化面板鼠标点几下就能完成采集和计算。对睿尔曼 RealSense 这套组合我推荐的搭配是 easy_handeye aruco 标定板。aruco 板单张图就能提供足够的信息来解算姿态不需要像棋盘格那样保证完整出现在画面里对机械臂工作场景友好很多。3.2 标定板尺寸和单位标定失败的头号原因打印一张 aruco 标定板或者直接用显示器显示都可以。但有一个点必须反复确认单个 marker 的物理边长要准确测量单位是米。easy_handeye 配置里的marker_size填的是这个值配套的marker_separationmarker 间距也要填对。这个步骤看着简单实际是新手翻车率最高的一环。填写单位错误比如把厘米当米或者测量误差超过几毫米最终平移误差会被直接放大好几倍。有过一次惨痛教训之后我的习惯是标定前用游标卡尺量三遍确认无误再启动程序。标定板尺寸这种低级错误往往会让结果出现方向一致、大小成比例的整体偏移。3.3 完整操作流程与采样姿势整体流程按下面的顺序走思路会清晰很多启动睿尔曼机械臂 ROS 驱动确认能收到关节状态话题。启动 RealSense 相机确认彩色图像话题有输出。启动 aruco 检测节点在 rviz 里能看到标定板被识别并渲染出坐标轴。启动 easy_handeye启动参数里选择 eye-in-hand 还是 eye-to-hand这两个模式不要选错。手动控制机械臂运动让相机从多个角度观察标定板每到一个位置在 rviz 的 Hand-Eye 面板里点击 Take Sample记录这一组对应关系。采集 10-15 组数据后点击 Compute 求解。采样姿势直接决定标定成败。最关键的一条是姿态差异要大不要只平移不旋转也不要每个姿态都长得差不多。如果机械臂只是缓缓移动了几厘米姿态几乎没变那几组数据在数学上是高度相关的解出来的结果极不稳定。建议每组之间让机械臂末端有明显的位置变化和角度旋转。另外一个容易忽略的点是eye-to-hand 模式下相机固定不动标定板要放在机械臂工作空间内让机械臂末端带着标定板在多个位置停留eye-in-hand 模式下标定板固定不动机械臂带着相机移动。如果采样过程中动了不该动的东西整个标定结果都会作废不要问我是怎么知道的。3.4 求解、保存与发布 TF点击 Compute 之后工具会显示计算误差。误差偏大就说明采样数据有问题可以删掉个别看起来异常的采样组再重新计算。满意后把结果保存成 yaml 文件里面就是相机到机械臂基座eye-to-hand或相机到机械臂末端eye-in-hand的平移和四元数。保存之后用static_transform_publisher发布成静态 tf或者写一个 launch 文件在每次启动时加载。这里有一个原则这个外参只对标定当时的硬件布局有效。一旦机械臂底座被移动过或者相机被拆下来重新装过哪怕只是挪了几厘米都必须重新标定。很多人标完一次之后用很久都没发现问题直到换了个工位才发现精度崩了这个坑提前记住能省很多事。4. 标定完别急着抓取验证方法、高频问题和精度优化拿到外参矩阵只是第一步能不能用必须用实际动作去验证。我见过不少团队卡在“外参看起来没问题一抓就偏”的状态其实问题往往出在验证方式上。4.1 三分钟验证指认测试最直接的验证方式是做一个“指认测试”。把标定板放在机械臂工作空间内相机识别到标定板角点后把角点在相机坐标系下的三维坐标通过 tf 变换到机械臂基座坐标系然后让机械臂末端移动到那个坐标位置。如果机械臂末端能准确落在角点附近说明标定结果可用如果差好几厘米多半是标定板尺寸、坐标系选择或采样数据有问题。这个验证不需要额外的传感器不需要复杂的程序几分钟就能做完却能把 90% 的标定问题暴露出来。4.2 高频问题与根因对照现象常见根因平移误差整体偏大marker_size 单位或数值填错标定板测量不准确计算报错或结果发散标定板在画面中太小采样姿态太单一或某一帧检测失败某几个采样点明显异常采样过程中机械臂或相机被碰动标定板反光导致检测抖动rviz 出现 tf conflict原有的 camera_link 静态 tf 和标定结果冲突或坐标系名称不一致depth 图在验证位置有大片空洞物体距离超出相机最佳工作距离或强光直射干扰这些问题的排查顺序也有讲究。先用 rostopic 检查各话题频率是否稳定再确认 tf 树里没有冲突最后才去怀疑标定结果本身。很多时候不是工具和算法的问题而是链路中的某个环节根本没给到正确的数据。4.3 精度优化经验如果验证发现误差在可接受范围内但还不够理想可以从这几个方向继续优化。光照条件对 RealSense 的影响非常明显特别是深度图。强光直射会让深度值出现明显噪声甚至空洞标定场景最好保持光线均匀柔和避免阳光或者射灯直接打在标定板上。采样覆盖也值得再抠一抠。标定板在画面里的位置不要总固定在正中心边缘、角落、近处、远处都要有采样这样解出来的外参在视野边缘区域才不会明显退化。我习惯在采完 10 组之后刻意把机械臂挪到工作空间的边界位置再补几组。还有一个细节如果你的目标是用深度图做抓取定位验证时就不要只看彩色图上的误差。先把深度话题和彩色话题对齐好再用深度图上的三维点去做指认测试这样才能真实反映最终使用场景的精度。我自己标定完还有一个习惯不急着跑抓取先让机械臂末端在标定板几个角点上方来回走一遍同时对比示教器上显示的坐标和相机识别出来的坐标。第一次给睿尔曼和 RealSense 做标定时我因为 marker_size 填成了厘米单位来回折腾了两个小时最后发现所有误差都朝同一个方向、按同一个比例偏移才意识到是单位的问题。所以你在标定前不妨先把这句话写在便签上所有长度单位统一用米。标定不像装驱动驱动装好就能用标定结果对不对必须靠实际动作来验收。这个环节省不掉也急不来。本文还有配套的精品资源点击获取