任意机械臂 + 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故障排除章节。
为手眼标定创建位姿
阅读 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("--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
对象。
rdk, robot = connect_to_robot(user_options.ip)
设置机器人target
然后,我们使用 robodk_tools.py 中的 get_robot_targets()
函数来获取target列表。该列表是从RoboDK .rdk文件中获得的,其中包含了每个target的机器人位姿。要获取target列表,我们需要提供我们在上一步中获得的 rdk
对象和用户提供的target关键字作为参数。
targets = get_robot_targets(rdk, user_options.target_keyword)
设置机器人速度和加速度
机器人配置的最后一步是定义机器人的速度和加速度。为了定义这些参数,我们创建了一个名为 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
作为参数,机器人配置就完成了。
set_robot_speed_and_acceleration(robot, speed=100, joint_speed=100, acceleration=50, joint_acceleration=50)
生成手眼数据集
现在我们将通过将机器人移动到目标列表中的每个位姿来生成手眼数据集。对于每个位姿,我们需要在捕获过程中捕获并保存ZDF文件和对应的机器人位姿。在此步骤中,要求用户提供目录的路径,来创建名为 datasets/hand-eye
的文件夹并将数据集保存到该文件夹中。如果未提供路径,将使用默认路径(此脚本的位置)。为了生成这个数据集,我们需要使用 generate_hand_eye_dataset()
函数。它会将一个zivid application、 app
对象作为参数来获取对相机的访问权限,以及一个 robot
对象来获取机器人移动到的目标列表。
dataset_dir = generate_hand_eye_dataset(app, robot, targets, user_options)
执行手眼标定
为了执行手眼标定,我们遍历了上一步保存的所有机器人位姿和ZDF文件。使用 perform_hand_eye_calibration()
函数,以标定类型(手眼或手眼)和数据集目录的路径作为参数,我们获得手眼变换矩阵和残差。
if user_options.eih:
transform, residuals = perform_hand_eye_calibration("eye-in-hand", dataset_dir, user_options)
else:
transform, residuals = perform_hand_eye_calibration("eye-to-hand", dataset_dir, user_options)
保存手眼结果
最后,我们将保存变换矩阵和残差。这是通过使用函数 save_hand_eye_results()
来实现的,其中保存的路径(在本例中即为数据集路径)为该函数所需的参数。
_save_hand_eye_results(dataset_dir, transform, residuals)
验证并使用手眼变换
完成手眼标定后,您可能需要验证生成的变换矩阵是否正确并在精度要求内。
我们有一个示例可以 verify the hand-eye calibration with visualization ,所有点云都将通过手眼标定得到的转化矩阵来转换到机器人基坐标系,并重叠显示。通过目视检查标定对象点云的重叠程度,我们可以了解机器人位姿和手眼变换的准确性。换句话说,我们将手眼标定精度和机器人定位精度进行了可视化。
我们推荐的另一种验证方法是将 Zivid标定对象 放置在您的场景中并运行我们的触碰测试示例。该示例将捕获并检测标定板,计算其位姿并移动机器人(配备了尖头手眼验证工具)以在其特定点触碰该对象。然后,您可以通过检查工具的尖端与该点的距离来目视检查机器人移动到目标位姿的情况。要了解如何运行触碰测试,请阅读 任意机械臂 + RobotDK + Python:通过触碰测试验证手眼标定的结果 一文。
我们还有一个示例,您可以通过它来了解如何 utilize the hand-eye transform ,该示例展示了如何将单个点或整个点云从相机坐标系变换到机器人基坐标系。
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 就可以了!