机器人 + RobotDK + Python:通过触碰测试验证手眼标定的结果

备注

本教程仅在UR5e和Yaskawa H10上进行了测试,并且仅适用于RoboDK支持的机器人。

介绍

有时很难衡量手眼标定的准确性。因此,我们创建了触碰测试让用户可以轻松地验证其准确性。在这个测试中,我们使用RoboDK来移动机器人。此示例适用于Eye-in-Hand和Eye-to-Hand两种类型的手眼标定的结果。触碰测试包括将标定板放置在相机的 :abbr:` FOV(视野)` 中,捕获它,并控制机器人在特定点触碰它。触碰完成后,可以移动Zivid标定板,让机器人再次进行触碰。您可以根据需要多次重复此过程。仅有的两个限制是机器人的工作范围和相机的 :abbr:` FOV(视野)` 。

在下图中,您可以看到触碰测试的预期结果。

触碰测试的预期结果。

备注

触碰的准确性取决于机器人标定误差、手眼标定误差、TCP标定误差和棋盘格位姿的估计误差。

要求

  • 已安装 Zivid software ,如果在Linux 上运行,则包括Zivid Tools。

  • 已安装 Zivid-Python

  • 已安装 RoboDK software

  • Robodk robot library 中有一台数字孪生的机器人。

  • Zivid标定板

  • 包含由手眼标定产生的手眼变换矩阵的.yaml文件。

  • 包含定义了尖头手眼验证工具(Pointed Hand-Eye Verification Tool)的变换矩阵的.yaml文件。

尖头手眼验证工具(Pointed Hand-Eye Verification Tool)

本教程使用了一个尖头手眼验证工具作为触碰工具。该工具适用于UR5e(ISO 9409-1-50-4-M6) 和Yaskawa HC10 (ISO 9409-1-63-4-M6) 。

  • :download:` pointed-hand-eye-verification-tool.STL </../files/pointed-hand-eye-verification-tool.STL>` - STL格式的CAD模型,可用于3D打印。

  • :download:` pointed-hand-eye-verification-tool.STEP </../files/pointed-hand-eye-verification-tool.STEP>` - STEP格式的CAD模型,可以加载到RoboDK中。

  • :download:` pointed-hand-eye-verification-tool.pdf </../files/pointed-hand-eye-verification-tool.pdf>` - 技术图纸。

  • :download:` pointed-hand-eye-verification-tool.yaml </../files/pointed-hand-eye-verification-tool.yaml>` - 用于保存转换矩阵的YAML文件,需要作为与本教程相关的代码示例的输入参数之一。

下图展示的即为尖头手眼验证工具(Pointed Hand-Eye Verification Tool)。

尖头手眼验证工具(Pointed Hand-Eye Verification Tool)

手臂安装

在本教程中,我们在机器人末端执行器和尖头手眼验证工具之间使用了 Zivid On-Arm Mount ExtenderZivid On-Arm Mount 。这些支架增加了机器人末端执行器和尖头手眼验证工具之间的距离。您可以在下图中找到为每个安装座添加的测量值。

Zivid手臂安装支架和手臂安装延长器

:download:` on-arm-mounts.yaml </../files/on-arm-mounts.yaml>` 文件包含了安装在机器人末端执行器和尖头手眼验证工具之间的两个支架的转换矩阵。有关安装支架的更多详细信息,请查看 on-arm camera mount datasheeton-arm mount extender datasheet

如果您已经设置了RoboDK环境并且已连接到您的机器人,则可以跳转到 为触碰测试创建捕获位姿 的步骤

设置RoboDK环境

RoboDK .rdk文件存储了有关机器人、目标位姿和环境的信息。执行触碰测试所需的.rdk文件中的组件有:

  • 机器人模型文件(.robot)

  • 一个目标位姿(在本教程演示的示例中,它被命名为”touch_test_pose”)

  • 机器人环境的虚拟模型(可选)

  • 正在使用的相机的CAD模型,例如, Zivid Two CAD file (可选)

  • 尖头手眼验证工具的CAD模型(可选)

将机器人添加到RoboDK环境

