手眼标定实战:从9点标定到精准抓取
1. 手眼标定让机械手“看得见”也“抓得准”想象一下你闭着眼睛去拿桌上的水杯是不是很容易碰倒但如果睁开眼睛你就能轻松地、精准地拿到它。这个“睁眼”的过程对于工业机器人来说就是手眼标定。简单说它就是教会机器人如何把它“眼睛”相机看到的东西准确地告诉“手”机械臂去抓取。在自动化产线上我们经常看到这样的场景一个传送带源源不断地送来零件一个机械臂精准地将其抓起放到下一个工位。这个“精准”的背后核心就是手眼标定。相机拍下照片告诉系统“看零件在这里像素坐标是X250 Y120。”但机械臂的世界是三维的它只认自己基座坐标系下的毫米坐标比如X500mm Y300mm Z50mm。手眼标定就是建立这两个坐标世界之间的“翻译官”——一个数学转换关系。没有这个“翻译官”机械臂要么抓空要么撞到零件整个自动化流程就乱套了。我刚开始接触这个领域时也犯过迷糊。总觉得标定是个纯数学问题很抽象。后来在项目里踩过几次坑才明白它其实是个非常“接地气”的工程实践问题。标定的精度直接决定了整个视觉引导抓取系统的成败。而9点标定法就是其中最经典、最实用、新手最容易上手的方法。它就像学开车时的“倒车入库”练习虽然点位固定但练好了原理通了各种复杂的“侧方停车”和“窄路掉头”更复杂的标定场景你也就有底气应对了。接下来我就带你从零开始一步步拆解9点标定直到实现稳定可靠的精准抓取。2. 深入原理为什么偏偏是“9个点”你可能要问为什么是9点5点行不行20点是不是更准这里面既有数学的严谨也有工程的权衡。我们先从最根本的数学模型说起。在大多数平面抓取场景中零件基本在一个平面上或高度固定我们通常认为相机图像平面到机器人末端执行器平面或机器人基座平面之间的关系可以用一个二维仿射变换来近似描述。这个变换包含了平移、旋转、缩放和错切。一个完整的二维仿射变换矩阵有6个自由度可以理解为6个未知数。从数学上讲要解出这6个未知数至少需要3组不共线的对应点坐标一组点提供X和Y两个方程。那为什么不用3点呢因为在实际工业环境中误差无处不在相机镜头有畸变、机械臂重复定位有误差、标定板摆放有轻微倾斜、甚至环境振动都会带来噪声。用最少的3点标定相当于用三个数据去拟合一个模型它对这三点本身的误差会极其敏感任何一个点有偏差整个标定矩阵就会“跑偏”导致其他区域的转换误差巨大鲁棒性很差。9点标定本质上是一种过拟合的标定方法。我们采集远超最小需求3点的数据点9点然后利用最小二乘法等数学工具去计算出一个最优的变换矩阵。这个“最优”解能够平均掉各个点上的随机误差使得最终得到的转换关系在整个相机视野范围内都保持较高的、稳定的精度。我实测下来在视野200mm*200mm的范围内用9点标定通常能将抓取的位置误差控制在0.5mm以内这对于绝大多数拾取、装配应用已经足够了。这里还要提一个关键概念标定板的覆盖范围。这9个点不能挤在视野的一个小角落里而应该尽可能均匀地覆盖相机整个视野尤其是你希望机械手工作的区域。理想情况下9个点应该分布在视野的四个角、四条边的中心以及视野正中心。这样计算出的变换矩阵才能对整个工作区域都有良好的代表性。如果你只在一个小区域标定却让机械手去抓取视野边缘的物体误差可能会急剧增大这就是标定覆盖不足导致的“外推”误差。3. 实战准备硬件、软件与环境搭建理论懂了咱们就得动手了。工欲善其事必先利其器。我先给你列个清单说说我常用的配置。硬件部分机械臂市面上主流品牌如ABB、发那科、库卡或者国产的埃斯顿、新松等都可以。甚至你用一台桌面级的六轴协作机器人也行原理完全一样。关键是要能通过编程精确控制末端走到指定坐标并且能读出末端的实时坐标值。工业相机建议选择面阵相机分辨率根据视野和精度要求来定。比如你要看一个100mm100mm的区域要求定位精度0.1mm那么相机分辨率至少需要100/0.1 1000像素所以选择130万像素12801024的相机是合适的。镜头要选好避免畸变过大。标定板这是核心道具。我强烈推荐使用实心圆点阵列标定板Halcon等视觉库对它支持最好识别精度高。常见的比如7x7的圆点阵列。你需要把它牢固地安装在机械臂的末端或者固定在工作台上取决于标定模式。光源稳定的照明是视觉的命根子。用环形光或条形光把标定板打亮确保图像对比度高圆点清晰、饱满没有反光。软件与通信视觉处理软件我们将以Halcon为例进行讲解因为它算子丰富标定流程成熟文档也全。当然你用OpenCV也可以但需要自己实现更多底层功能。机器人控制软件与你的机械臂配套。通信这是连接“眼”和“手”的神经。通常通过TCP/IP网络通信。机器人作为服务器提供坐标点或者PC作为客户端发送指令。另一种常见方式是通过PLC进行数据中转。在项目初期我建议先用最简单的TCP通信测试避免复杂的中间环节引入问题。环境搭建步骤机械安装根据你选择的是“眼在手外”Eye-to-Hand还是“眼在手上”Eye-in-Hand固定好相机。眼在手外模式相机俯瞰整个工作台眼在手上模式相机装在机械臂末端随动。电气连接给相机、光源、机器人上电并通过网线将相机和工控机、工控机和机器人控制器连接到同一局域网。软件配置在Halcon中配置好相机驱动能实时采集到清晰的图像。在机器人软件中编写一个简单的程序能让末端点动到各个位置并记录坐标。制作“标定点位文件”这是关键一步。在机器人示教器上手动精细操控机械臂末端让标定板上的特征点比如中心圆点依次移动到相机视野中预先规划好的9个位置如前所述覆盖四角、四边、中心。每到一个位置记录下此时机器人末端或基座的X Y坐标Z坐标固定并在Halcon中采集一张图像。最终你会得到两个列表一个9行的机器人坐标列表和一个9行的图像像素坐标列表。4. Halcon算子实现一步步完成9点标定准备工作就绪现在进入核心的代码环节。我会用最直白的语言把Halcon的算子串起来并解释每一个参数的意义。你完全可以跟着做。第一步获取图像坐标假设你已经采集了9张标定板图像并存储在了一个图像数组Images中。我们需要用Halcon识别出每张图像中标定板特征点的像素坐标。* 假设你已经有一个包含9张图像的数组 Images for Index : 0 to 8 by 1 * 选择一张图像 select_obj (Images, ImageSelected, Index1) * 进行阈值分割找到标定板上的圆点。这里假设是深色圆点浅色背景 threshold (ImageSelected, Region, 0, 128) * 连接相邻区域 connection (Region, ConnectedRegions) * 根据面积、圆度等特征筛选出真正的圆点区域 select_shape (ConnectedRegions, SelectedRegions, area, and, 500, 99999) * 对筛选出的区域进行排序确保每次识别的顺序一致例如从左到右从上到下 sort_region (SelectedRegions, SortedRegions, first_point, true, row) * 计算排序后第一个区域或其他你指定的特征点如中心区域的中心坐标 area_center (SortedRegions, Area, Row, Column) * 将坐标存入数组 Rows[Index] : Row[0] // 取第一个区域的中心行坐标 Cols[Index] : Column[0] // 取第一个区域的中心列坐标 endfor执行完这一步你就得到了9个特征点在图像中的像素坐标Rows和Cols。第二步准备机器人坐标这是你在示教时记录下来的坐标。假设你记录的是机器人末端工具中心点TCP在机器人基坐标系下的坐标。* 机器人末端的X坐标对应图像列方向单位毫米 Cols_robot : [275.0, 225.0, 170.0, 280.0, 230.0, 180.0, 295.0, 240.0, 190.0] * 机器人末端的Y坐标对应图像行方向单位毫米 Rows_robot : [55.0, 50.0, 45.0, 5.0, 0.0, -5.0, -50.0, -50.0, -50.0]注意这里的对应关系必须严格Rows_robot[0]和Cols_robot[0]必须对应第一张图像第一个点位识别出的Rows[0]和Cols[0]。顺序一乱标定全错。第三步计算仿射变换矩阵这是最关键的一步Halcon一个算子搞定。* 输入图像坐标行、列数组机器人坐标行、列数组 * 输出仿射变换矩阵 HomMat2D vector_to_hom_mat2d (Rows, Cols, Rows_robot, Cols_robot, HomMat2D)这个算子内部就是利用你提供的9组对应点通过最小二乘法计算出一个2D仿射变换矩阵HomMat2D。这个矩阵就是我们要的“翻译官”。你可以把它保存到文件里以后每次启动系统直接读取无需重新标定。* 保存矩阵到文件 serialize_hom_mat2d (HomMat2D, SerializedItemHandle) write_serialized_item (SerializedItemHandle, calibration_data.dat)5. 坐标转换验证你的标定真的准吗算出矩阵不算完必须验证这是很多新手会忽略但老手一定会做的步骤。验证分两步重投影验证和实物抓取验证。重投影验证就是用标定好的矩阵把当初那9个图像坐标再转换回机器人坐标看看和当初记录的机器人坐标差多少。* 使用计算出的矩阵将图像坐标转换回机器人坐标 affine_trans_point_2d (HomMat2D, Rows, Cols, Rows_trans, Cols_trans) * 计算误差 total_error : 0.0 for i : 0 to 8 by 1 row_error : abs(Rows_robot[i] - Rows_trans[i]) col_error : abs(Cols_robot[i] - Cols_trans[i]) distance_error : sqrt(row_error*row_error col_error*col_error) total_error : total_error distance_error * 可以打印每个点的误差 dev_display (点 i$d 的误差mm: distance_error$.3f) endfor mean_error : total_error / 9 dev_display (平均重投影误差mm: mean_error$.3f)如果平均误差在你允许的范围内比如小于0.1mm说明标定本身的计算是准确的。但这只证明了“数学上”没问题。更重要的实物抓取验证在相机视野内随意放一个特征明显的物体比如一个带十字标记的块。用视觉算法识别出这个物体在图像中的像素坐标(Row_target, Column_target)。使用标定矩阵进行转换affine_trans_point_2d (HomMat2D, Row_target, Column_target, Qx, Qy)得到机器人坐标(Qx, Qy)。控制机械臂移动到(Qx, Qy, Z)Z是预设的抓取高度。目测机械臂末端工具如吸盘、夹爪的中心是否准确对准了物体上的标记。我通常会做至少5个不同位置的实物验证包括视野中心、四个角落。如果都能对准那恭喜你标定成功了如果出现系统性偏差比如所有点都往一个方向偏可能是标定板坐标记录错了或者像素坐标和机器人坐标的对应关系弄反了行/列对应X/Y搞混了。6. 两种经典模式Eye-to-Hand 与 Eye-in-Hand 详解前面原理提到了两种模式这里结合实战再深入聊聊。选对模式事半功倍。Eye-to-Hand眼在手外场景相机固定安装在工作区域上方或侧面俯瞰整个工作台。机械臂在相机视野内运动。标定对象标定的是相机坐标系与机器人基坐标系的关系。优点相机视野固定且稳定不会因机械臂运动而抖动或改变视角。可以在机械臂运动的同时进行拍照识别实现“跟踪抓取”节拍更快。标定一次后只要相机和机器人基座相对位置不变就永久有效。缺点容易受到工作现场其他移动物体如其他机器人、AGV的遮挡。对于深腔或侧面抓取固定视角可能看不清。我的经验这是最常用、最推荐新手开始的模式。结构简单稳定性高。在做标定时你需要把标定板固定在机械臂末端然后移动机械臂让标定板上的点依次走到相机视野的9个位置。此时记录的机器人坐标是末端坐标但计算出的矩阵是将图像坐标转换到机器人基坐标系。Eye-in-Hand眼在手上场景相机直接安装在机械臂末端随着机械臂一起运动。标定对象标定的是相机坐标系与**机器人末端坐标系工具坐标系**的关系。优点相机随动可以灵活地从最佳视角观察物体尤其适合复杂形状、有遮挡或需要插孔装配的场景。不易受外界环境遮挡影响。缺点机械臂运动可能引起相机振动影响图像质量。每次拍照前机械臂需要运动到固定拍照位姿增加了节拍时间。如果更换工具未端执行器通常需要重新标定。我的经验这种模式标定过程稍微绕一点。你需要将标定板固定在工作台上一个不动的位置。然后移动带相机的机械臂让相机从9个不同的位姿去拍摄同一个固定的标定板。记录的机器人坐标是每个拍照位姿下机器人末端工具中心点的坐标。计算出的矩阵是将图像坐标转换到机器人末端坐标系。这意味着当你识别到一个物体在图像中的位置后转换得到的是相对于末端工具的位置机器人需要结合自身的运动学才能知道该如何移动基座各关节去对准。特性对比Eye-to-Hand (眼在手外)Eye-in-Hand (眼在手上)相机位置固定在工作区域外固定在机械臂末端标定关系相机坐标 - 机器人基坐标相机坐标 - 机器人末端工具坐标标定板放置固定在机械臂末端固定在工作台上运动影响相机视野稳定相机随动可能振动适用场景平面抓取、传送带跟踪复杂视角、有遮挡、精密装配标定稳定性高一次标定长期使用中换工具后可能需要重标7. 避坑指南那些年我踩过的常见问题理论完美操作顺利但一上真机就出问题太正常了。我总结了几类最常见的“坑”希望能帮你提前排雷。问题一标定误差巨大超过几个毫米甚至厘米。可能原因1坐标对应关系错误。这是最最常见的问题检查你的Rows/Cols数组和Rows_robot/Cols_robot数组是否严格按点位顺序一一对应。一个简单的检查方法在Halcon里把9个图像坐标点用disp_cross显示出来同时在机器人软件里把9个机器人坐标点连成路径看看两者的空间分布形状是否相似。如果一个是顺时针一个是逆时针那肯定错了。可能原因2单位不统一。图像坐标是像素机器人坐标是毫米。确保你的机器人坐标值是准确的毫米数。有时机器人示教器显示的单位可能是米或厘米需要转换。可能原因3机器人坐标系选择错误。你记录的是基座坐标、工具坐标还是用户坐标在Eye-to-Hand模式下通常记录机器人末端法兰盘中心在基坐标系下的坐标。确保机器人坐标系和标定计算时假设的坐标系一致。问题二标定后视野中心很准但边缘误差大。可能原因镜头畸变未校正。仿射变换只能校正线性误差无法校正镜头本身带来的非线性畸变尤其是鱼眼镜头或广角镜头。解决方案是先进行相机标定获取相机内参焦距、主点和畸变系数对原始图像进行畸变校正然后在校正后的图像上进行9点标定。Halcon的calibrate_cameras算子可以很好地完成相机标定。也可能原因标定点覆盖区域不足。9个点没有很好地覆盖整个工作视野导致矩阵在未覆盖区域预测不准。确保点分布均匀。问题三实物抓取时出现Z方向的高度误差。记住9点标定是2D的它只解决了X Y平面的映射关系。Z方向高度需要单独处理。通常有两种方法固定高度法如果所有被抓物体厚度一致且放置平面平整那么抓取高度Z可以设为一个固定值。激光测距或3D视觉法如果物体高度变化需要额外引入激光传感器或3D相机来测量物体顶面高度将这个高度值补偿到抓取点的Z坐标上。问题四系统运行一段时间后精度逐渐下降。可能原因机械松动或温漂。检查相机、镜头、光源是否紧固。工业环境温度变化可能导致机械结构微小形变影响标定参数。对于高精度应用需要定期如每班次或每天进行快速复标或者使用更稳定的机械结构和温控环境。可能原因光源老化或环境光变化。导致图像特征提取不稳定识别出的像素坐标本身就有波动。确保使用稳定性好的光源并尽可能屏蔽环境光干扰。问题五Eye-in-Hand模式下换工具后需要全部重标吗不一定。如果你更换的工具只是改变了末端的长度或角度但相机相对于机器人末端法兰盘的位置和姿态没有变那么你标定出的相机与末端坐标系的关系HomMat2D仍然有效。你只需要在机器人控制器里更新一下工具坐标系Tool Frame的参数即可。因为机器人运动时是基于工具坐标系来算的。但如果相机相对于法兰盘的位置动了那就必须重新标定。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2409069.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!