转换
小技巧
我们的网络研讨会 Getting your point cloud ready for your application (为您的应用准备好点云)部分涵盖了转换的相关内容。
介绍
本文介绍了点云转换的背景,如何转换Zivid点云以及为什么这是一个有价值的功能。最后,文章还提供了一个带有代码示例的教程。
Zivid点云是基于 Zivid 相机坐标系 给出的。由于各种原因,不同的应用需要将整个点云或其片段(例如ROI或拾取点)从相机坐标系转换到另一个坐标系。
问题 |
点云是基于相机坐标系的,但应用需要在另一个坐标系中使用点云数据。 |
解决方案 |
将Zivid点云转换到另一个坐标系。 |
API 中的转换
刚性变换由一个 4×4 齐次变换矩阵定义,该矩阵描述一个坐标系相对于另一个坐标系的位姿。一旦知道变换矩阵,我们就可以使用 Zivid SDK 将点云从相机坐标系转换到所需的坐标系。
小技巧
Zivid SDK允许所有 仿射变换(在欧几里得几何中,仿射变换是保留点、直线和平面的几何变换),包括非刚性变换。这里有一个非刚性变换的例子 通过将点云从mm转换为m来缩放点云。
举个例子,假设您已经检测到 Zivid 标定板并估计了它的位姿。
std::cout << "Detecting and estimating pose of the Zivid checkerboard in the camera frame" << std::endl;
const auto detectionResult = Zivid::Calibration::detectCalibrationBoard(frame);
const auto cameraToCheckerboardTransform = detectionResult.pose().toMatrix();
std::cout << "Camera pose in checkerboard frame:" << std::endl;
const auto checkerboardToCameraTransform = cameraToCheckerboardTransform.inverse();
Console.WriteLine("Detecting and estimating pose of the Zivid checkerboard in the camera frame");
var detectionResult = Detector.DetectCalibrationBoard(frame);
var cameraToCheckerboardTransform = new Zivid.NET.Matrix4x4(detectionResult.Pose().ToMatrix());
Console.WriteLine("Camera pose in checkerboard frame:");
var checkerboardToCameraTransform = cameraToCheckerboardTransform.Inverse();
print("Detecting and estimating pose of the Zivid checkerboard in the camera frame")
detection_result = zivid.calibration.detect_calibration_board(frame)
if not detection_result.valid():
raise RuntimeError(f"No Checkerboard detected. {detection_result.status_description()}")
camera_to_checkerboard_transform = detection_result.pose().to_matrix()
print("Camera pose in checkerboard frame:")
checkerboard_to_camera_transform = np.linalg.inv(camera_to_checkerboard_transform)
然后可以使用该变换矩阵将点云变换到棋盘格坐标系。
std::cout << "Transforming point cloud from camera frame to checkerboard frame" << std::endl;
pointCloud.transform(checkerboardToCameraTransform);
您可以将转换矩阵保存到文件,也可以从文件中加载它。
const auto transformFile = "CheckerboardToCameraTransform.yaml";
std::cout << "Saving camera pose in checkerboard frame to file: " << transformFile << std::endl;
checkerboardToCameraTransform.save(transformFile);
点云在原地转换,这意味着您可以将转换后的点云从 frame 中保存到文件中。
const auto checkerboardTransformedFile = "CalibrationBoardInCheckerboardOrigin.zdf";
std::cout << "Saving transformed point cloud to file: " << checkerboardTransformedFile << std::endl;
frame.save(checkerboardTransformedFile);
类似地,您也可以加载转换后的点云。要恢复原始点云,您可以读出应用的变换矩阵并将其重新转换回来。
std::cout << "Reading applied transformation matrix to the point cloud:" << std::endl;
const auto transformationMatrix = pointCloud.transformationMatrix();
std::cout << transformationMatrix << std::endl;
备注
Zivid SDK中转换API的处理速度非常快,因为它是在GPU中并行完成的,而点云数据此时仍在GPU内存内。使用第三方库计算法线可能更耗时:因为CPU计算通常要慢得多,而GPU计算则需要多出一次数据复制过程。查看 点云捕获过程 了解更多信息。
小技巧
为了获得更好的性能,您可以将转换 API 与降采样 API 和法线 API 结合使用。这可确保所有计算均由 GPU 执行,同时点云数据仍保留在 GPU 内存中。
为了最快地完成数据处理,可以先对点云进行降采样,然后对其进行转换。
在转换点云后计算法线,使得法线与点云在同一坐标系中。
如需了解更多有关位姿和转换的信息,请查看 位置、方向和坐标变换.
在 Zivid Studio 中进行转换
您还可以在 Zivid Studio 中对点云应用转换。捕获完成后,导航到当前视图顶部的 Transform 下拉菜单。此外,您还可以从文件加载转换矩阵,将其设置为所选 ROI Box 的坐标系,并将转换矩阵保存到文件中。

