halcon算子 calibrate_hand_eye

名称

calibrate_hand_eye —执行手眼校准。

原型

calibrate_hand_eye( : : CalibDataID : Errors)

描述

操作员根据校准数据模型确定机器人(“手”)相对于相机或3D传感器(“眼睛”)的3D姿势借助确定的3D姿态,可以将摄像机坐标系中的校准对象的姿态转换为机器人的坐标系,然后可以例如抓取被检零件。机器人摄像机(手眼)系统有两种可能的配置:摄像机可以安装在机器人上,也可以静止不动并观察机器人。请注意,机器人一词代替了移动物体的机制。因此,您可以用来校准许多不同的系统,从旋转云台到多轴机械手。 calibrate_hand_eyeCalibDataIDcalibrate_hand_eye

本质上,适用于手眼校准的系统由四个欧几里德变换的闭合链描述。在此链中,两个非连续的变换要么从机器人控制器中获悉,要么从摄像机数据(例如,摄像机观测到的校准对象姿态)计算得出。这两个未知的常数转换是通过手眼校准程序计算的。

与外部相机参数的校准类似地执行手眼校准(请参阅“校准/多视图”):在相机坐标系中获取一组校准对象的姿态,以及该工具的相应姿态在机器人基本坐标中设置并在校准数据模型中进行设置。 CalibDataID

与摄像机校准相反,校准对象不是手动移动的。该任务委托给机器人。基本上,可以区分两种手眼校准方案。机器人会移动相机(移动相机)或移动校准对象(固定相机)。假定机器人的动作是已知的。它们用作手眼校准的输入,并使用在校准数据模型中进行设置。 CalibDataIDset_calib_data

手眼校准的结果有两个姿势:对于移动摄像机场景,工具在摄像机坐标系中的3D姿态'tool_in_cam_pose')和在机器人基本坐标系中的校准对象的3D姿态(' obj_in_base_pose')。对于固定摄像机场景,计算摄像机坐标系中机器人基座的3D姿态('base_in_cam_pose')和工具坐标系中校准对象的3D姿态('obj_in_tool_pose')。它们的姿势类型与输入姿势的姿势类型相同。如果输入的姿势具有不同的姿势类型,则返回类型0的姿势。

下面将详细讨论这两种手眼校准方案,然后是有关数据的一般信息以及校准数据模型的准备。


移动相机(安装在机器人上)

在这种配置下,校准对象保持静止。摄像机安装在机器人上,并由机器人移动到不同的位置。手眼校准背后的主要思想是,从校准对象的观察结果中提取的信息(即校准对象相对于相机的姿态)可以看作是校准中的一系列姿态或均匀变换矩阵通过机器人的基础将物体对准其工具(末端执行器),最后到达摄像机:

image.png

根据校准对象姿态('obj_in_cam_pose')和机器人基础坐标系中工具的姿态('tool_in_base_pose'的集合,操作员 确定链末端的两个缺少的变换,即相机坐标系中的机器人工具(, 'tool_in_cam_pose')和机器人基础坐标系中的校准对象的姿态('obj_in_base_pose')。这两个姿势是恒定的。 calibrate_hand_eye

相反,链中间的变换 是已知的,但是每次对校准对象的观察都会改变,因为它描述了工具相对于机器人基础坐标系的姿态。在方程式中,使用了逆变换矩阵。反转在内部执行。 

请注意,在校准SCARA机械手时,无法确定'obj_in_base_pose'的Z平移为了消除这种歧义,Z转换'obj_in_base_pose'在内部设置为0.0,并相应地计算'tool_in_cam_pose'在校准之后,必须通过将机器人移动到摄像机坐标系中已知高度的姿势来确定Z值的真实平移。为此,可以采用以下方法:将校准板放置在任意位置。然后移动机器人,使摄像机可以观察校准板。现在,获取校准板的图像并查询当前的机器人姿势(ToolInBasePose1)。根据图像,可以确定相机坐标系中校准板的姿态(ObjInCamPose1)。之后,将机器人的工具手动移动到校准板的原点,并再次查询机器人的姿态(ToolInBasePose2)。这三个姿势和校准结果(ToolInCamPose)可通过使用以下几行代码来修复Z歧义:pose_invert(ToolInCamPose,CamInToolPose)pose_compose(CamInToolPose,ObjInCamPose1,ObjInToolPose1)pose_invert(ToolInBasePose1,BaseInToolPose1)pose_compose(BaseInToolPose1,ToolInBasePose2,Tool2InTool1Pose0 [InIn),InInPose1] ToolInCamPoseFinal)

固定式相机

在这种配置下,机器人将抓住校准对象并将其移到摄像机前面。同样,这次从校准对象的观测值中提取的信息(即,校准对象在相机坐标系中的姿态(例如,外部相机参数))等于一连串的姿态或齐次变换矩阵通过机器人工具将校准对象固定到其基座,最后到达摄像机:

