转换列表的平均转换矩阵

时间:2014-01-20 18:58:11

标签: algorithm math matrix 3d transformation

我有一个转换矩阵的多个估算值,即通过ICP (Iterative Closest Point)将两个点云相互映射。

如何为所有这些矩阵生成平均变换矩阵?

每个矩阵由刚性平移和仅旋转组成,无刻度或倾斜。

理想情况下,我还想计算一个加权平均值,但是现在没有加权平均值。

对平移向量求平均值当然是微不足道的,但旋转是有问题的。我发现的一种方法是对旋转的各个基本向量求平均值,但我不确定这会导致一个新的正交基数,并且该方法似乎有点特别。

5 个答案:

答案 0 :(得分:11)

在翻译和旋转中拆分转换是一个良好的开端。平均翻译是微不足道的。

平均旋转并不容易。大多数方法将使用四元数。因此,您需要将旋转矩阵转换为四元数。

近似平均值的最简单方法是线性混合,然后重新规范四元数:

q* = w1 * q1 + w2 * q2 + ... + w2 * qn
normalize q*

然而,这只是一个近似值。其原因在于,两个旋转的组合不是通过添加四元数来执行,而是通过将它们相乘来执行。如果我们将四元数转换为对数空间,我们可以使用简单的线性混合(因为乘法将成为加法)。然后将四元数转换回原始空间。这是球面平均值的概念(Buss 2001)。如果幸运的话,你会找到一个支持四元数的log和exp的库:

start with q* as above
do until convergence
    for each input quaternion i (index)
        diff = q[i] * inverse(q*)
        u[i] = log(diff, base q*)
    //Now perform the linear blend
    adapt := zero quaternion
    weights := 0
    for each input quaternion i
        adapt += weight[i] * u[i]
        weights += weight[i]
    adapt *= 1/weights
    adaptInOriginalSpace = q* ^ adapt    (^ is the power operator)
    q* = adaptInOriginalSpace * q*

您可以为adaptInOriginalSpace定义阈值。如果它是一个非常小的旋转,你可以打破循环。事实证明,该算法可以保留球体上的测地距离。

答案 1 :(得分:2)

http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotationhttp://en.wikipedia.org/wiki/Rotation_matrix#Quaternion将为您提供一些优雅的数学和一种将旋转矩阵转换为围绕旋转轴的旋转角度的方法。每个旋转将有两种可能的表示,旋转角度和旋转轴都有不同的符号。

您可以转换所有内容并将它们标准化为+ ve转角,然后计算出平均旋转角度和平均旋转轴,将其重新归一化为单位矢量。

OTOH如果您打算计算出最准确的转换估计值,您需要记下任何候选转换的拟合优度的一些度量 - 平方误差的总和通常在数学上很方便 - 然后求解一个优化问题,以确定哪个变换最小化误差平方和。至少比单独使用容易出错的估计值更容易证明这一点,并且可能更准确。

答案 2 :(得分:1)

如果你有一个现有的lerp方法,那么有一个简单的解决方案:

count = 1
average_transform = Matrix.Identity(4)
for new_transform in list_of_matrices:
    factor = 1/count
    average_transform = lerp(average_transform, new_transform, factor)
    count += 1

这只是有用的,因为更多的mathermatics包具有lerp矩阵的能力而不是平均很多。

因为我在其他地方没有遇到过这种方法,所以这是一个非正式的证据:

  • 如果有一个矩阵,只使用该矩阵(因子对于第一个矩阵将等于1)
  • 如果有两个矩阵,我们需要第二个矩阵的50%(第二个因素是50%,所以我们在现有的第一个和新的一个之间翻了一半)
  • 如果有三个矩阵,我们需要33%,或者前两个平均值的66%和第三个矩阵的33%。因此0.3333的因子使这种情况发生。

等等。

我没有对矩阵进行过广泛的测试,但我已经成功地将其用作其他数据类型的滚动平均值。

答案 3 :(得分:0)

此处可以使用奇异值分解(SVD)。

取旋转矩阵之和的SVD,然后简单地通过Ravg = UV'给出平均旋转矩阵。

答案 4 :(得分:0)

“ sdfgeoff”因为您是我的新手,所以我无法在您的答案中发表评论,但是我认为您是最正确的。顺便说一句,美丽而优雅的解决方案。如果您将球面线性插值(SLERP)与四元数一起使用,而不是线性插值(LERP),那将是完美的,因为映射旋转的四元数(范数为1的四元数)定义了4D球体,然后在两点之间进行插值实际上是在两点之间进行插值在球体表面。

根据我从点云注册的经验,我很想说这行不通。 ICP不会像正确旋转一样返回随机旋转。您需要使用更好的算法来注册点云(全局注册算法,例如FPFH,4PCS,K4PCS,BSC,FGR等)。或对转换进行更好的初步猜测。使用良好的初始转换进行初始化时,ICP只会给您完全错误的旋转(当卡在局部极小值时)或几乎完美的旋转。 结论:取平均值是行不通的。