UR5 Robot + Python:生成数据集并执行手眼标定
备注
本教程是使用优傲机器人UR5e进行测试的。
介绍
精确的手眼标定是基于一个良好的数据集的,但是生成这样一个数据集却并非易事。 在本教程中,我们首先在Zivid相机和优傲机器人(UR)UR5e之间建立通信,以提取由3D图像和机器人位姿组成的数据集。 然后,我们使用该数据集进行手眼标定。 该示例对eye-in-hand 和eye-to-hand均适用。
如果您对手眼标定还不熟悉,我们建议您查看 手眼标定.
要求
支持标准TCP / IP连接的UR机器人。
已安装 Zivid-Python。
准备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) 协议完成。通信流程如下图所示。
在我们生成数据集之前,必须对UR机器人运动脚本进行一些调整。
修改 universal_robots_robot_motion_script.urp 机器人运动脚本
首先,将 universal_robots_robot_motion_script.urp 文件保存到 U 盘,然后将脚本加载到 UR 控制器上。您的控制器界面应该显示类似以下内容的界面:
在这里,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>
To generate a good dataset, we want to follow the steps explained in 手眼标定的流程. Every waypoint, robot_pose_X, must be modified to fit the setup. The easiest way is to set the robot in free-drive and move it with your hands to the desired postures. Make sure that the Zivid Calibration Object is visible for the camera at each of these postures. If you are using ArUco markers, not all of them need to be visible for each capture.
如何在 Zivid 标定对象上获取高质量数据 描述了如何设置参数以获得最佳的3D图像质量。
小心
如果捕获的标定对象的图像曝光不佳,手眼标定可能无法正常工作。
如果您需要添加或删除路点(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
对于Eye-in-hand:
python universal_robots_perform_hand_eye_calibration.py --eih --ip 192.168.0.123 marker --dictionary aruco4x4_50 --ids 1 2 3对于Eye-to-hand:
python universal_robots_perform_hand_eye_calibration.py --eth --ip 192.168.0.123 marker --dictionary aruco4x4_50 --ids 1 2 3
使用机器人的实际IP地址代替 192.168.0.123 。在UR示教器的右上角,进入 Hamburger menu → System 检查或设置机器人的IP地址。
通过在命令提示符中键入以下命令来显示 Python 脚本所需的不同输入:
python universal_robots_perform_hand_eye_calibration.py -h
脚本运行完成后,它会输出以下内容:
我们保存数据的目录
手眼变换 - 4x4标定矩阵
每个机器人位姿的旋转和平移的 残差*(*residual )
如需了解关于Zivid如何计算残差的更详细的说明,请查看 手眼标定的残差。
有了变换矩阵后,就可以使用它将3D点从相机坐标系转换到机器人基坐标系。 有关如何执行此操作的详细信息,请参阅 如何使用手眼标定的结果。