手眼标定的注意事项和建议

常见错误

图像质量

  • 确保标定对象在所有图像中曝光良好且清晰对焦。

  • 保持物体在 景深范围内

    • 使用更大的 \(f\)-值 (更小的光圈)。

    • 通过增大曝光时间来弥补。

  • 所有图像均使用相同的光圈设置,以避免因光圈大小不同而导致的波动。

  • 通过激发标定对象和机器人的所有六个自由度,从不同角度捕获标定对象的图像。

  • 请遵循 如何获取 Zivid 标定对象的高质量数据 的指南。

Zivid API

  • Zivid 点云以毫米 (mm) 为单位。

  • 因此,请确保用于手眼标定的机器人输入位姿中,平移量也使用毫米(mm)作为单位。

  • 因此,手眼标定输出的平移量将以毫米(mm)为单位。

检测

  • 如果使用 Zivid calibration board ,请确保 ArUco 标记在所有位姿中都可见;否则,棋盘格检测将失败。

  • 如果使用一个或多个 ArUco 标记作为标定对象,则并非所有标记都需要在每个位姿中都可见。

检测(detection) API 提供了有关检测失败原因的信息。以下是检查检测状态的示例:

跳转到源码

source

const auto detectionResult = Zivid::Calibration::detectCalibrationBoard(frame);

if(detectionResult.valid())
{
    std::cout << "Calibration board detected " << std::endl;
    handEyeInput.emplace_back(robotPose, detectionResult);
    currentPoseId++;
}
else
{
    std::cout << "Failed to detect calibration board. " << detectionResult.statusDescription() << std::endl;
}
跳转到源码

source

using (var frame = camera.Capture2D3D(settings))
{
    var detectionResult = Detector.DetectCalibrationBoard(frame);

    if (detectionResult.Valid())
    {
        Console.WriteLine("Calibration board detected");
        handEyeInput.Add(new HandEyeInput(robotPose, detectionResult));
        ++currentPoseId;
    }
    else
    {
        Console.WriteLine("Failed to detect calibration board, ensure that the entire board is in the view of the camera");
    }
}
跳转到源码

source

detection_result = zivid.calibration.detect_calibration_board(frame)

if detection_result.valid():
    print("Calibration board detected")
    hand_eye_input.append(zivid.calibration.HandEyeInput(robot_pose, detection_result))
    current_pose_id += 1
else:
    print(f"Failed to detect calibration board. {detection_result.status_description()}")

手眼配置

  • 标定对象安装在机器人末端执行器上,并随机器人一起移动。

  • 安装方式可以是直接固定在法兰上,也可以用夹具固定。

  • 确切的安装位置并不重要(无需知道它相对于末端执行器的位姿)。

建议:

  • 确保标定对象在机器人运动过程中相对于法兰或夹爪不发生移动。

  • 使用刚性材料制作支架和标定对象(例如,使用 Zivid On-Arm MountZivid calibration board 安装到机器人上)。

  • 通过控制加速度,确保机器人运动平稳,避免抖动或移位。

  • 确保在图像采集过程中标定对象保持静止(例如,在机器人运动后等待几秒钟,让振动稳定下来后再进行拍摄)。

  • 标定对象静止在机器人的工作空间内。

  • 物体的确切位置并不重要(不需要知道它相对于机器人底座的位姿)。

  • (安装在末端执行器上的)相机必须能够从多个角度看到标定对象。

建议:

环境条件

标定过程中保持相机温度稳定:

准确度和重新标定

拣货准确率取决于:

  • 相机标定

  • 手眼标定

  • 机器视觉软件

  • 机器人定位

机器人通常情况下虽然重复精度高,但由于温度、关节摩擦、有效载荷、制造公差等因素的影响,其本身并不精确。

建议:

  • 执行主校准(归零),以确认机器人每个关节的精确零位。

  • 对机器人进行标定以提高位姿精度。

  • 请在完成 预热 后、进行手眼标定前,执行 现场标定

  • 如果出现以下情况,请重复手眼标定:

    • 机器人失去校准。

    • 相机被拆卸并重新安装。

  • 定期进行重新标定(机器人和/或手眼标定)以保持系统性能。

选择正确的方法

  • 在手眼标定过程中,避免使用计算或需要 相机内参 的方法:

    • Zivid 相机已使用复杂的专有模型进行校准。

    • Zivid SDK 为 OpenCV 和 Halcon 模型提供了内参近似值,但这些近似值会损失精度(与专有模型不同)。

建议:

  • 使用 Zivid 手眼标定时,将利用 3D 点云数据进行外参的计算。

  • 基于 CAD 匹配的替代方法也可以(它们也从点云计算相机外参);但是,它们可能缺乏 Zivid 特有的优化。

  • Zivid 方法的其他优点是支持 ArUco 标记,这些标记可以永久安装在机器人工作站(手臂安装的相机)或机器人上(固定安装的相机)。

详细解释

一些第三方手眼标定方法会计算相机的内参、外参以及相机与机器人坐标系之间的相对位姿。我们不推荐这些方法,因为它们将 Zivid 相机视为未经标定的 2D 相机,而不是经过良好标定的 3D 相机。

每台Zivid相机都经过了一系列的标定过程,其中包括了2D彩色相机的内参。我们的标定使用了复杂的相机模型,其内参数量比一些众所周知的针孔相机模型(例如OpenCV相机模型)更多。由于Zivid相机模型是专有的,因此我们的内部相机内参无法通过SDK获取。但是,Zivid SDK确实从我们的相机模型中提供了OpenCV和Halcon模型的近似数据(请参阅 相机内参 )。由于一些信息在近似数据中丢失,因此使用OpenCV或Halcon格式内参的手眼标定方法也不是最佳方法。

由于Zivid相机提供了3D数据,因此可以通过点云计算相机外参。 Zivid手眼标定方法利用了这一优势,这就是为什么它是推荐的标定方法,也是最适合我们相机的方法。当然也有可替代的第三方方法,它们通过点云计算相机外参。这些方法完全依赖于点云数据,比如基于CAD匹配的手眼标定方法。

使用 Zivid 手眼标定的另一个益处是其支持 ArUco 标记,这些标记相对较小,因此可以永久安装在机器人单元中。它们对于固定安装的相机(眼在手外)特别方便,因为它们可以安装在机器人法兰和夹持器之间。另一方面,对于手臂安装的相机(眼在手上),标记可以永久安装在机器人工作空间的某个位置。

希望您已经成功运行了手眼标定。如需检查结果的准确性,请阅读 如何验证手眼标定

版本历史记录

SDK

变更

2.15.0

有关检测失败原因的信息已添加到 detection API。