如何在 Zivid 标定对象上获取高质量数据
本教程介绍了如何获取手眼标定中的标定对象的高质量点云。这是使手眼标定算法发挥作用并达到所需精度的关键步骤。我们的目标是配置一种相机设置,无论标定对象位于 FOV 中的何处,都能提供高质量的点云。虽然本教程仅为 Zivid calibration board 提供了点云示例,但相同的原理可以应用于 ArUco 标记。
假设您已经指定了要捕获标定对象点云的机器人位姿。在下一篇文章中,您可以了解到如何选择合适的位姿进行手眼标定。
备注
使用 Zivid calibration board 进行标定时,请确保整块板(包括 ArUco 标记)在每个位姿下都是完全可见的。
备注
使用 ArUco 标记进行标定时,请确保每个位姿至少有一个标记完全可见。如果有更多的标记可见,可以预期获得更好的结果,但这不是必须的要求。
我们将讨论两种位姿:"近端"位姿和"远端"位姿。 "近端"位姿是指相机和标定对象之间的成像距离最小的机器人位姿。在eye-in-hand系统中,这是机器人安装的相机最接近标定对象的位姿。在eye-to-hand系统中,则是机器人将标定对象放置在最靠近固定相机的机器人位姿。
"远端"位姿是指相机与标定对象之间成像距离最大的机器人位姿。在eye-in-hand系统中,是机器人上安装的相机距离棋盘格最远的机器人位姿。在eye-to-hand系统中,则是机器人将棋盘格放置在最远离固定相机的机器人位姿。
小技巧
如果您正在使用 Zivid 标定板进行标定,建议尝试使用 标定板预设设置
在最近和最远的位姿进行成像。如果您获得了良好的结果,则可以跳过本教程的其余部分并继续使用这些设置。请注意,这些预设设置不适用于 ArUco 标记。
预期结果如下图所示:

小技巧
如果您正在使用 ArUco 标记进行标定,建议尝试使用 ArUco 标记预设
在最近和最远的位姿进行成像。如果您获得了良好的结果,则可以跳过本教程的其余部分并继续使用这些设置。

获取用于手眼标定的优秀点云的分步过程如下。
可能的情况
在下面的教程中,我们将使用 SNR 图来检查黑白像素的信号质量。随着 SNR 值的增加,颜色指示器从红色变为深蓝色。下面,您将找到 SNR 范围以及您在本教程中可能遇到的所有可能情况。

