如何在两个不同的coorinate系统中找到相应点之间的旋转和平移(变换矩阵)

时间:2017-11-03 13:25:54

标签: c++ opencv math coordinate-transformation

我正在进行相机 - 激光雷达校准,我在以下问题上停留了一段时间:

我正在使用USB摄像头和2D激光雷达。我有激光雷达框架和相机框架中相应点的坐标(假设我在激光雷达框架中有3个点和它们的坐标以及相机框架中相同3个点的坐标)。
一点的例子:
lidar_pt1(xl,yl)
camera_pt1(xc,yc,zc)
...
众所周知。

如果我对转换矩阵进行硬编码,我会得到预期的结果。现在我试图不对其进行硬编码,而是使用已知的坐标值自动计算它。我所拥有的是激光雷达框架中的2D坐标中的3个点以及相机框架中的3D坐标中的精确3个点。在这里,我正在努力学习数学,以某种方式根据我的坐标值计算旋转。有没有办法获得轮换?

camera_pt1 = TransformMat * lidarpt1
TransformMat =?

我看到了一些使用SVD(http://nghiaho.com/?page_id=671)的例子,但我认为它们需要更大的数据集,而最少3点不会得到最好的结果。

1 个答案:

答案 0 :(得分:1)

如果你只从每个系统中取3对坐标,那么数学就很简单了。这是一个简单的例子:

    |
  4 |                      (R)
    |                       : ',
    |                       :   ',
    |                       :     ',
  3 |                       :      (P)
    |                       :     ,'
    |                       :   ,'
    |                       : ,'
  2 |      (A).....(B)     (Q)
    |       :     ,'
    |       :   ,'
    |       : ,'
  1 |      (C)
    |
    |
    |
  0 +-------------------------------------
    0       1       2       3       4

假设您有一个三角形ABC,它会映射到另一个三角形PQR。您可以在homogeneous coordinates中表示其顶点,如下所示:

      .-       -.          .-       -.
      | 1  2  1 |          | 4  3  1 |
ABC = | 2  2  1 |    PQR = | 3  2  1 |
      | 1  1  1 |          | 3  4  1 |
      '-       -'          '-       -'

您需要找到将M映射到ABC的矩阵PQR(即ABC × M = PQR)。要执行此操作,只需将PQR乘以ABC的倒数:

if    ABC × M  =  PQR,
then  ABC⁻¹ × ABC × M  =  ABC⁻¹ × PQR
so    M  =  ABC⁻¹ × PQR

有很多关于如何反转3×3矩阵的参考资料。这应该会给你以下结果:

    .-          -.
    | -1  -1   0 |
M = |  1  -1   0 |
    |  3   6   1 |
    '-          -'