Zivid Studio 中的 Transform(转换) 下拉菜单
这使得您可以在 Zivid Studio 中可视化转换后的点云,这在评估点云质量时非常有用。它还允许您将点云转换到选定的坐标系,并将转换后的点云保存或导出到文件。
Point clouds are by default given in the camera coordinate system as in (a), but you can transform the point cloud to a more suitable coordinate system as in (b).
应用中的转换
本节将介绍使用点云转换功能的Zivid相机和机器人的应用。这里说明了这些应用中的典型坐标系以及为什么要将点云转换到这些坐标系里。
抓取
为了让机器人能够拾取在点云中检测到的物体,点云的坐标必须从相机坐标系转换到机器人可以理解的坐标系。
机器人坐标系
我们通常希望将对象坐标或整个点云转换到机器人基础坐标系。您可以从这篇文章了解详细说明 如何使用手眼标定的结果.

平面坐标系
相机通常与抓取面不平行。转换点云使点云z轴与平面z轴匹配有助于我们更好地理解和解析点云数据。因此,通常会将点云转换到抓取面所在的坐标系,例如料箱底层或传送带。

料箱坐标系
还有一个步骤可以帮助我们更好地理解点云数据并评估抓取表现。即将点云的x轴和y轴与料箱的x轴和y轴对齐。

感兴趣区域
相机视野通常大于我们的感兴趣区域 (ROI),例如料箱。因此,将料箱轴与点云轴对齐的另一个原因是它可以让我们在料箱周围设置一个ROI盒。然后,我们可以根据ROI裁剪点云,以仅获取料箱范围内的点。
小技巧
点云越小,捕获速度越快,从而可以加快检测速度并缩短总拾取周期时间。

如需了解实施示例,请查看 通过棋盘格定义的ROI盒 。该教程展示了如何使用 Zivid calibration board 根据相对于棋盘格给定的ROI盒来过滤点云。
我们还有一个 通过ArUco标记定义的ROI盒 教程,它使用了ArUco标记来代替棋盘格。
拼接
点云拼接通常涉及将点云转换到不同的坐标系。
多个固定安装的相机
Zivid 多相机标定 能够将来自多个相机的点云转换到其中一台相机(主相机)的坐标系中。在多相机标定中,我们通常希望将拼接后的点云转换到一个不同的坐标系中,比如对象坐标系。

单个手臂安装的相机
通过相机安装在手臂上的配置,您可以使用同一相机从多个角度拍摄多个点云用于拼接。一旦点云在主相机坐标系中完成拼接后,就可以方便地将其转换到对象坐标系。

单相机和转盘
如果我们知道转盘相对于相机的位姿,我们可以拼接点云并将它们转换到转盘坐标系。

位姿估计
获取相机相对于机器人基坐标系的位姿是通过 手眼标定 实现的。如果我们需要相对于任意用户定义的坐标系的位姿,我们可以在场景中放置标定对象,例如基准标记和棋盘格。由于我们知道它们的几何形状,因此估计它们的位姿相对简单。
关于实现该功能的示例,请查看 基于棋盘格的坐标转换。该教程说明了如何估计棋盘格的位姿并使用4x4齐次变换矩阵将点云转换到棋盘格坐标系。我们还有 基于ArUco标记的坐标转换 教程,该教程使用了ArUco标记代替棋盘格。
版本历史
SDK |
变更 |
---|---|
2.15.0 |
Zivid Studio 中添加了转换功能,并提供了用于获取当前应用的转换矩阵的 API。 |
2.0.0 |
添加了转换API。 |