首先打开RoboDK程序并添加将要使用的机器人。添加机器人需要在GUI中从 File -> Open online library 打开库。通过该界面找到与您的模型匹配的机器人,将鼠标悬停在其上并选择 Open 。如果机器人没有出现在工作站中,请选择 Download 并将其拖放到.rdk环境中。 Select a robot RoboDK tutorial 中也对此进行了描述。

通过RoboDK连接到机器人

警告

根据所使用的机器人品牌,可能需要安装驱动程序才能正确连接到RoboDK。有关此设置的帮助文件,请查看RoboDK文档中的机器人相关的提示部分。例如,这里是对 ABB robots 的建议。

在运行Touch Test脚本之前,首先需要使用RoboDK的接口连接到机器人。在RoboDK GUI中导航到 Connect -> Connect Robot 。这将打开一个侧面板,您可以在其中输入机器人IP和端口号。

倾斜的Zivid标定板。

备注

大多数机器人的控制器或平板电脑控制器上都有远程模式。请确保您的机器人处于远程模式以便能够建立连接。

要连接到机器人,您必须知道它的IP地址,它应该可以在机器人控制面板中找到/列出。按照 connecting to the robot for RoboDK 中的步骤操作。另一个需要验证的连接是端口号。除非之前进行了更改,否则驱动程序附带的默认编号应该可以使用。

请点击 Connect ,如果 Connection status 框为绿色,则可以使用RoboDK界面控制机器人了。如果它是红色的,请确保您拥有正确的端口号和IP地址。如果它仍然是红色的,请查看本教程末尾的RoboDK故障排除章节。

为触碰测试创建捕获位姿

了解 how to create a target in RoboDK 来保存触碰测试的捕获位姿。

可以通过两种方式使用RoboDK创建位姿:

  1. 使用示教器将机器人物理移动到所需的位姿,然后通过RoboDK连接并记录这些位姿

  2. 通过RoboDK远程移动机器人来创建和保存这些位姿

小技巧

如果您通过RoboDK移动机器人,但是机器人的移动速度太快或太慢,请查看链接 set the robot speed in RoboDK 进行调整。设置好速度后,记得右键单击您创建的程序并标记 Run on the robot ,然后再次右键单击并选择 Run

在创建Touch Test Capture Pose之前,您必须考虑计划放置Zivid标定板的位置。如果是Eye-in-Hand,请确保它位于相机的 :abbr:` FOV (视野)` 中。如果是Eye-to-Hand,请确保机器人不会在拍照时挡住Zivid标定板。触碰测试只需要一个位姿。您可以从下图中看到RoboDK中的显示画面。

在RoboDK上进行触碰测试的位姿。

小技巧

要控制所使用的机器人配置,请确保保存的target是joint target,而不是cartesian target。在RoboDK中右键单击target并选择joint target会将位姿转换为joint target。这也会将target的符号颜色从红色更改为绿色。

Cartesian target和joint target之间的差异。

运行触碰测试

在运行脚本之前,需要打开.rdk文件并连接到机器人。 The script can be found in the Zivid Python Samples ;它使用了如下所示的命令行参数。

跳转到源

source

type_group.add_argument("--eih", "--eye-in-hand", action="store_true", help="eye-in-hand calibration")
type_group.add_argument("--eth", "--eye-to-hand", action="store_true", help="eye-to-hand calibration")
parser.add_argument("--ip", required=True, help="IP address of the robot controller")
parser.add_argument(
    "--target-keyword",
    required=True,
    help="RoboDK target name representing a robot pose at which the calibration board is in the field of view of the camera",
)
parser.add_argument(
    "--tool-yaml",
    required=True,
    help="Path to YAML file that represents the Pointed Hand-Eye Verification Tool transformation matrix",
)
parser.add_argument(
    "--mounts-yaml",
    required=False,
    help="Path to YAML file that represents the on-arm mounts transformation matrix",
)
parser.add_argument(
    "--hand-eye-yaml",
    required=True,
    help="Path to the YAML file that contains the Hand-Eye transformation matrix",
)

