任意机械臂 + RobotDK + Python:生成数据集并执行手眼标定
备注
本教程仅在 UR5e 和 Yaskawa H10 上进行了测试,并且仅适用于 RoboDK 支持的机器人型号。
介绍
准确的手眼标定需要一个良好的数据集,但生成这样的数据集可能是一项艰巨的任务。简化此任务的一种方法是预先保存机器人位姿,然后自动执行采集过程。在本教程中,我们使用 RoboDK 来自动获取手眼数据集。这为我们提供了从 Zivid 手眼标定中获取手眼变换矩阵所需的 3D 图像和机器人位姿。此示例适用于 eye-in-hand 和 eye-to-hand。
如果您不熟悉手眼标定,我们建议您从阅读 手眼标定 文章开始。
要求
安装 Zivid software ,如果是在 Linux 上进行安装,需要同时安装 Zivid Tools。
安装 Zivid-Python 。
安装 RoboDK software 。
在 Robodk robot library 中有一台数字孪生的机器人。
设置 RoboDK 环境
RoboDK .rdk 文件存储了有关机器人、目标位姿和环境的信息。 .rdk 文件中生成手眼标定数据集所需且有用的组件是:
机器人模型文件 (.robot)
目标位姿列表(比如 Target 0、Target 1、Target 2 等)
机器人环境虚拟模型(可选)
正在使用的相机的 CAD 模型,例如, Zivid 2 CAD file (可选)
通过在 RoboDK 中打开这个.rdk 文件示例来查看。 示例文件
将机器人添加到 RoboDK 环境
首先打开 RoboDK 程序并添加将要使用的机器人。如需添加机器人,请在 GUI 中打开 File -> Open online library 。通过此界面找到与您的模型相匹配的机器人,将鼠标悬停在其上并选择 Open 。如果机器人没有出现在工作站中,请选择 Download 并将其拖放到 .rdk 环境中。 Select a robot RoboDK tutorial 中也对此进行了描述。
通过 RoboDK 连接机器人
警告
根据所用机器人的品牌,可能需要驱动程序设置才能连接到 RoboDK。有关此设置的帮助,请查看 RoboDK 文档中的机器人提示部分。例如,这是针对 ABB robots 的建议。
在运行 Hand-Eye 脚本之前,首先需要使用 RoboDK 接口连接到机器人。在 RoboDK GUI 中导航到 Connect -> Connect Robot 。这将打开一个侧方面板,您可以在其中插入机器人 IP 和端口号。
备注
大多数机器人的控制器或平板电脑控制器上都有远程模式。请确保您的机器人处于远程模式以便能够建立连接。
要连接到机器人,您必须知道它的 IP 地址,该地址应该可以在机器人控制面板中找到/列出。按照 connecting to the robot for RoboDK 中的步骤操作。此外,请验证端口号。除非之前进行了更改,否则驱动程序附带的默认编号应该可以使用。
点击 Connect ,如果 Connection status 框为绿色,则可以使用 RoboDK 界面控制机器人了。如果它是红色的,请确保您拥有正确的端口号和 IP 地址。如果它仍然是红色的,请查看本教程末尾的 RoboDK 故障排除章节。
为手眼标定创建位姿
警告
如果您的机器人已标定,则需要在创建手眼数据集之前,将机器人控制器中的 DH 参数加载到 RoboDK 中。不正确的机器人标定会导致手眼标定结果不佳。在 机器人标定错误(DH 参数) 故障排除文章中,我们解释了如何检索和加载 UR 机器人的 DH 参数。如果您的机器人已标定,并且不是 UR 机器人,请查阅机器人文档以了解如何检索 DH 参数。
阅读 how to create a target in RoboDK 以了解如何保存位姿。
可以通过两种方式使用 RoboDK 创建位姿:
使用控制器将机器人移动到所需的位姿,然后通过 RoboDK 连接并记录位姿
通过 RoboDK 远程移动机器人来创建和保存位姿
小技巧
如果您通过 RoboDK 移动机器人,但是机器人的移动速度太快或太慢,请查看链接 set the robot speed in RoboDK 进行调整。设置好速度后,记得右键单击您创建的程序并标记 Run on the robot ,然后再次右键单击并选择 Run 。
添加到序列中的每个位姿都应使相机面向标定对象,并将整个标定对象保持在视野中。标定对象应该在图像位置中居中。创建位姿时,可以使用 Zivid Studio 的实时模式进行捕获并观察机器人是否移动到合适的位姿。这有助于选择能够提供最佳覆盖范围的方向。建议使用 10-20 个位姿以获得准确的手眼变换。您可以从下图中看到 RoboDK 中的显示画面。
运行 Python 脚本
在运行脚本之前,需要打开.rdk 文件并连接到机器人。 The script can be found in the Zivid python samples ; 它采用以下强制命令行参数,如下所示。
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(
"--settings-path",
required=False,
type=Path,
help="Path to the camera settings YML file",
)
parser.add_argument("--ip", required=True, help="IP address of the robot controller")
parser.add_argument(
"--target-keyword",
required=True,
help='This is the keyword shared for naming all poses used for hand-eye dataset, i.e. if we have: "Target 1", "Target 2", ... , "Target N". Then we should use "Target"',
)
subparsers = parser.add_subparsers(dest="calibration_object", required=True, help="Calibration object type")
subparsers.add_parser("checkerboard", help="Use checkerboard for calibration")
marker_parser = subparsers.add_parser("marker", help="Use marker for calibration")
marker_parser.add_argument(
"--dictionary",
required=True,
choices=list(zivid.calibration.MarkerDictionary.valid_values()),
help="Dictionary used for marker calibration",
)
marker_parser.add_argument("--ids", nargs="+", required=True, type=int, help="IDs used for marker calibration")
脚本初始化后,它将提供选择用于存储数据集和结果的替代路径的选项。如果未指定路径,则数据集和结果将存储在 hand-eye/datasets/<date acquired> 中。该脚本运行给定的位姿并执行手眼标定,如下所示。
关于脚本
要使 RoboDK 手眼标定脚本正常运行,它需要两个额外的 python 文件。
robodk_tools.py ,用于配置机器人。
save_load_matrix.py ,用于在 YAML 文件中保存和加载矩阵。
脚本将分别运行以下步骤:
连接到机器人
首先,我们需要使用 connect_to_robot() 中的函数 robodk_tools.py 来连接到机器人,方法是提供 IP 地址作为参数。该函数返回一个用于与模拟器建立链接的 rdk 对象和一个包含各种机器人配置参数的 robot 对象。
设置机器人 target
然后,我们使用 robodk_tools.py 中的 get_robot_targets() 函数来获取 target 列表。该列表是从 RoboDK .rdk 文件中获得的,其中包含了每个 target 的机器人位姿。要获取 target 列表,我们需要提供我们在上一步中获得的 rdk 对象和用户提供的 target 关键字作为参数。
设置机器人速度和加速度
机器人配置的最后一步是定义机器人的速度和加速度。为了定义这些参数,我们创建了一个名为 robot_speed_accel_limits 的包含了 4 个整型数据的列表:分别为 linear speed(线性速度)、joint speed(关节速度)、linear acceleration(线性加速度)和 joint acceleration(关节加速度)。然后,使用 robodk_tools.py 中的 set_robot_speed_and_acceleration() 函数,以及 robot 对象和 robot_speed_accel_limits 作为参数,机器人配置就完成了。
生成手眼数据集
现在我们将通过将机器人移动到目标列表中的每个位姿来生成手眼数据集。对于每个位姿,我们需要在捕获过程中捕获并保存 ZDF 文件和对应的机器人位姿。在此步骤中,要求用户提供目录的路径,来创建名为 datasets/hand-eye 的文件夹并将数据集保存到该文件夹中。如果未提供路径,将使用默认路径(此脚本的位置)。为了生成这个数据集,我们需要使用 generate_hand_eye_dataset() 函数。它会将一个 zivid application、 app 对象作为参数来获取对相机的访问权限,以及一个 robot 对象来获取机器人移动到的目标列表。
执行手眼标定
为了执行手眼标定,我们遍历了上一步保存的所有机器人位姿和 ZDF 文件。使用 perform_hand_eye_calibration() 函数,以标定类型(手眼或手眼)和数据集目录的路径作为参数,我们获得手眼变换矩阵和残差。
保存手眼结果
最后,我们将保存变换矩阵和残差。这是通过使用函数 save_hand_eye_results() 来实现的,其中保存的路径(在本例中即为数据集路径)为该函数所需的参数。
验证并使用手眼变换
完成手眼标定后,下一步是验证得到的变换矩阵是否正确,是否符合精度要求。
在文章 如何验证手眼标定 中,我们描述了几种方法。然而,我们推荐的手眼标定验证方法是将 Zivid 标定对象 放置在场景中,并使用机器人执行触碰测试:
如果您准备学习如何使用手眼变换,我们建议您阅读 如何使用手眼标定结果 。
RoboDK 疑难解答
机器人以与预期不同的配置运动
在 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 即可!