手眼标定的注意事项和建议
常见错误
图像质量
确保标定对象在所有图像中曝光良好且清晰对焦。
保持物体在 景深范围内 :
使用更大的 \(f\)-值 (更小的光圈)。
通过增大曝光时间来弥补。
所有图像均使用相同的光圈设置,以避免因光圈大小不同而导致的波动。
通过激发标定对象和机器人的所有六个自由度,从不同角度捕获标定对象的图像。
Follow guidelines on How to get Good Quality Data on Zivid Calibration Object.
Zivid API
Zivid 点云以毫米 (mm) 为单位。
因此,请确保用于手眼标定的机器人输入位姿中,平移量也使用毫米(mm)作为单位。
因此,手眼标定输出的平移量将以毫米(mm)为单位。
检测
如果使用 Zivid calibration board ,请确保 ArUco 标记在所有位姿中都可见;否则,棋盘格检测将失败。
If using multiple ArUco markers as a calibration object, not all markers need to be visible in every pose. However, failure to detect the same markers across many poses can make the rotation residual large or invalid even when translation residuals still look good. Ensure mounting hardware (screws, brackets, clamps) does not block the view of a marker from some viewing angles.
检测(detection) API 提供了有关检测失败原因的信息。以下是检查检测状态的示例:
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 = 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");
}
}
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()}")
手眼配置
Eye-to-hand
标定对象安装在机器人末端执行器上,并随机器人一起移动。
安装方式可以是直接固定在法兰上,也可以用夹具固定。
确切的安装位置并不重要(无需知道它相对于末端执行器的位姿)。
建议:
确保标定对象在机器人运动过程中相对于法兰或夹爪不发生移动。
使用刚性材料制作支架和标定对象(例如,使用 Zivid On-Arm Mount 将 Zivid calibration board 安装到机器人上)。
通过控制加速度,确保机器人运动平稳,避免抖动或移位。
确保在图像采集过程中标定对象保持静止(例如,在机器人运动后等待几秒钟,让振动稳定下来后再进行拍摄)。
Eye-in-hand
标定对象静止在机器人的工作空间内。
物体的确切位置并不重要(不需要知道它相对于机器人底座的位姿)。
(安装在末端执行器上的)相机必须能够从多个角度看到标定对象。
建议:
确保标定对象牢固固定,并在标定过程中保持静止(例如,使用 Zivid Stationary Mount 或 Zivid Stationary Quick Mount 将 Zivid calibration board 安装到工作台上)。
标定期间,请确保相机牢固固定(例如,使用 Zivid On-Arm Mount )。
环境条件
标定过程中保持相机温度稳定:
确保启用了 Thermal Stabilization(热稳定功能) ,以最大限度地减少与温度相关的性能变化。
启动前执行 预热 程序。
保持标定条件与预期运行条件相似。
准确度和重新标定
拣货准确率取决于:
相机标定
手眼标定
机器视觉软件
机器人定位
机器人通常情况下虽然重复精度高,但由于温度、关节摩擦、有效载荷、制造公差等因素的影响,其本身并不精确。
建议:
选择正确的方法
在手眼标定过程中,避免使用计算或需要 相机内参 的方法:
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。 |