如何比较旋转和平移矩阵中两个物体的姿态和位置?

时间:2014-12-05 03:59:45

标签: opengl graphics computer-vision

我有两个4 * 4矩阵表示OpenGL中两个对象的姿势和位置。如何计算这些对象的方向和原点的差异。 这是从OpenGL样式矩阵转换而来的矩阵。

r1 r2 r3 t1
r4 r5 r6 t2
r7 r8 r9 t3
 0  0  0  1

1 个答案:

答案 0 :(得分:5)

假设两个矩阵是M1和M2,它们适用于右边的向量:

x1 = M1 * x
x2 = M2 * x

两个矩阵之间的“差异”可以定义为需要应用于x1以获得x2的矩阵Md:

Md * x1 = x2
Md * (M1 * x) = M2 * x

要为所有向量x创建此标识,Md需要满足等式:

Md * M1 = M2

为了在这个等式中隔离Md,我们乘以M1的倒数:

Md * M1 * inv(M1) = M2 * inv(M1)

矩阵乘法是关联的,因此我们可以将左侧分组为:

Md * (M1 * inv(M1)) = M2 * inv(M1)

,Md的结果是:

Md = M2 * inv(M1)

所以你可以用4x4矩阵求逆和矩阵乘法来解决这个问题。

另一种方法是将原始矩阵分解为旋转和平移,这些矩阵应用于向量:

x1 = R1 * x + t1
x2 = R2 * x + t2

其中R1和R2是3×3矩阵,t1和t2平移向量。按照与之前相同的步骤,还将差异分解为旋转Rd和翻译td:

Rd * x1 + td = x2
Rd * (R1 * x + t1) + td = R2 * x + t2
Rd * R1 * x + Rd * t1 + td = R2 * x + t2

要使两侧的旋转部分相匹配,Rd需要满足:

Rd * R1 = R2

毫不奇怪,Rd的计算看起来非常类似于上面的Md。作为一种简化,我们可以利用旋转的逆是其转置的事实:

Rd = R2 * inv(R1)
Rd = R2 * transp(R1)

现在在上面的等式中,翻译部分也需要匹配,这给了我们td:

Rd * t1 + td = t2
td = t2 - Rd * t1

总之,您可以计算差异的旋转矩阵和平移向量:

Rd = R2 * transp(R1)
td = t2 - Rd * t1