基本设置
首先,我们将定义本教程的基本设置。
将机器人移至"近端"位姿
启动 Zivid Studio 并连接到相机
将 Vision Engine 设置为您在应用中使用的引擎;如果使用预设,请检查预设使用的 Vision Engine。
将 Sampling, Color 设置为 rgb。
将 Sampling, Pixel 设置为您在应用中使用的采样设置;如果使用预设,请检查预设使用的 Sampling 设置。
将 Exposure Time 设置为 10000μs(对于 50Hz 电网频率)或 8333μs(对于 60Hz 电网频率)
-
最小焦深(毫米):最远工作距离 - 最近工作距离
最近工作距离(mm):相机与标定对象之间的最近距离
最远工作距离(mm):相机与标定对象之间的最远距离
可接受的模糊半径(像素):1
将 Projector Brightness(投影仪亮度) 设置为最大值
将 Gain(增益) 设置为 1
将 Noise Filter(噪声过滤器) 设置为 5
将 Outlier Filter(离群值过滤器) 设置为 10
将 Reflection Filter(反射过滤器) 设置为 global
关闭所有其它过滤器并将所有其它设置保留为其默认值。
优化"近端"位姿的相机设置
对"近端"的白色区域进行微调(Acquisition 1)
在此阶段,请忽略黑色表面的区域,并专注于获取白色表面的良好数据。捕获并分析标定对象的白色区域。在对白色区域进行微调时,请使用以下图像作为示例。
图像曝光不足(白色像素太暗)
图像曝光过度(白色像素饱和)
-
减少曝光时间可能会导致点云上出现波浪现象,这是由于 环境光 (来自电网)的干扰。如果没有波浪现象,请继续减少曝光时间,直到获得白色区域的良好数据。
如果达到曝光时间限制,并且数据仍不够好或点云呈波浪状,请执行下一个选项。
此时,四个采集项之一("Acquisition 1")即调整完成。
对"近端"的黑色区域进行微调(Acquisition 2)
关闭"Acquisition 1"并克隆它。当前的"Acquisition 2"需要进行调整,以便在标定对象的黑色区域获得良好的数据。因此,预计白色区域会出现过度曝光的情况。以下图为例,由于白色像素曝光过度,我们没有棋盘格中白色部分的数据:
较暗的表面需要较高的曝光。
图像曝光不足(黑色像素太暗)
-
以 10000μs [50Hz] 或 8333μs [60Hz] 为增量增加曝光时间,直到标定对象的黑色区域获得良好数据。如果已达到限制,但数据还不够好,请按照下一个选项操作。
增加 Gain(增益)
优化"远端"位姿的相机设置
对"远端"的白色区域进行微调(Acquisition 3)
关闭"Acquisition 2"并克隆"Acquisition 1"。让我们再次忽略黑色区域,只关注白色区域。捕获并分析标定对象的白色区域。
图像曝光不足(白色像素太暗)
以 10000μs [50Hz] 或 8333μs [60Hz] 为增量增加曝光时间,直到标定对象的黑色区域获得良好数据。如果已达到限制,但数据还不够好,请按照下一个选项操作。
图像曝光过度(白色像素饱和)
-
减少曝光时间可能会导致点云上出现波浪现象,这是由于 环境光 (来自电网)的干扰。如果没有波浪现象,请继续减少曝光时间,直到获得白色区域的良好数据。
如果达到曝光时间限制,并且数据仍不够好或点云呈波浪状,请执行下一个选项。
对"远端"的黑色区域进行微调(Acquisition 4)
关闭"Acquisition 3"并克隆"Acquisition 2"。
当前的"Acquisition 4"需要进行调整,以便在标定对象的黑色区域获得良好的数据。因此,预计白色区域会出现过度曝光的情况。
较暗的表面需要较高的曝光。
图像曝光不足(黑色像素太暗)
-
以 10000μs [50Hz] 或 8333μs [60Hz] 为增量增加曝光时间,直到标定对象的黑色区域获得良好数据。如果已达到限制,但数据还不够好,请按照下一个选项操作。
增加 Gain(增益)
至此,四次采集的设置已配置完毕。现在只是缺少添加最终的过滤器设置。
优化过滤器
将 Gaussian Smoothing(高斯平滑) 设置为 5
将 Contrast Distortion, Removal (对比度失真、移除) 设置为 0.5
将 Gaussian Smoothing(高斯平滑) 设置为 5
保持 Contrast Distortion, Removal 为关闭状态。
Your point cloud should be similar to the point cloud shown at the beginning of the tutorial.
备注
在大多数情况下,两次采集(一次针对"近端"位姿进行优化,另一次针对"远端"位姿进行优化)将在标定对象上提供高质量的数据。确定正确成像设置的另一个选项是使用Capture Assistant(捕获助手)。然而,它目前仅提供整个场景的最佳设置,而不是专门针对棋盘格。虽然捕获助手对于此目的仍然有效,但建议使用上述方法,因为它始终会产生良好的结果。
Capture and Detect
We can now check if it is possible to detect the calibration object in the point cloud.
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;
}
using (var frame = Zivid.NET.Calibration.Detector.CaptureCalibrationBoard(camera))
{
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");
}
}
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()}")
现在让我们看看如何实现 手眼标定的流程。
Version History
SDK |
Changes |
---|---|
2.15.0 |
Added how to check if it is possible to detect the calibration object in the point cloud. |