手眼标定的注意事项和建议
常见错误
图像质量
确保标定对象在所有图像中曝光良好且清晰对焦。
保持物体在 景深范围内 :
使用更大的 \(f\)-值 (更小的光圈)。
通过增大曝光时间来弥补。
所有图像均使用相同的光圈设置,以避免因光圈大小不同而导致的波动。
通过激发标定对象和机器人的所有六个自由度,从不同角度捕获标定对象的图像。
请遵循 如何获取 Zivid 标定对象的高质量数据 的指南。
Zivid API
Zivid 点云以毫米 (mm) 为单位。
因此,请确保用于手眼标定的机器人输入位姿中,平移量也使用毫米(mm)作为单位。
因此,手眼标定输出的平移量将以毫米(mm)为单位。
检测
如果使用 Zivid calibration board ,请确保 ArUco 标记在所有位姿中都可见;否则,棋盘格检测将失败。
如果使用一个或多个 ArUco 标记作为标定对象,则并非所有标记都需要在每个位姿中都可见。
检测(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()}")
手眼配置
标定对象安装在机器人末端执行器上,并随机器人一起移动。
安装方式可以是直接固定在法兰上,也可以用夹具固定。
确切的安装位置并不重要(无需知道它相对于末端执行器的位姿)。
建议:
确保标定对象在机器人运动过程中相对于法兰或夹爪不发生移动。
使用刚性材料制作支架和标定对象(例如,使用 Zivid On-Arm Mount 将 Zivid calibration board 安装到机器人上)。
通过控制加速度,确保机器人运动平稳,避免抖动或移位。
确保在图像采集过程中标定对象保持静止(例如,在机器人运动后等待几秒钟,让振动稳定下来后再进行拍摄)。
标定对象静止在机器人的工作空间内。
物体的确切位置并不重要(不需要知道它相对于机器人底座的位姿)。
(安装在末端执行器上的)相机必须能够从多个角度看到标定对象。
建议:
确保标定对象牢固固定,并在标定过程中保持静止(例如,使用 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。 |