【问题标题】:how to calculate relative pose given two 4x4 affine matrix如何计算给定两个 4x4 仿射矩阵的相对姿势
【发布时间】:2021-05-31 12:39:20
【问题描述】:

我有两个 4x4 仿射矩阵,A 和 B。它们代表两个物体在世界坐标系中的姿态。

如何通过矩阵乘法计算它们的相对姿势? (其实我想知道物体B在坐标系中的位置(x_A,y_A))

我尝试过相对姿势 = A * B^-1

relative_pose = torch.multiply(A, torch.inverse(B)).

但是,相对翻译太大了。 (A 和 B 距离很近,但在世界坐标中距离原点很远。)


pytorch 的测试数据:

import torch
A = torch.tensor([[-9.3793e-01, -3.4481e-01, -3.7340e-02, -4.6983e+03],
    [ 3.4241e-01, -9.3773e-01,  5.8526e-02,  1.0980e+04],
    [-5.5195e-02,  4.2108e-02,  9.9759e-01, -2.3445e+01],
    [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  1.0000e+00]])
B =  torch.tensor([[-9.7592e-01, -2.1022e-01, -5.8136e-02, -4.6956e+03],
         [ 2.0836e-01, -9.7737e-01,  3.6429e-02,  1.0979e+04],
         [-6.4478e-02,  2.3438e-02,  9.9764e-01, -2.3251e+01],
         [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  1.0000e+00]])

【问题讨论】:

    标签: pytorch affinetransform kinematics


    【解决方案1】:

    所以我假设您在齐次坐标中使用实体变换矩阵 M,换句话说,4x4 矩阵包含一个 3x3 旋转矩阵 R、一个 3x1 平移向量 T 和一个 [0,0,0,1] 齐次“填充”行向量。并且您想找到从一个姿势到另一个姿势的转换(我不知道如何逐块编写矩阵,但这类似于(R | T \\ 0 | 1)

    那我认为你的公式是错误的:如果Y_1 = M_1 XY_2 = M_2 X,那么你有Y_2 = M_2 M_1^-1 X,你的相对位姿矩阵是M_rel = M_2 M_1^-1

    所以你需要反转你的实体变换矩阵M_1 = (R_1 | T_1 \\ 0 | 1) 如果你写方程,如果我们注意到P = R_1^-1,那么你会发现M_1^-1 = (P | -PT \\ 0 | 1)

    【讨论】:

    • 感谢您指出我的错误。实体变换矩阵 M_1 是否以 M_1^-1 = (P | -PT \\ 0 | 1) 的方式反转?我可以通过M_1^-1 计算吗?
    • 是的,既然你提到了它,你可以简单地将M_1 的逆计算为 4x4 矩阵,无需进行块分解。我觉得自己很蠢……
    【解决方案2】:

    @trialNerror 的数学解法是完全正确的。 Here is a well structed answer about calculating inverse of affine matrix

    我在 pytorch 中犯了一个错误。这 torch.multiply 提供逐元素乘法。对于乘法矩阵,人应该使用torch.mm()

    在我将批处理作为额外维度的情况下,代码应该是这样的

    relative_pose = torch.inverse(A).bmm(B)

    【讨论】:

    • 很高兴成功了!你能接受关闭线程的答案吗? :)
    猜你喜欢
    • 2018-09-25
    • 2011-02-07
    • 2015-04-03
    • 2013-02-15
    • 2020-07-09
    • 2017-01-02
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多