有时,机器人需要抓些东西。 那个没有眼睛的机器人,仿佛没有双手。 从字面上看。 毕竟,不知道好吃的东西在哪里,机器人将无法用其机械臂到达它。 或其他操纵器。
在本文中,我们将说明如何校准机器人,以便能够在机器人坐标系和3D摄像机SK之间进行切换。
步骤1.拿走机器人我们将让Dobot Magician移动物品。 观看它将如何移动对象-英特尔Realsense D435。 校准对象必须是一个红球。
这就是他们在一起的样子。

选择红球不仅是为了
有人装饰圣诞树 。 红色-可以在图像中轻松找到它(无需学习其他网络)。 球-更准确地计算其在图像中的中心。 但是我们稍后会再谈。
步骤2.机器人将球移至何处校准算法可以描述如下:
- 生成空间位置列表
- 机器人将球移动到整个列表中,并随之拍摄图像。
- 对于每个图像,我们找到球的坐标
- 我们计算摄像机坐标到机器人坐标的转换
应该选择位置以覆盖尽可能多的可用空间。 最好不要取一个小球,这会降低校准的准确性。
我们这里不会提供用于记录校准的代码,因为它太依赖于机器人本身,摄像机以及执行所有操作的环境(例如,我们在ROS中执行)。 重要的是,要进行进一步的校准,您可以至少在手动模式下拍照,发送步骤以将机器人定位并保存照片。
唯一的要求是摄像机和机器人的相对位置始终保持不变。 我们还建议您立即拍摄第二组图像以进行验证-评估校准的计算准确性。
步骤3.获取坐标我们知道机械手的坐标,因为我们专门将机器人发送到了列表中指定的位置。 对于具有较大自由度的机器人,您将必须指定更多参数,但是在我们的4轴机械臂中,该位置由机械臂尖端的坐标唯一地确定。 因此,我们只是保持双手的位置。

对于球图像,尚未计算其坐标。 我们将使用精心挑选的对象进行校准。 我们将查找球的任务重新定义为“找到红色的最大区域”,在python + opencv上听起来像:
def get_center(image):
让我们仔细看看。
转换为HSV空间后,图像如下所示:

如您所见,对于暗像素,色相非常嘈杂,因此需要附加的分割标准。 只留下红色像素
,然后查看饱和度通道。 在此通道上,校准球清晰可见。
然后,最终标准将如下所示:
- 检查阴影是否接近红色
- 仅保留饱和度高于给定阈值的像素
- 对图像进行二值化
之后,我们得到如下内容:

现在,您需要找到球心的坐标。 有多种方法,例如,您可以将球的3D模型自定义为点云。 但是,对于真实感D435,对象边界处的深度值非常嘈杂,因此我们将采用另一种方式。
我们假设这里的球是最大的连接区域。 然后,我们找到其中心,并从通道的深度中找出球表面上此点的深度。 在立体测量的一点帮助下,让我们从球表面上的可见点移动到球的中心。
为了找到球的中心,我们使用了投影应该是一个圆的知识,并且我们想要对中心进行无偏估计(但是机器人的吸盘正试图阻止我们)。 在这里找到一个描述该区域的最小面积的圆就足够了,这已经在opencv
-minEnclosingCircle中确定了 。
接收到点u,v的2个坐标(以像素为单位)和其深度(以毫米为单位)后,我们将其转换为相机SK中的物理坐标:
def get_world_coords(u, v, depth, camera_matrix): f = np.linalg.inv(camera_matrix) l = np.array([u,v,1]) * depth return np.dot(f,l)
camera_matrix-根据
公式 ,摄像机内部参数的矩阵。
步骤4.执行校正目前,我们已经收到了两组在空间中不同位置的点:球体顶部的坐标-球在机器人SC中吸吮机器人的点,以及球可见中心的坐标-球体在相机SC中最靠近相机的点。 为了比较它们,您首先需要将它们带到球的一个物理点。
最简单的方法是将这些点平移到球的中心。 我们测量其半径r = 24mm。 然后,很清楚如何从切线
K点获得球
O中心的坐标-触摸沿
Z轴始终高1个半径。
仍然需要将可见区域的
V中心的坐标转换为球
O的中心的坐标
。 要说明如何执行此操作,请使用下图:

事实证明,球
O的真实中心始终比可见点
V深1个半径
。 这意味着找到的半径矢量必须延长24 mm。
仍然相当多-具有对应于相同物理点的2组3D坐标,找到第一组到第二组的转换。 我们将为此使用opencv cv2.estimateAffine3D函数。 对于理想找到的坐标,仿射变换当然是枚举,为了描述点的变换,旋转和位移足够,扩展将是多余的。 但是,使用仿射变换可以补偿内部相机参数矩阵计算不正确的不准确性。 不仅如此,它还使您无需了解校准就可以进行校准。
transformation = cv2.estimateAffine3D(camera_coords, robot_coords)
输出是一个3x4变换矩阵,前3x3分量是一个旋转矩阵,并结合了沿轴的延伸。 使用正确的相机校准和良好的输入数据,您应该获得接近旋转矩阵的矩阵。 其余3个数字是相机和机器人之间的位移矢量。
步骤5.我们使用校准为了使用获得的校准,必须重复指示的转换。 我们将它们合并为一个算法。
- 我们在RGBD图像上找到我们感兴趣的点u,v的坐标
- 我们使用内部参数矩阵将它们转换为相机SK中的物理坐标x,y,z
- 对于球,我们感兴趣的是球的深度
- 我们应用找到的变换变换,用矩阵T表示
- 我们在SK机器人中得到了球中心的坐标。 为了使机器人不会尝试刺破球,我们向控制点发送了一个半径高1点的点
校准精度我们在9个位置计算了校准值。 在另外6个位置的验证集上,工作区域为16x30x5 cm时,精度为2.5 mm,为此,我们将发现的变换应用于其余图像,并计算误差矢量的平均长度。
步骤6.我们在应用任务中使用完成校准后,您可以开始解决实际问题。 例如,我们将VR头盔与控制器连接起来,能够控制机器人并在虚拟现实中移动立方体。
但是这种校准方法非常普遍。 不管使用哪个摄像机和机器人,所描述的方法都使得计算机器人和摄像机的坐标系之间的关系变得容易。 此外,由于变化很小,该方法是自主的,因此机器人可以自动执行校准,因为随着时间的推移,摄像机将相对于机器人移动。
如果有趣的话 ,
我和
Vasyutka和
ZlodeiBaal以及
我打算继续谈论机器人,VR和机器学习的世界。 校准源可以在我的
geit中找到。