三维旋转的平均值和离散程度测量

8

我看到了几个类似的问题,并且有一些想法,但我不记得有关于spread(扩散)的任何内容。

所以:我正在开发一个测量系统,最终基于计算机视觉技术。

我拍摄N张照片,并使用库处理它们,库输出姿态估计结果,形式为4x4仿射变换矩阵,包括平移和旋转。

这些姿态估计结果中存在一些噪声。每个旋转轴上的欧拉角标准差小于2.5度,因此所有方向都非常接近(对于所有欧拉角接近0或180的情况)。对于小于0.25度的标准误差对我很重要。但是,我已经遇到了欧拉角固有的问题。

我想将所有这些非常接近的姿态估计值平均,以获得单个最终姿态估计值。我还想找到一些扩散度量,以便我可以估计准确性。

我知道“平均”实际上并没有定义旋转。

(记录一下,我的代码是基于Numpy的Python编写的。)

我还可能希望对这个平均值进行加权,因为某些拍摄(以及某些轴)已知比其他拍摄更准确。

我认为我可以只取平移向量的均值和标准差,对于旋转,我可以将其转换为四元数,取平均值,并重新归一化,因为这些四元数非常接近。

我还听说过所有四元数的最小二乘法,但是我研究如何实现它的大部分时间都是失败的。

这可行吗?在这种情况下是否有一个合理定义的扩散度量?


我宁愿在矩阵系数上进行平均,而不是在欧拉角上进行平均。 - user1196549
这是一个关于用C++、Matlab和Python编写代码片段的平均四元数的相关问题,其中包含多个答案。 - ketza
2个回答

3

没有关于您的几何设置的更多信息,很难回答。无论如何,对于旋转,我建议:

  1. create 3 unit vectors

    x=(1,0,0),y=(0,1,0),z=(0,0,1)
    

    and apply the rotation on them and call the output

    x(i),y(i),z(i)
    

    it is just applying the matrix(i) with position at (0,0,0)

  2. do this for all measurements you have

  3. now average all vectors

    X=avg(x(1),x(2),...x(n))
    Y=avg(y(1),y(2),...y(n))
    Z=avg(z(1),z(2),...z(n))
    
  4. correct the vector values

    so make each of the X,Y,Z unit vectors again and take the axis which is more closest to the rotation axis as main axis. It will stay as is and recompute the remaining two axises as cross product of main axis and the other vector to ensure orthogonality. Beware of the multiplication order (wrong order of operands will negate the output)

  5. construct averaged transform matrix

    see transform matrix anatomy as origin you can use averaged origin of the measurement matrices


你需要哪些关于几何设置的信息? - ikrase
1
@ikrase 可以提供你的骨架草图或者你正在测量姿势的东西,以及一些示例输入。顺便说一句,你可以直接从变换矩阵中获取旋转后的 X、Y、Z 轴(或者从其逆矩阵中获取,这取决于你的矩阵流水线和表示方式)。 - Spektre
@ikrase,第四步只是使你计算出的轴向量相互平行。如果你取任意两个不平行的向量a和b,并对它们进行叉积运算,那么你就会得到一个与它们都平行的向量。对于任意两个不平行的向量,在三维空间中只有两个这样的向量(c=a x b和-c=a x b),其中一个是另一个的相反数。因此,当你利用这一点时,你可以很容易地从主轴中纠正出两个轴,以确保它们正交。所以你是正确的,你只需要正确设置乘法顺序,否则你将会有一些镜像的轴。因此,如果你只是交换叉积操作数,就可以了。 - Spektre
1
@ikrase 叉积也会改变输出向量的大小,但如果两个向量都是单位向量,则结果向量的大小也是单位大小。 - Spektre
1
@ikrase 我习惯于使用纯C++,在那里我没有这样的工具可用,而且这是相当直接的方式... 当然,你可以使用任何你知道或能够的其他方法... - Spektre
显示剩余5条评论

1

Moakher写了一篇论文,解释了基本上有两种方法来求旋转矩阵的平均值。第一种是加权平均后使用SVD投影回到SO(3)中。第二种是Riemannian质心。这个更接近于几何平均数,但计算起来更加复杂。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接