Xinyu-Yi / TransPose

A real-time motion capture system that estimates poses and global translations using only 6 inertial measurement units
https://xinyu-yi.github.io/TransPose/
GNU General Public License v3.0
373 stars 72 forks source link

关于论文公式和代码对应问题 #66

Closed jiakechong1991 closed 2 days ago

jiakechong1991 commented 4 days ago

paper上说: image 这里左乘“旋转矩阵的逆”,相当于变换参考系,我也认为应该这样做很合理,为什么代码里面却不是呢?

def normalize_and_concat(glb_acc, glb_ori):
    glb_acc = glb_acc.view(-1, 6, 3)  
    glb_ori = glb_ori.view(-1, 6, 3, 3) 
    # glb_ori[:, -1] : root-joint的旋转矩阵 size:[f, 3, 3]
    #???为什么不是左乘“旋转矩阵的逆”呢?而是右乘一个旋转矩阵?旋转矩阵左乘右乘是不一样的呀
    acc = torch.cat((glb_acc[:, :5] - glb_acc[:, 5:], glb_acc[:, 5:]), dim=1).bmm(glb_ori[:, -1]) / acc_scale
    ori = torch.cat(
        #??? 应该是左乘 旋转矩阵的逆就行,为什么没有用“旋转矩阵的逆”,而且还加上转置呢?
        (glb_ori[:, 5:].transpose(2, 3).matmul(glb_ori[:, :5]), glb_ori[:, 5:])
        , dim=1)
    data = torch.cat((acc.flatten(1), ori.flatten(1)), dim=1)
    return data

还请作者或者各位看懂项目的大佬指教,多谢多谢

Xinyu-Yi commented 3 days ago

您好, 论文里是列向量左乘矩阵的逆,代码里是行向量右乘矩阵,结果是一样的,但论文里的方法要算六次矩阵乘法,代码里只需要算一次。

Xinyu-Yi commented 3 days ago

第二个问题,旋转矩阵的转置和逆是一样的,转置的计算量小一些

jiakechong1991 commented 2 days ago

感谢大佬指导! 记录下给后来人: 旋转矩阵是正交阵,它的行列式为1,且每个列向量都是单位向量且相互正交,它的逆等于它的转置 可以百度搜索 “旋转矩阵 逆 转置” 获取详细推导