从相机校准到使用机械臂拾取彩色立方体

时间:2019-05-03 08:07:57

标签: python opencv camera-calibration robotics coordinate-transformation

我想用我用相机和OpenCV在Python中检测到的机械手拾取彩色立方体。我设法检测到不同颜色的立方体,并通过棋盘格过程对相机进行了校准。

设置:

Setup front Setup top

多维数据集检测Cubes detected

问题是我不了解用相机从对象中获取坐标并将其转换为机械臂进行拾取的其余过程。

以下步骤已完成:

  1. 使用HSV和图形边界框分隔颜色边界。所以我有对象的像素x,y。

  2. 校准摄像机会导致以下摄像机矩阵和失真系数:

    相机矩阵:[[1.42715609e + 03 0.00000000e + 00 9.13700651e + 02] [0.00000000e + 00 1.43275509e + 03 5.58917609e + 02] [0.00000000e + 00 0.00000000e + 00 1.00000000e + 00]] p

    失真:[[0.03924722 -0.30622971 0.00124042 -0.00303094 0.49458539]]

  3. 试图弄清OpenCV文档中的下一步

结果

我已阅读以下页面上的API文档:https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

但是,以我的技能水平,我似乎无法提取实现目标所需的实际步骤。

我的问题:

  1. 如何使用摄像头矩阵和失真系数获取图像帧中对象的坐标?
  2. 如何将图像框架上的坐标转换为机器人末端执行器坐标?
  3. 如果我将相机保持在固定位置。这是否意味着我只需要进行校准?

******* 编辑: *******

我采用了另一种方法。我设法通过SVD解决了两个坐标系之间的旋转和平移问题。但是我认为我可以使用像素坐标将摄像机坐标系转换为机器人坐标系时犯了一个错误。我认为您需要先转换u,v值。

如何将像素uv转换为世界坐标,以便可以使用下面的代码转换和旋转到机械臂?

这是我的代码:

#######################################################################
# Step 1: Input camera and world coordinates, and calculate centroids #
#######################################################################
print("")

# Camera and robot to world coordinates
Pc = np.matrix([[604,119,0],[473,351,0], [730,329,0]])
print("Camera points matrix: ")
print(Pc)
print("")

Pr = np.matrix([[177,-38,0],[264,-93,0], [258,4.7,0]])
print("Robot points matrix: ")
print(Pr)
print("")

# Calculate centroids
Cc = Pc.mean(axis=0)
Cr = Pr.mean(axis=0)

print("Centroid camera: ")
print(Cc)
print("")
print("Centroid robot: ")
print(Cr)
print("")

# Pc and Pr - centroids of Pc and Pr
Pc_minus_Cc = np.subtract(Pc, Cc)
print("Pc - centroidC: ")
print(Pc_minus_Cc)
print("")

Pr_minus_Cr = np.subtract(Pr, Cr)
print("Pr - centroidR: ")
print(Pr_minus_Cr)
print("")

############################################################################
# Step 2: Calculate H, perform SVD and get rotation and translation matrix #
############################################################################

# Get H
print("(Pr - centroidR) transposed: ")
print(Pr_minus_Cr.T)
print("")
H = np.matmul(Pc_minus_Cc, Pr_minus_Cr.T)
print("H: ")
print(H)
print("")

# Perform SVD
u, s, v = np.linalg.svd(H)
print("SVD result: ")
print("u: ")
print("")
print(u)
print("")
print("s: ")
print(s)
print("")
print("v: ")
print(v)
print("")

# Calculate rotation matrix
R = np.matmul(v,u.T)
print("Rotation matrix: ")
print(R)

# Calculate t
t = -R * Cc.T + Cr.T
print("t: ")
print(t)

1 个答案:

答案 0 :(得分:0)

到1),您已经编写了在检测到的对象周围绘制框的代码。因此,您已经在矩阵中进行了坐标调整。如果没有,您可以做类似的事情。

        for c in contours:
        if cv2.contourArea(c) < self.min_area:
            continue
        # detected
        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

然后x + w / 2是矩阵中的x

到2),您不能直接需要某个定向点,以便手臂 会知道(x + y距离)在您的手臂世界中从哪里开始矩阵

到3)校准始终取决于您的光照条件,对吗?因此只要他们不改变您的校准即可。但是事实证明,有时需要校准,例如使用USB摄像机