image.png

类似于移动摄像机的配置,操作员 确定链末端的两个变换,这里是摄像机坐标中的机器人基本坐标系的姿态(, 'base_in_cam_pose')和校准对象相对于摄像机坐标的姿态。机器人工具(, 'obj_in_tool_pose')。 calibrate_hand_eye

链中间的转换 描述了工具相对于机器人基础坐标系的姿势。该变换 描述了校准对象相对于相机坐标系的姿态。 

请注意,在校准SCARA机械手时,无法确定'obj_in_tool_pose'的Z平移为了消除这种歧义,“ obj_in_tool_pose”的Z转换在内部设置为0.0,并相应地计算“ base_in_cam_pose”在校准之后,必须通过将机器人移动到摄像机坐标系中已知高度的姿势来确定Z值的真实平移。为此,可以采用以下方法:将校准板(未安装在机器人上)放置在任意位置,以便摄像机可以观察到。然后必须在摄像机坐标系中确定校准板的姿态(ObjInCamPose)。之后,将机器人的工具手动移动到校准板的原点,并查询机器人的姿态(ToolInBasePose)。这两个姿势和校准结果(BaseInCamPose)可通过使用以下几行代码来修复Z歧义:     pose_invert(BaseInCamPose,CamInBasePose)pose_compose(CamInBasePose,ObjInCamPose,ObjInBasePose)ZCorrection:= ObjInBasePose [2] -ToolInBasePose [2] set_origin_pose(BaseInCamPose,0、0,ZCorrection,BaseInCamPoseFinal)

准备校准输入数据

调用之前,必须使用以下步骤创建并填充校准数据模型: calibrate_hand_eye

  1. 使用操作员 创建校准数据模型,指定设置中的摄像机数量和使用的校准对象的数量。根据您的情况, 必须将其设置为“ hand_eye_moving_camera”, “ hand_eye_stationary_camera”, “ hand_eye_scara_moving_camera”或 “ hand_eye_scara_stationary_camera”create_calib_dataCalibSetup这四个场景一方面区分是由机器人移动相机还是校准对象,另一方面区分是对铰接式机器人还是SCARA机器人进行了校准。铰接式机器人的手臂具有三个旋转关节,通常覆盖6个自由度(3个平移和3个旋转)。SCARA机器人具有两个平行的旋转关节和一个平行的四角形关节,仅覆盖4个自由度(3个平移和1个旋转)。松散地说,多关节机器人能够倾斜其末端执行器,而SCARA机器人则不能。

  2. 用运算符 指定优化方法对于参数 “optimization_method”,对两个选项 是可用的,“非线性” 和“线性”(见第“执行实际手眼校准”)。 set_calib_dataDataNameDataValueDataValueDataValue

  3. 指定校准对象的姿势

    1. 对于每次观察校准对象,都可以使用操作员直接设置3D姿态 该操作器旨在与观察校准对象的通用3D传感器一起使用。 set_calib_data_observ_pose

    2. 校准对象的姿态也可以使用相机图像进行估算。必须由操作员 在校准数据模型中设置校准对象初始摄像机参数必须由操作员设置如果使用标准的HALCON校准板,则操作员将 确定校准板相对于摄像机的姿态,并将其保存在校准数据模型中在这种情况下,铰接式(即非SCARA)机器人的操作员在进行手眼校准之前先对摄像机进行校准。如果提供的摄像机参数已经过校准,则可以通过以下方式关闭摄像机校准: CalibDataIDset_calib_data_calib_objectset_calib_data_cam_paramfind_calib_objectCalibDataIDcalibrate_hand_eye     set_calib_data(CalibDataID,'camera','general','excluded_settings','params')。  相反,对于SCARA,机器人始终假定提供的摄像机参数已经过校准。因此,在这种情况下,永远不会在手眼校准之前自动执行内部摄像机校准。这是因为如果不将校准板相对于摄像机大幅倾斜,则无法可靠地校准内部摄像机参数。对于手眼校准,校准板通常大致平行于像平面。因此,对于SCARA机器人,所有摄像机姿态都近似平行。因此,必须事先使用一组不同的校准图像对相机进行校准。 calibrate_hand_eye

  4. 在机器人基础坐标中指定工具的姿势对于摄像机坐标系中校准对象的每个姿态,必须由操作员设置机器人基础坐标系中工具的相应姿态     set_calib_data(CalibDataID,'tool',PoseNumber,'tool_in_base_pose',ToolInBasePose)  

执行实际的手眼校准

操作员可以两种不同方式执行校准。在这两种情况下,所有提供的校准对象在相机坐标中的姿态以及工具在机器人基础坐标中的相应姿态都用于校准。用指定的方法。 calibrate_hand_eyeset_calib_data

