Math 找到优化的旋转

Math 找到优化的旋转,math,rotation,quaternions,Math,Rotation,Quaternions,我有一个应用程序,其中我必须找到从一组15个订购者和索引3D点(X1,X2,…,X15)到另一组15个具有相同索引的点(1个初始点对应1个最终点)的旋转 我读过很多关于用欧拉角(对某些人来说是邪恶的)、四元数或在基轴上投影向量来求旋转的东西。但我还有一个额外的限制:我的最终集合中的一些点可能是错误的(即坐标错误),因此我想区分要求旋转距离中间旋转很远的点 我的问题是:对于每一组3个点(未对齐的点)及其图像,我可以计算四元数(根据变换矩阵不是纯旋转的事实,我有一些额外的计算,但可以完成)。所以我得

我有一个应用程序,其中我必须找到从一组15个订购者和索引3D点(X1,X2,…,X15)到另一组15个具有相同索引的点(1个初始点对应1个最终点)的旋转

我读过很多关于用欧拉角(对某些人来说是邪恶的)、四元数或在基轴上投影向量来求旋转的东西。但我还有一个额外的限制:我的最终集合中的一些点可能是错误的(即坐标错误),因此我想区分要求旋转距离中间旋转很远的点

我的问题是:对于每一组3个点(未对齐的点)及其图像,我可以计算四元数(根据变换矩阵不是纯旋转的事实,我有一些额外的计算,但可以完成)。所以我得到了一组四元数(最多455个),我想删除错误的四元数

有没有办法找出哪些点的旋转距离平均旋转距离很远?“平均值”和“标准偏差”对四元数意味着什么,还是我必须计算欧拉角?一旦我得到了一组“好的”四元数,我如何计算“平均”四元数/旋转

干杯


Ricola3D

这里有两个问题:

  • 如何计算任意数量点的“最佳拟合”
  • 如何决定接受哪些点,拒绝哪些点

对第一个问题的一般回答是“试一试”。四元数可能比欧拉角更好;请尝试以下操作:

foreach point pair (a -> b), ideal rotation by unit quaternion q is:
   b = q a q*   ->   q a - b q = 0
因此,寻找
q
的最小二乘拟合:

minimize sum[over i] of |q a_i - b_i q|^2
under the constraint:  |q|^2 = 1
如上所述,除了约束之外,最小二乘问题是线性的,这应该比欧拉角公式更容易求解


对于第二个问题,我可以看到两种方法:

  • 如果您的点距离不太远,您可以尝试使用所有点运行最小二乘解算器,然后返回,抛出“异常值”(平方误差最大的点对),然后重试
  • 如果完全不一致的点偏离了上述步骤,您可以尝试随机选择3或4对的小子集,并为每个子集找到最小二乘拟合。如果这些结果中的一大组具有类似的旋转,且总误差较低,则可以使用该结果来识别“好”对(从而消除坏对);然后返回并找到适合所有好配对的最小二乘法

    • 在计算机视觉中,有一种技术叫做做你所提议的事情。与查找所有可能的四元数不同,您可以使用一组最小的点对应关系来查找单个四元数/变换矩阵。然后,您将评估所有适合质量的点,丢弃那些不适合的点。如果你没有足够好的比赛,也许你在原来的比赛中有一场不好的比赛。所以你要放弃尝试,再试一次。如果你得到了足够好的匹配,你将对所有内点进行最小二乘回归拟合,得到一个新的变换矩阵,然后迭代,直到你对结果满意为止


      或者,您可以获取所有标准化四元数,并找到它们之间的点积。点积应始终为正;如果不是针对任何给定的计算,则应该对两个四元数之一的所有分量求反,然后重新计算。然后在四元数之间有一个距离度量,可以聚类或查找间距。

      L1范数最小化-将绝对偏差之和最小化,而不是平方偏差最小化-比最小二乘法更能抵抗异常值。一般来说,这需要一个更复杂的优化方法,如线性规划,但它在这里可能很有用。谢谢。对于最小二乘拟合,我想做一些类似的事情,但不确定“和”和“减”对四元数有什么意义,因为它对旋转没有意义。对于第二个问题,我的观点不可能太远,但一个小错误可能会对我的算法的后续步骤造成悲惨的后果。但我知道我的目标必须是“民主”的。因此,我可以根据你的第一个建议分两步来做,或者我可以通过比较它们的相对位置和更复杂的程度来区分我的点吗?是的,四元数和是定义良好的(尽管,正如你所说,它对旋转没有意义);平方范数也是如此。对于第二个问题:如果你的“坏”点对距离正确的旋转不太远,你应该测试第一个建议,看看它是否工作正常。它需要两个最小二乘步骤:一个是包含所有点的初始步骤,另一个是剔除坏点后的最终步骤。最小二乘解算器的渐近复杂性非常合理:对于要优化的N个点和C值,它是O((N+C)C^2)。因为你要解一个四元数,C有一个很小的常量值4,所以你的复杂度在点数上是线性的。+1--我试图记住这项技术叫什么,但我不能把它放在哪里…谢谢你,我将试着看看在我的数据集上什么效果最好(即最快)。