ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

康耐视3D相机与机械手手眼标定实战:从原理到精度优化

康耐视3D相机与机械手手眼标定实战:从原理到精度优化 1. 项目缘起与整体方案设计1.1 为什么选择康耐视3D相机搭配机械手做手眼标定在工业自动化现场3D视觉引导机械手抓取这个组合已经不算新鲜事了但真正能把整套流程跑通、精度做到产线可接受范围的团队其实并不多。我前后做过四五个类似项目从早期用2D相机加激光位移传感器拼凑方案到后来直接上康耐视3D相机配合六轴机械手踩过的坑可以说能写一本小册子。这次就把整套手眼标定的实战过程完整梳理一遍尽量把每个环节的细节和容易翻车的地方都讲透。先说方案选型的逻辑。康耐视的3D相机产品线里比较常见的是基于结构光或者飞行时间原理的型号配合VisionPro或者In-Sight平台做点云处理和位姿输出。机械手这边不管是EPSON、ABB还是国产的协作臂手眼标定的数学本质是一样的求相机坐标系和机械手末端坐标系之间的变换矩阵。区别在于不同品牌的机械手在通信接口、位姿数据格式、运动控制指令上有差异这些差异会直接影响标定的操作流程。为什么强调3D视觉而不是2D因为2D只能给出平面内的XY和旋转角度遇到工件有高度变化、姿态倾斜、堆叠遮挡的情况就歇菜了。3D相机能输出完整的点云数据配合位姿估计算法可以拿到六自由度的抓取位姿这才是柔性上料、无序抓取这类场景的刚需。康耐视的3D相机在工业现场的稳定性确实有优势标定工具链也相对完整虽然价格不便宜但省下来的调试时间值这个钱。1.2 手眼标定的两种模式眼在手外与眼在手上手眼标定分两种基本模式这个必须先搞清楚因为标定方法和后续使用方式完全不同。眼在手外也就是相机固定在支架上不随机械手运动。相机看到的是整个工作区域机械手在相机视野内运动。这种模式的好处是相机视野大、稳定性好适合工件放在固定区域、机械手去抓取的场景。标定的核心是求相机坐标系到机械手基坐标系的变换矩阵。眼在手上相机安装在机械手末端法兰上跟着机械手一起动。这种模式适合大工件或者需要多角度拍摄的场景相机可以凑近了看。标定的核心是求相机坐标系到机械手末端坐标系的变换矩阵。我这次项目用的是眼在手外的方案因为工件放在料框里需要相机一次拍全机械手再去抓。两种模式的标定原理相通但操作细节有差异下面主要按眼在手外来讲眼在手上的关键差异我会单独说明。1.3 标定前的准备工作清单在开始标定之前有几件事必须提前确认好否则标定过程中会各种卡壳。机械手通信打通确保上位机或者视觉控制器能通过以太网、串口或者现场总线读到机械手的实时位姿数据。EPSON机械手一般用Ethernet通信ABB可以用Socket Message或者PC SDK国产协作臂通常有TCP/IP接口。这一步不通后面全白搭。相机标定完成3D相机本身的内参标定必须已经做好包括焦距、畸变系数、深度映射参数等。康耐视的相机出厂一般会附带标定文件但如果是自己换过镜头或者调整过安装角度需要重新做内参标定。标定板准备需要一块高精度的标定板通常是陶瓷或者玻璃基底的棋盘格或者圆点阵列。标定板的平整度和图案精度直接影响标定结果别贪便宜买打印的纸质标定板热胀冷缩和翘曲会让你怀疑人生。机械手末端工具安装到位如果标定后要换工具标定结果就废了。所以标定前要把最终使用的夹具或者吸盘装好并且确认工具坐标系已经设置正确。工作空间清理标定过程中机械手要运动到多个位姿确保运动路径上没有障碍物安全第一。注意标定板的位置一旦固定整个标定过程中就不能再移动。如果标定板动了所有采集的数据全部作废必须重新来过。2. 手眼标定核心原理与关键细节解析2.1 手眼标定的数学本质AXXB怎么理解手眼标定的数学表达通常写成AXXB的形式这个方程看起来简单但理解它的物理含义很重要。A表示机械手末端在两个不同位姿之间的变换矩阵这个数据从机械手控制器读取。B表示相机坐标系下同一个变换的矩阵这个数据通过相机拍摄标定板计算得到。X就是我们要找的相机和机械手之间的变换矩阵。换个通俗的说法机械手动了一段距离相机也看到标定板动了一段距离这两个运动之间的对应关系就隐含了相机和机械手的相对位置关系。通过多组运动数据就能解出这个相对位置。实际求解时需要至少三组不共线的运动数据通常建议采集10到20组覆盖机械手工作空间的不同位置和姿态。数据越多求解越稳定但也不是越多越好关键是要覆盖足够的姿态变化。如果所有采集点都在一个小范围内解出来的结果外推能力会很差。2.2 康耐视3D相机的数据特点与标定板识别康耐视3D相机输出的数据格式和普通2D相机不同需要特别注意。以常见的结构光3D相机为例输出的是点云数据加上一张2D纹理图。点云数据中每个点包含XYZ坐标和灰度值标定板识别时通常先用2D纹理图找到标定板的图案区域再映射到3D点云上获取标定板角点的三维坐标。这里有个容易忽略的细节康耐视相机的点云坐标系和2D图像坐标系之间的对应关系需要确认清楚。有些型号的点云是经过校正的直接对应物理尺寸有些型号的点云还带有镜头畸变需要先做去畸变处理。这个在VisionPro的相机标定文件里会有说明一定要仔细看。标定板识别时建议用圆点阵列而不是棋盘格。原因在于3D相机对圆点中心的提取精度通常高于棋盘格角点尤其是在点云有噪声的情况下。康耐视的VisionPro里有现成的圆点标定板识别工具可以直接输出圆心的三维坐标。2.3 机械手位姿数据的获取与格式转换机械手位姿数据的获取是标定过程中最容易出问题的环节。不同品牌的机械手输出的位姿格式不一样有的是欧拉角有的是四元数有的是旋转向量。必须统一转换成4x4的齐次变换矩阵才能代入AXXB求解。以EPSON机械手为例通过Ethernet通信可以读取当前的世界坐标位姿格式通常是X、Y、Z、U、V、W六个值其中UVW是欧拉角。转换成旋转矩阵时要注意欧拉角的旋转顺序EPSON默认是ZYX顺序也就是先绕Z转再绕Y转再绕X转。如果顺序搞错了标定结果会完全不对。ABB机械手的位姿数据通常是四元数格式转换成旋转矩阵相对直接但要注意四元数的符号问题。q和-q表示同一个旋转但在插值和计算时会有差异建议统一取标量部分为正的那个。实操心得在正式采集标定数据之前先手动让机械手走几个位姿同时记录机械手读数和相机识别结果验证一下坐标转换链路是否通畅。这一步花十分钟能省后面几小时的排查时间。2.4 标定数据采集的位姿选择策略采集多少组数据、选什么样的位姿直接决定标定精度。我的一般原则是数量15到25组比较合适。太少了解不稳定太多了采集时间长且容易引入人为误差。位置分布在相机视野内均匀分布覆盖视野的中心和四个角落。不要只在一个小区域采集。姿态变化机械手末端要有明显的姿态变化包括绕不同轴的旋转。如果所有采集点的姿态都一样只能解出位置关系解不出姿态关系。避免共线采集点的位置不要都在一条直线上否则方程退化解不唯一。实际操作时我会先在相机视野内规划一个3x3的网格每个网格点再变化两到三种姿态这样大概能覆盖20个左右的采集点。每个点采集时机械手要完全静止后再触发相机拍照避免运动模糊影响标定板识别精度。3. 实操过程与核心环节实现3.1 硬件连接与通信配置先说一下我这次项目的硬件配置康耐视3D相机一台安装在铝型材支架上镜头垂直向下EPSON六轴机械手一台末端安装气动夹爪上位机一台运行VisionPro和标定程序交换机一台把相机、机械手、上位机连在同一个局域网里。通信配置的步骤如下相机网络配置康耐视相机默认IP通常是192.168.0.10或者类似的地址具体看型号。通过VisionPro的相机配置工具把相机IP设置成和上位机同一网段比如192.168.1.100。机械手网络配置EPSON机械手的控制器一般有两个网口一个用于远程控制一个用于本地调试。把远程控制口连接到交换机设置好IP地址。上位机网络配置上位机设置双网卡或者单网卡多IP确保能同时ping通相机和机械手。通信测试用ping命令测试连通性然后用VisionPro的通信工具测试相机取像用Socket测试工具测试机械手位姿读取。这一步看起来简单但实际经常遇到防火墙拦截、IP冲突、网线质量差等问题。建议用工业级交换机网线用屏蔽超五类以上避免信号干扰导致通信不稳定。3.2 标定板识别与圆心提取标定板我用的是陶瓷基底的圆点阵列板圆点直径5mm间距10mm精度正负0.01mm。这个精度对于大多数工业抓取应用足够了。在VisionPro里配置标定板识别工具的步骤打开VisionPro创建一个新的Job。添加Cog3DCaliper或者Cog3DFindCircle工具用于在点云中找圆。设置ROI区域覆盖标定板在图像中的大致位置。调整圆的直径范围和边缘阈值确保能稳定找到所有圆点。添加Cog3DTransform工具把找到的圆心坐标从相机坐标系转换到统一的标定坐标系。识别效果的好坏取决于点云质量。如果点云噪声大圆心提取会跳动。这时候可以先用Cog3DFilter做点云滤波去掉离群点再做圆拟合。另外标定板的倾斜角度也会影响识别尽量让标定板平面和相机光轴垂直倾斜角度不要超过15度。3.3 机械手位姿采集与数据记录机械手位姿采集我写了一个简单的Python脚本通过Socket和EPSON控制器通信读取当前位姿并保存到CSV文件。核心代码如下import socket import csv import time def get_robot_pose(host, port): s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) cmd #GETPOS\r\n s.send(cmd.encode()) response s.recv(1024).decode() s.close() return response.strip() def collect_data(host, port, num_points): data [] for i in range(num_points): input(f移动到第{i1}个位姿按回车采集...) pose get_robot_pose(host, port) data.append(pose) print(f采集到: {pose}) with open(robot_poses.csv, w, newline) as f: writer csv.writer(f) writer.writerows(data) if __name__ __main__: collect_data(192.168.1.200, 5000, 20)这个脚本只是示例实际使用时需要根据EPSON的通信协议调整命令格式。ABB机械手可以用PC SDK或者Socket Message国产协作臂一般有更简单的TCP接口。采集时要注意每次移动到位后等机械手完全稳定再采集EPSON机械手在停止后会有轻微抖动建议等0.5秒再读数据。另外采集过程中不要碰标定板也不要让人员进入工作区域。3.4 标定计算与结果验证数据采集完成后用Python的OpenCV或者Scipy库求解AXXB。OpenCV里有现成的cv2.calibrateHandEye函数支持多种求解方法我一般用CALIB_HAND_EYE_TSAI或者CALIB_HAND_EYE_PARK两种方法结果接近可以互相验证。import cv2 import numpy as np # R_gripper2base, t_gripper2base: 机械手末端到基座的旋转和平移 # R_target2cam, t_target2cam: 标定板到相机的旋转和平移 R_cam2gripper, t_cam2gripper cv2.calibrateHandEye( R_gripper2base, t_gripper2base, R_target2cam, t_target2cam, methodcv2.CALIB_HAND_EYE_TSAI )计算完成后必须做验证。验证方法是让机械手走到一个新的位姿用标定结果预测标定板在相机中的位置和实际识别结果对比。如果误差在0.5mm以内说明标定合格如果误差超过1mm需要检查数据质量或者重新采集。我一般会做三组验证分别在工作空间的不同位置确保标定结果在整个工作范围内都可靠。3.5 标定结果在抓取程序中的应用标定完成后得到的变换矩阵要集成到抓取程序中。流程是相机拍摄工件输出工件在相机坐标系下的位姿通过标定矩阵转换到机械手基坐标系机械手根据转换后的位姿规划运动路径。这里有个细节相机输出的位姿通常是工件表面的抓取点而机械手需要的是末端工具中心点的位姿。两者之间还有一个工具坐标系的变换这个变换在机械手控制器里设置不要和手眼标定矩阵搞混。实操心得标定矩阵建议保存成YAML或者JSON文件方便程序读取和版本管理。每次重新标定后更新文件不要硬编码在程序里。4. 常见问题与排查技巧实录4.1 标定误差过大怎么排查标定误差大是最常见的问题排查思路按以下顺序进行排查项可能原因解决方法机械手位姿数据通信延迟导致读数滞后增加等待时间确认读取的是当前位姿标定板识别点云噪声大圆心提取不准增加滤波调整识别参数坐标转换欧拉角顺序错误确认机械手文档中的旋转顺序采集位姿姿态变化不足增加不同姿态的采集点标定板移动采集过程中被碰重新采集所有数据我遇到过一次标定误差始终在2mm左右的情况排查了半天发现是机械手的工具坐标系没有清零导致末端位姿数据包含了工具偏移。所以标定前一定要确认工具坐标系是单位矩阵或者已知值。4.2 相机识别不到标定板怎么办康耐视3D相机识别不到标定板通常有以下几个原因标定板不在视野内先确认标定板在相机视野范围内可以通过2D图像预览确认。点云质量差检查相机镜头是否干净环境光是否过强。结构光相机对环境光敏感强光下点云会缺失。标定板对比度不足圆点标定板的圆点和背景对比度要足够如果标定板磨损或者反光识别会失败。识别参数不合适调整圆点直径范围、边缘阈值等参数先用2D图像调好再切换到3D。4.3 机械手通信断连的应急处理通信断连在长时间标定过程中偶尔会发生尤其是网络不稳定的情况下。应急处理步骤立即停止机械手运动确保安全。检查网线连接和交换机指示灯。用ping命令测试连通性。重启通信程序重新建立连接。如果已经采集了部分数据确认数据完整性后再继续。预防措施使用带屏蔽的工业网线交换机放在电柜内避免干扰通信程序加心跳检测和自动重连机制。4.4 标定结果在不同位置的精度差异有时候标定结果在视野中心精度很好到了边缘误差就变大。这通常是相机镜头畸变导致的。解决方法是在相机内参标定时加入畸变模型标定板识别时先做去畸变处理。康耐视的相机标定工具支持畸变校正但需要采集足够多的标定板图像来拟合畸变参数。另一个原因是机械手的重复定位精度在边缘位置变差尤其是大臂展的机械手。这种情况下只能通过优化采集点分布来补偿在精度要求高的区域多采集一些点。4.5 避坑指南我踩过的五个坑第一个坑标定板固定不牢。有一次标定板只用双面胶粘在台面上采集到一半标定板轻微移动了结果标定误差忽大忽小。后来改用磁性底座加螺丝固定再也没出过问题。第二个坑机械手位姿读取延迟。EPSON机械手在运动指令发出后控制器返回完成信号但实际位姿数据可能还有微小变化。我后来在收到完成信号后额外等0.5秒再读数据标定稳定性明显提升。第三个坑点云坐标系搞混。康耐视不同型号的3D相机点云坐标系定义不一样有的原点在相机光心有的在镜头表面。这个在相机手册里有说明但很容易忽略。搞错了会导致标定结果整体偏移。第四个坑标定数据采集顺序。我一开始按顺序从左上到右下采集结果机械手运动路径太长每次都要走很远。后来改成蛇形路径效率提高不少。第五个坑忘记保存原始数据。标定完成后只保存了结果矩阵没有保存原始采集数据。后来需要重新标定时发现原始数据丢了只能重新采集。现在我会把原始数据、标定脚本、结果矩阵一起打包存档。4.6 标定精度验证的实用方法除了前面说的预测对比法还有一个更直观的验证方法在标定板上选几个特征点用机械手末端去触碰这些点记录机械手位姿然后和相机识别结果对比。这个方法能直接反映整个系统的绝对精度但操作比较费时。我一般用预测对比法做快速验证如果误差在可接受范围内就不做触碰验证了。如果项目精度要求特别高比如0.1mm级别那触碰验证是必须的。注意验证时用的位姿要和标定采集时的位姿有明显区别否则验证结果没有意义。5. 不同品牌机械手的适配要点5.1 EPSON机械手的手眼标定注意事项EPSON机械手在3C行业用得很多它的通信协议相对开放但有几个细节要注意。EPSON的位姿数据默认是World坐标系如果设置了Local坐标系读取的数据需要转换。另外EPSON的欧拉角顺序是ZYX和很多其他品牌不一样转换矩阵时千万别搞错。EPSON的远程控制模式需要先切换到Remote状态否则Socket命令不响应。这个在调试时经常忘记导致通信测试失败。5.2 ABB机械手的手眼标定注意事项ABB机械手的位姿数据质量很高但通信配置相对复杂。用Socket Message方式通信时需要先在RobotStudio里配置好通信端口和消息格式。ABB的四元数表示比较规范转换矩阵时直接用就行。ABB机械手的工具坐标系设置很灵活可以设置多个工具坐标系标定时要确认当前激活的是哪个。5.3 国产协作臂的手眼标定注意事项国产协作臂比如节卡、遨博、大族等通信接口通常更简单很多直接提供Python SDK或者TCP接口。但位姿数据的格式和精度参差不齐标定前一定要确认数据格式和单位。有些国产协作臂的重复定位精度标称很高但实际在负载下的精度会下降。标定时尽量模拟实际负载或者把负载加上再标定。6. 标定后的系统集成与优化6.1 抓取程序的坐标系转换链路标定完成后抓取程序的坐标系转换链路是这样的相机识别工件输出工件在相机坐标系下的位姿乘以手眼标定矩阵转换到机械手基坐标系再乘以工具坐标系逆矩阵得到机械手末端需要到达的位姿最后做逆运动学求解得到关节角度。这个链路中每一步的变换矩阵都要确认正确任何一步出错都会导致抓取失败。建议在程序里加日志把每一步的变换结果打印出来方便排查。6.2 抓取精度的影响因素与优化标定精度只是抓取精度的一部分还有其他因素会影响最终效果相机识别精度工件的位姿识别算法精度点云质量光照条件。机械手绝对精度机械手的绝对定位精度通常比重复定位精度差这是机械臂的固有特性。工件一致性来料的尺寸和姿态一致性如果工件本身差异大再好的标定也没用。夹具精度夹具的加工精度和安装精度夹爪的重复抓取精度。优化方向提高相机识别稳定性选用绝对精度更高的机械手控制来料一致性定期校准夹具。6.3 长期稳定性维护建议手眼标定不是一劳永逸的长期运行后精度会漂移。建议每三个月做一次快速验证每半年做一次完整标定。如果产线有碰撞或者维修标定后必须重新验证。维护清单每月检查相机镜头清洁度每月检查标定板状态每季度做一次精度验证每半年重新标定一次每次碰撞或维修后重新验证这套流程我在多个项目上跑下来标定精度能稳定保持在0.3mm以内满足大多数工业抓取应用的需求。当然如果要求0.1mm级别的精度那需要更高精度的相机和机械手标定流程也要更严格。最后分享一个小技巧标定完成后把标定板留在原位在程序里加一个自动验证功能每次开机时机械手自动走一个验证位姿对比相机识别结果和标定预测结果如果误差超限就报警。这个功能帮我提前发现了好几次标定漂移的问题避免了批量抓取失败。
返回列表