在PnL方法求相机位姿,Point—to—Line方法的点云匹配问题中,会将其中某一个参数的求解建模成求一个多项式的根。如下式所示:
(1)
那么求解这样的一个多项式的根应该怎么做呢?参考文献1告诉我们可以利用矩阵特征值方法来求解,下面就简单的记录一下这个方法。
(2)
而矩阵特征值的定义为:
(3)
要将矩阵A的特征值和多项式P(x) 的根联系起来,我们可以假设此时多项式P(x)的根就是矩阵 A阵的特征值,因此有:
(4)
也就是说应该要有一个合理的矩阵A和特征向量y 能将(2)式等价为(4)式。
此时如果令:,就很容易得到矩阵A了。
(5)
那么接下来就用简单的代码验证下。
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Geometry>
#include <Eigen/Dense>
#include<unsupported/Eigen/Polynomials>
using namespace std;
int main()
{
//setting coefficient of polynomial
// 9x^4+ 34x^3 + x^2 -100x +201 =0
Eigen::VectorXf coeffs(5);
coeffs(4) = 9;
coeffs(3) = 34;
coeffs(2) = 0;
coeffs(1) = 0;
coeffs(0) = 9;
Eigen::Matrix4f A;
A << -coeffs(3)/coeffs(4),-coeffs(2)/coeffs(4),-coeffs(1)/coeffs(4),-coeffs(0)/coeffs(4),
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0;
// Slove
Eigen::EigenSolver<Eigen::MatrixXf> ES(A);
std::cout << "Roots:\n" << ES.eigenvalues().transpose() << std::endl;
// // Check results
Eigen::PolynomialSolver<float,4> solve;
solve.compute(coeffs);
cout << "Eigen Method:\n" << solve.roots().transpose() << endl;
return 0;
}
结果如下:
同步更新在: