11 个回答
这是一个很有趣的问题,而且没有表面上看起来那么容易。
先说结论:
这个问题目前不存在解析解,可以通过数值求解的方式计算;或者如果采样的姿态较为接近,可以采用四元数求平均的方式近似计算。
我们先来看「平均」的定义:给定 n 个元素 \left\{ x_1, x_2, ..., x_n \right\} ,该空间内存在一点 \bar{x} ,使得该点到 n 个元素的距离之和最短。
计算旋转的平均值,也就是找到下式的最优解:
\bar{R}= \begin{equation} \mathop{\arg\min}_{R \in SO(3)} \ \ \sum_{i=1}^{n}{d(R, R_i)^2} \end{equation}
其中,两个 SO(3) 元素之间的距离定义如下:
d(R_i, R_j)=\frac{1}{\sqrt{2}}\|Log(R_i^TR_j)\|
所以,可以用数值求解的方式计算得到给定 n 个旋转的平均旋转。
但是,我们自然会想, 是否有解析解 ?
目前为止,另外三位答主的想法分别如下:
(1)直接用欧拉角表示旋转,然后直接用欧拉角的三个参数相加后平均;
(2)用四元数表示旋转,然后直接用四元数的四个参数相加后平均(也即 Averaging Quaternions 中的方法);
(3)将所有旋转映射(Log)到其切空间(切空间是向量空间),在切空间做平均后,重新 Exp 到 SO(3) 空间。
于是,我把这几种思路都实现了,并且随机生成三组数据,将其与数值求解结果进行对比。
第一组数据是在 SO(3) 空间中均匀采样,其分布如下图所示:
分别采用四种方法计算的平均旋转如下:
为了更好地对比,我将四种结果展示在视频中:
第二组数据是在单位阵 SO3.Identity() 周围小范围内随机采样,其分布如下图所示:
分别采用四种方法计算的平均旋转如下:
为了更好地对比,我将四种结果展示在视频中:
第三组数据将第二组数据左乘一个随机旋转矩阵,其分布如下图所示:
分别采用四种方法计算的平均旋转如下:
为了更好地对比,我将四种结果展示在视频中:
从上面几个案例可以看出,前面所述三种计算方法都无法准确计算出平均旋转。但是, 如果给定的几个旋转相互之间距离较近时,第二种计算方法(四元数求平均)可以近似获得比较准确的结果 。