对于参数组合 DataName'optimization_method'和 DataValue'linear',使用线性算法执行校准,该算法速度很快,但在许多实际情况下不够准确。

对于参数 DataName“ optimization_method”和 DataValue“ nonlinear”,使用非线性算法执行校准,这将导致最准确的校准姿势,因此是选择的方法。

检查校准是否成功

运算符返回中的完整变换链的姿态误差更确切地说,返回具有四个元素的元组,其中第一个元素是平移部分的均方根误差,第二个元素是旋转部分的均方根误差,第三个元素是最大平移误差,第四个元素是最大旋转误差。使用这些错误度量,可以确定校准是否成功。 calibrate_hand_eyeErrors

是在将输入的姿势分别给予,即,相同的单元返回时,平移误差以米给出典型和旋转误差总是以度表示。 Errors

获取校准结果

可以使用来查询由运算符计算出的姿势对于移动摄像机场景,可以获得摄像机坐标系中工具的3D姿态('tool_in_cam_pose')和机器人基础坐标系中的校准对象的3D姿态('obj_in_base_pose')。对于固定摄像机场景,可以获得摄像机坐标系中机器人基座的3D姿态('base_in_cam_pose')和工具坐标系中校准对象的3D姿态('obj_in_tool_pose')。 calibrate_hand_eyeget_calib_data

查询输入数据

如果使用来计算校准对象相对于相机的姿态,则对于铰接式(即非SCARA)机器人,它们将在手眼校准之前用于内部相机校准步骤中,并且也要进行校准。可以使用 参数'calib_obj_pose'查询校准的3D姿势如果使用通用3D传感器观察到校准对象的姿势,则无法对其进行校准,并通过进行设置可以使用来查询这些原始的3D姿势可以使用来查询工具在机器人基座坐标系中的相应3D姿势。 find_calib_objectget_calib_dataItemTypeset_calib_data_observ_poseget_calib_data_observ_poseget_calib_data

获取一组合适的观察结果

应考虑以下条件,尤其是在使用标准校准板的情况下:

  • 校准对象的位置(移动摄像机:相对于机器人的底座;固定摄像机:相对于机器人的工具)和摄像机的位置(移动摄像机:相对于机器人的工具;固定摄像机:相对于机器人的底座)不得在校准姿势之间更改。

  • 即使理论上可以达到三个校准对象姿态的下限,也建议获取10个或更多姿态,其中相机或机械手的姿态足够不同。

    对于铰接式(即非SCARA)机器人,校准对象姿态之间的旋转量至关重要,并且至少应为30度或更好的60度。姿势之间的旋转必须显示至少两个不同的旋转轴。非常不同的方向可导致手眼校准的结果更加精确。对于SCARA机器人,只有一个旋转轴。图像之间的旋转量也应该很大。

  • 对于摄像机,在校准期间和之后,内部摄像机参数必须恒定。请注意,图像尺寸,焦距,光圈或焦点的变化会导致内部相机参数的变化。

  • 如上所述,在获取单个图像之间不得修改相机。请确保焦距足以满足相机到标定板距离的预期变化。因此,校准板的明亮照明条件很重要,因为这样您就可以使用较小的光圈,从而获得更大的聚焦深度。

获取机器人工具的姿势

我们建议在单独的程序中创建机器人姿势,并使用将其保存在文件中然后,您可以在校准程序中将它们导入并在校准数据模型中进行设置。 write_poseCalibDataID

通常,通过机器人的笛卡尔界面,您可以在机器人基本坐标中以与代码0或2('gba''abg',请参见

表示的姿势表示形式相对应的方式获得工具的姿势在这种情况下,您可以直接使用从机器人获得的姿势值作为的输入 。 OrderOfRotationcreate_posecreate_pose

如果你的机器人的笛卡尔接口描述了不同的方式,例如方位,以表示ZYZ( ),

您可以创建一个步骤中使用的运营商相应的齐次变换矩阵的步骤然后将所得的矩阵转换成使用姿势

以下示例代码根据上述ZYZ表示创建一个姿势: 

hom_mat3d_rotatehom_mat3d_translatehom_mat3d_to_pose

hom_mat3d_identity(HomMat3DIdent)hom_mat3d_rotate(HomMat3DIdent,phi3,'z',0,0,0,HomMat3DRotZ)hom_mat3d_rotate(HomMat3DRotZ,phi2,'y',0,0,0,0_0,Y_Date(),HomMat3 0、0、0,HomMat3DRotZYZ)hom_mat3d_translate(HomMat3DRotZYZ,Tx,Ty,Tz,base_H_tool)hom_mat3d_to_pose(base_H_tool,RobPose)

请注意,手眼校准仅在高精度指定机器人基础坐标中工具的姿势时才有效!




本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864