在 Python 中优化涉及旋转向量的误差函数

计算科学 优化 Python
2021-12-03 21:24:18

我正在对一个系统进行原型设计,该系统可以在视频序列中找到对象的 3D 姿势。为此,我最小化了一个误差函数,该函数涉及作为参数的对象的旋转和平移,以及作为数据的两组点(被高斯噪声污染但没有异常值)。

我尝试使用 3 个欧拉角和一个旋转向量来参数化旋转矩阵。然后,我使用合成数据序列测试我的系统,我发现使用 3 欧拉角参数化得到的误差比使用旋转矢量得到的误差要小得多。我期待相反(注意我使用的序列不会导致欧拉角的任何万向节锁定)。这让我想知道我是否正确使用了旋转矢量参数化。

我遵循的步骤是,首先我将旋转矩阵转换为旋转向量(使用 OpenCV 中可用的 Rodrigues 公式),生成的 3 向量是我的误差函数参数的一部分。在误差函数内部,我将旋转向量转换为旋转矩阵并计算残差。我正在使用 python 和 scipy.optimize.leastsq(内部使用MINPACK.lmdif)来最小化这个错误函数。leastsq 将根据误差函数以数值方式计算最小化所需的雅可比。

在阅读了一些关于谎言群 SO(3) 和谎言代数 so(3) 的理论之后,我了解到 so(3)(对我来说是旋转向量)对应于 SO(3) 恒等式处的切平面)。所以我的旋转向量是对应旋转矩阵的局部近似。

我认为我的最小化可能缺少的是在每个最小化步骤之后将旋转向量转换回旋转矩阵,然后返回到旋转向量(对旋转矩阵进行新的局部近似)以进行下一步步。我无法测试这种可能性,因为我使用的是标准最小化器,它不允许这样做。

现在我认为在每个最小化步骤计算的雅可比应该足以将旋转矢量参数引导到正确的方向,而无需我在上一段中提到的转换。但是,我不完全确定,并且随着旋转矢量参数化 wrt 的性能变差。欧拉角参数化,我认为我做错了什么。

有人会澄清/确认在最小化问题中使用旋转矢量的正确方法吗?

0个回答
没有发现任何回复~