UR5 Robot + Python:生成数据集并执行手眼标定

备注

本教程是使用优傲机器人UR5e进行测试的。

介绍

精确的手眼标定是基于一个良好的数据集的,但是生成这样一个数据集却并非易事。 在本教程中,我们首先在Zivid相机和优傲机器人(UR)UR5e之间建立通信,以提取由3D图像和机器人位姿组成的数据集。 然后,我们使用该数据集进行手眼标定。 该示例对eye-in-hand 和eye-to-hand均适用。

如果您对手眼标定还不熟悉,我们建议您查看 手眼标定.

要求

准备UR5e机器人

从 Github克隆 zivid-python-samples ,导航到 ur_hand_eye_calibration 文件夹并安装 runtime requirements.

cd source\applications\advanced\hand_eye_calibration\ur_hand_eye_calibration
pip install -r requirements.txt
cd source/applications/advanced/hand_eye_calibration/ur_hand_eye_calibration
pip install -r requirements.txt

这将安装所有第三方库,包括UR RTDE (Real-Time Data Exchange) 通信协议。

该示例需要需要以下三个文件:

  • universal_robots_communication_file.xml - 包含I/O寄存器的配置文件。

  • universal_robots_robot_motion_script.urp - 在UR控制器中创建及运行的机器人运动脚本。

  • universal_robots_perform_hand_eye_calibration.py - 用于捕获图像和位姿,及保存它们并执行手眼标定的python脚本。

机器人运动脚本是我们设置标定中使用的所有机器人位姿的地方。python脚本用于捕获图像,读取机器人位姿并执行手眼标定。 机器人与计算机之间的通信通过UR RTDE (Real-Time Data Exchange) 协议完成。通信流程如下图所示。

../../../_images/hand-eye-ur5-python-flow-diagram.png

在我们生成数据集之前,必须对UR机器人运动脚本进行一些调整。

修改 universal_robots_robot_motion_script.urp 机器人运动脚本

首先,将 universal_robots_hand_eye_script.urp 文件保存在USB驱动器上,然后将脚本加载到您的UR控制器上。您的控制器界面应显示以下内容:

../../../_images/hand-eye-ur5-script-screenshot.png

在这里,capture_hand_eye 是一个用于触发相机在机器人移动到不同位姿时捕获图像的子程序。子程序通过寄存器(通信接口上的逻辑通道)与PC通信。以下是用于与python脚本通信的I/O变量:

  • image_count

  • start_capture

  • camera_ready

  • finish_capture

output_int_register_24 = image_count

计算获得的图像和位姿的数量。

output_bit_register_64 = start_capture

用于触发相机捕获图像的布尔型变量。

input_bit_register_64 = finish_capture

用于触发UR机器人移动到下一个位姿的布尔型变量。

input_bit_register_65 = ready_to_capture:

通知UR机器人相机处于ready状态的布尔型变量。

universal_robots_communication_file.xml 声明了我们正在写入的寄存器。 如果我们在python脚本中更改了某个寄存器,则必须在配置文件中更改该寄存器。

<?xml version="1.0"?>
<rtde_config>
    <recipe key="out">
        <field name="actual_TCP_pose" type="VECTOR6D"/>
        <field name="output_int_register_24" type="INT32"/>
        <field name="output_bit_register_64" type="BOOL"/>
    </recipe>
    <recipe key="in">
        <field name="input_bit_register_64" type="BOOL"/>
        <field name="input_bit_register_65" type="BOOL"/>
    </recipe>
</rtde_config>

为了生成一个良好的数据集,我们需要按照 手眼标定的流程 中说明的步骤进行操作。必须修改每个路点(waypoint) robot_pose_X 以配合设置。最简单的方法是将机器人设置为*自由驱动*模式,然后用手将其移动到所需的位姿。请确保在所有的位姿下,相机都可以观测到 Zivid棋盘格 。如果您捕获的棋盘格(暗方块和亮方块)的点云质量和覆盖范围不够好,请在以下函数中修改相机设置:

def _camera_settings() -> zivid.Settings:
    """Set camera settings

    Returns:
        Zivid Settings
    """
    return zivid.Settings(
        acquisitions=[
            zivid.Settings.Acquisition(
                aperture=8.0,
                exposure_time=datetime.timedelta(microseconds=10000),
                brightness=1.0,
                gain=1,
            )
        ],
        processing=zivid.Settings.Processing(
            filters=zivid.Settings.Processing.Filters(
                smoothing=zivid.Settings.Processing.Filters.Smoothing(
                    gaussian=zivid.Settings.Processing.Filters.Smoothing.Gaussian(enabled=True)
                )
            )
        ),
    )

如何获得Zivid标定板的高质量数据 描述了如何设置参数以获得最佳的3D图像质量。

小心

如果捕获的Zivid棋盘格图案的图像曝光不佳,手眼标定可能无法正常工作。

如果您需要添加或删除路点(waypoint),请记住在每个路点之后调用 capture_hand_eye 。我们建议拍摄10-20张图像以获得准确的手眼标定结果。

在运行python脚本之前,建议手动遍历所有机器人位置,并确认机器人在从一个位置移动到另一个位置时不会遇到奇异点的问题。

小心

如果您将进行*eye-in-hand*标定,请确保Zivid相机不会与机器人发生碰撞。

运行python脚本

机器人脚本已根据实际场景修改好,现在可以生成数据集并进行标定了!

小技巧

建议在运行手眼标定之前 预热 相机和运行 现场标定 。建议在预热、现场标定和手眼标定期间使用与您的应用相同的捕获周期。如需进一步降低与温度相关的性能因素的影响,请启用 Thermal Stabilization(热稳定功能)

首先,从UR控制器运行程序 universal_robots_robot_motion_script.urp。当程序启动时,它将等待python脚本将camera_ready变量设置为True。然后,从命令行运行 universal_robots_perform_hand_eye_calibration.py 脚本。

对于Eye-in-hand:

python universal_robots_perform_hand_eye_calibration.py --eih --ip 192.168.0.123

对于Eye-to-hand:

python universal_robots_perform_hand_eye_calibration.py --eth --ip 192.168.0.123

使用机器人的实际IP地址代替 192.168.0.123 。在UR示教器的右上角,进入 Hamburger menuSystem 检查或设置机器人的IP地址。

通过在命令提示符中键入以下命令来显示python脚本所需的不同输入:

python universal_robots_perform_hand_eye_calibration.py -h
../../../_images/hand-eye-full-hand-eye-sample-screenshot.png

脚本运行完成后,它会输出以下内容:

  • 我们保存数据的目录

  • 手眼变换 - 4x4标定矩阵

  • 每个机器人位姿的旋转和平移的 残差*(*residual

如需了解关于Zivid如何计算残差的更详细的说明,请查看 手眼标定的残差

有了变换矩阵后,就可以使用它将3D点从相机坐标系转换到机器人基坐标系。 有关如何执行此操作的详细信息,请参阅 如何使用手眼标定的结果

提示

您可以从我们 的 GitHub 仓库中找到关于转换3D点/点云 的 PythonC++ 示例。