脚本初始化后,机器人将移动到先前定义的捕获位姿。然后,要求用户将Zivid标定板放置于相机 :abbr:` FOV (视野)` 中,再按下 Enter 。之后相机将捕获棋盘格,在计算出触碰点的位姿后,机器人将触碰棋盘格上的角。当用户按下 Enter 键时,机器人向后退出并返回到捕获位姿。此时,可以移动Zivid标定板以在不同的位置执行触碰测试。用户会被要求输入 "y" 或者 "n" 来重复或中止触碰测试。

关于脚本

要使RoboDK手眼标定验证脚本能够正常运行,需要三个额外的Python文件。

  1. robodk_tools.py , 用于配置机器人。

  2. save_load_matrix.py ,用于在YAML文件中保存和加载矩阵。

该脚本分别运行以下步骤:

连接到机器人

首先,我们使用IP地址连接到机器人。然后我们将得到一个用于与模拟器建立链接的 rdk 对象和一个包含了各种机器人配置参数的 robot 对象。

跳转到源

source

rdk, robot = connect_to_robot(user_options.ip)

设置机器人速度和加速度

机器人配置的最后一步是定义机器人的速度和加速度。

跳转到源

source

set_robot_speed_and_acceleration(robot, speed=120, joint_speed=120, acceleration=120, joint_acceleration=120)

加载尖头手眼验证工具的转换矩阵

然后加载定义尖头手眼验证工具的转换矩阵。

跳转到源

source

print("Loading the Pointed Hand-Eye Verification Tool transformation matrix from a YAML file")
pointed_hand_eye_verification_tool_matrix = load_and_assert_affine_matrix(user_options.tool_yaml)

定义TCP转换矩阵

然后我们需要定义工具中心点 ( TCP )。首先,程序将检查用户是否提供了包含手臂安装支架转换矩阵的.yaml文件。如果用户没有提供任何手臂安装支架转换矩阵,那么我们假设尖头手眼验证工具是直接连接到机器人的末端执行器。因此, TCP 矩阵等同于尖头手眼验证工具矩阵。

跳转到源

source

if user_options.mounts_yaml:
    print("Loading the on-arm mounts transformation matrix from a YAML file")
    flange_to_on_arm_mounts_transform = load_and_assert_affine_matrix(user_options.mounts_yaml)

    tcp = flange_to_on_arm_mounts_transform @ pointed_hand_eye_verification_tool_matrix
else:
    tcp = pointed_hand_eye_verification_tool_matrix

移动到捕获位姿

机器人移动到 capture_pose ,这是从运行此示例时打开的.rdk文件中获取的。

跳转到源

source

capture_pose = get_robot_targets(rdk, target_keyword=user_options.target_keyword)
if not capture_pose:
    raise IndexError(
        "The list of poses retrieved from RoboDK is empty...\nMake sure that you have created a Capture Pose and that you introduced the right keyword for it."
    )
robot.MoveJ(capture_pose[0])

放置Zivid标定板

下一步是确保用户已将Zivid标定板放置在相机的 :abbr:` FOV (视野)` 中。

跳转到源

source

print("\nPlace the calibration board in the FOV of the camera.")
input("Press enter to start.")

检测Zivid标定板及估计其位姿

按下 Enter ,将捕获Zivid标定板并估计其在相机坐标系中的位姿。

跳转到源

source

print("Detecting the calibration board pose (upper left checkerboard corner)")
camera_to_calibration_board_transform = _capture_and_estimate_calibration_board_pose(camera)

将Zivid标定板位姿从相机坐标系转换到机器人基坐标系

跳转到源

source

print("Calculating the calibration board pose in robot base frame")
robot_base_to_calibration_board_transform = _get_robot_base_to_calibration_board_transform(
    user_options,
    camera_to_calibration_board_transform,
    robot,
)

如需了解此转换背后的数学原理,请查看 手眼标定解决方案

获得触碰位姿

由于我们控制机器人移动到的触碰姿势是末端执行器(法兰)的位姿,因此我们还需要考虑 TCP

跳转到源

source

