步骤 1:生成检测
图 1:具有深度着色的气球点云
要开始构建我们的系统,我们将重点关注检测方面。第一个目标是在 2D 图像中找到气球。我们并不是要为这项任务构建一个完整的检测算法,而是采用一种相当基本的方法来检查场景中的颜色值。场景中的每个像素都有一个指定的 R、G、B 值。其中每个值的值都在 0-255 之间,比较这些值可以指示像素的颜色。这是一种相当粗糙的方法,但对于我们的快速设置来说是可以接受的。颜色值应按预期分布:
- 红色:R > 200,G < 50,B < 50
- 绿色:R < 80,G > 200,B > 60
- 蓝色:R < 10,G < 80,B < 100
- 黄色:R > 200,G > 200,B < 50
图 2:气球的四种颜色的 2D 彩色图像。
对于我们的设置,背景要么是黑色的,要么是灰色的,这被上述条件语句所拒绝。选择一个语句,然后布尔逻辑允许我们创建一个与原始图像大小相同的二进制掩码。1 值将指示条件语句为 true 的区域,以及颜色为 false 的 0,这将显示在下面查找蓝色气球。
图 3:在捕获中找到蓝色值的区域的位图。
使用OpenCV,我们可以在位掩码上进行一些边缘检测,找到最大黄色部分的轮廓并填充它,显示我们发现气球表面的位置。该区域是我们寻找目标点位置的地方。下一步将是找到正确的方法方向。
图 4:检测到的气球表面带有青色的 2D 图像。
利用Zivid提供的数据,我们可以找到有关点云中每个点的大量信息,而无需我们自己做任何额外的工作。现在,我们已经有了要触摸的点的 XYZ 位置,我们可以找到该点的进近方向。为此,我们可以使用Zivid SDK提供的表面法向量,并将其用作目标方向的Z轴,以创建一个可以驱动机器人的接近目标。此步骤要记住的一个关键部分是机器人将要接近的目标的X和Y方向。
图 5:模拟捕获显示围绕 Z 轴的两个不同姿势方向。
对于我们的案例,最佳实践是将X和Y方向对齐,使其与机器人在当前位置和方向上相似。这使我们能够将相机保持在手腕关节的上侧,并降低引起电缆拉伤或与机器人发生任何碰撞的风险。由于相机与地板平行,因此可以参考相机坐标系来帮助定义触摸姿势的 X 和 Y 矢量。
在拾取点的一侧选择一个点,以帮助定义用于定义姿势的帮助向量。然后,我们可以规范化此向量,并使用它来定义 y 向量,方法是使用帮助向量和 Z 向量的交叉积。现在我们有一个彼此垂直的 Y 和 Z 向量,我们可以使用它们来通过交叉积找到我们姿势的最终 X 向量。有了这三个向量,我们可以定义 4x4 齐次变换的旋转矩阵。
图 6:在 3D 渲染上可视化目标姿势的屏幕截图
第 2 步:手眼校准
一个永远不会过时的主题是执行手眼校准。为了从您的系统中获得最佳精度,通过使用手眼校准找到从相机帧到末端执行器帧的转换是绝对必要的。安装时的任何小角度或变化都可能导致CAD图纸的输出截然不同。Zivid具有API支持以及CLI工具,可用于执行手眼对手和手对手设置的手眼。本练习中使用的校准目标是 ZVD-CB01 校准目标。该目标用于手眼和内场校正。为了在设置中获得最佳性能,建议在执行手眼校准之前执行内场校正。
重要!每次摄像机被撞击、撞击或从执行手眼的位置移开时,必须再次进行手眼操作。千分尺的运动或安装连接中几分之一度的变化可以极大地改变手眼转换。因此,必须遵守数据表中提供的Zivid安装硬件的建议密封性指南。
第 3 步:使用手眼校准
从手眼校准返回的变换采用 4x4 均质变换矩阵的形式。这是我们将用于此项目数学中所有转换的格式。 手眼变换可以与拾取点4x4矩阵相乘,将点位置转换为末端执行器框架,然后可以通过将其与机器人的姿势相乘来转换为机器人基础框架,也可以作为4x4变换。这会将TCP(工具中心点)需要移动到的点放入基础框架中,然后机器人可以驱动到该点。有了这个,你就有了一个气球触摸机器人!
借助 Zivid 摄像机,任务得到简化,可以查找和定位环境中对您重要的内容。我们的主要目标之一是,尽可能地对用户和开发人员友好。如果您对如何与 Zivid SDK 交互有任何其他疑问,请查看我们在 Github 上的所有示例(https://github.com/zivid)以及知识库中的资源。
生成的点云由 230 万个点组成。由于像素和点之间存在 1:1 的相关性,因此可以获得每个像素的 XYZ(mm)、RGB(8 位)和 SNR,其中 SNR 是信噪比。在 GPU 内部,3D 坐标、颜色值和 SNR 值存储为单独的 2D 数组,对于 Zivid One+,大小为 1920 x 1200,对于 Zivid 二,大小为 1944 x 1200。在用户端(CPU 内存),数据可以以不同的格式存储,具体取决于请求的方式。有关详细说明,请参阅点云教程。
颜色和深度图像可以直接从 Zivid 点云中提取。我们的GitHub 存储库中显示了如何执行此操作的示例。
暂无评论