print("Calculating pose for robot to touch the calibration board")
touch_pose = robot_base_to_calibration_board_transform @ np.linalg.inv(tcp)

获取接近位姿

我们将接近位姿定义为与触碰姿势在Z轴上存在一定偏移量的一个位姿,比如选择为-140mm。

跳转到源

source

print("Calculating pose for the robot to approach the calibration board")
touch_pose_offset = np.identity(4)
touch_pose_offset[2, 3] = -140
approach_pose = touch_pose @ touch_pose_offset

触碰Zivid标定板

在接触Zivid标定板之前,机器人首先将通过关节运动模式移动到接近位姿。然后通过直线运动模式移动到触碰位姿。此时,用户可以靠近Zivid标定板,通过目测来检查触碰位置的准确性。

跳转到源

source

print("Touching calibration board (upper left checkerboard corner)")
robot.MoveJ(Mat(approach_pose.tolist()))
robot.MoveL(Mat(touch_pose.tolist()))

远离Zivid标定板

该程序需要用户按下 Enter 以使机器人从Zivid标定板返回捕获位姿。

跳转到源

source

input("\nPress enter to pull back and return to the capture pose...")
robot.MoveL(Mat(approach_pose.tolist()))
robot.MoveJ(capture_pose[0])

再次触碰Zivid标定板

此时,可以将标定板移动至相机的 FOV 内的不同位置继续执行触碰测试。需要用户输入 "y" 或者 "n" 来重复或中止触碰测试。

跳转到源

source

print("\nThe board can be moved at this time.")
answer = _yes_no_prompt("Perform another touch?")
if answer == "n":
    break

RoboDK疑难解答

机器人以与预期不同的配置运动

要进行可重复的触碰测试过程,请使用关节目标(joint targets),因为机器人将始终采用相同的配置。使用笛卡尔目标(cartesian targets)会允许机器人选择可能导致碰撞的配置。在下图中,您可以看到两个目标,用红色表示的 target 1 和用绿色表示的 target 2 。红色表示目标是笛卡尔目标,绿色则表示它是一个关节目标。

Cartesian target和joint target之间的差异。
在Windows上开启防火墙的情况下进行连接

备注

此方法在 Windows 10 上进行了测试。

检查驱动阻塞

在连接到运行Windows的计算机时,请注意防火墙可能会阻止与机器人的连接。一种方法是完全禁用防火墙,但通常不建议这样做,因为它会使您的系统易于受到攻击。

另外的方法是您可以在Windows防火墙中添加新的规则,以仅允许与您使用的机器人的驱动程序和IP地址进行通信。要找到这两个属性,请通过选择 connect to robot 展开 more options 面板。在这种情况下,驱动程序是 apiur

显示驱动名称。

打开系统上的Windows Defender 防火墙并进入 Advanced settings 。在这里您可以更改规则以允许与控制机器人所需的驱动程序进行通信。

如果机器人驱动程序上有阻塞标志,请检查入站规则。如果驱动程序被阻止,请禁用此规则,否则防火墙会阻止其通信。

阻止驱动程序和禁用规则按钮。

禁用此规则后,请检查RoboDK软件是否可以连接到机器人。如果仍然无法连接到机器人,则需要制定一条规则,专门允许驱动程序与机器人进行通信。

创建新的入站规则

通过单击 New Rule… ,您可以创建并定义一个允许您的计算机和机器人之间进行通信的规则。

添加新的入站规则。

首先,您需要在第一页选择 Custom 选项,在第二页选择 All programs 选项。您可以在下面找到它。

前两步。

在下一页您需要选择TCP作为协议,然后选择特定的本地端口并输入与RoboDK中匹配的端口号。

选择协议和端口。

下一步是设置IP地址。在 Which remote IP address does this rule apply to? 下选择 These IP addresses 。然后点击 Add 并设置与RoboDK中匹配的IP。

选择规则范围。

点击 OK ` 和 :guilabel:`Next ,选择 Allow all connections 并在下一页选中所有复选框。

设置操作和配置文件。

最后,请为该规则选择一个合适的名称,点击 Finish 就可以了!

设置操作和配置文件。