eigen求四元数平均数

2023-10-17  本文已影响0人  tmsource

#include<Eigen/Core>

#include<iostream>

#include<Eigen/Geometry>

#include<Eigen/Dense>

using namespace Eigen;

void Calcuc(std::vector<Eigen::Quaterniond> qs)

{

    Eigen::Matrix4d M;

    M.setZero();

    for (size_t i = 0; i < qs.size(); i++)

    {

        Eigen::Vector4d q(qs[i].x(), qs[i].y(), qs[i].z(), qs[i].w());

        Eigen::Matrix4d Mi= q* q.transpose();

        M += Mi;

    }

    std::cout << M << std::endl;

    EigenSolver<Matrix4d> es(M);

    MatrixXcd evecs = es.eigenvectors();//获取矩阵特征向量4*4,这里定义的MatrixXcd必须有c,表示获得的是complex复数矩阵

    MatrixXcd evals = es.eigenvalues();//获取矩阵特征值 4*1

    MatrixXd evalsReal;//注意这里定义的MatrixXd里没有c

    evalsReal = evals.real();//获取特征值实数部分

    MatrixXf::Index evalsMax;

    evalsReal.rowwise().sum().maxCoeff(&evalsMax);//得到最大特征值的位置

    Vector4d q;

    q << evecs.real()(0, evalsMax), evecs.real()(1, evalsMax),evecs.real()(2, evalsMax), evecs.real()(3, evalsMax);

    std::cout <<"final\n" << q << std::endl;

}

int main()

{

    Eigen::AngleAxisd rotation_vector(acos(-1) / 4, Eigen::Vector3d(0, 0, 1));

    Eigen::Quaterniond Q(rotation_vector);

    Eigen::Quaterniond Q1(Eigen::AngleAxisd(acos(-1) / 6, Eigen::Vector3d(0, 0, 1)));

    Eigen::Quaterniond Q2(Eigen::AngleAxisd(acos(-1) / 4, Eigen::Vector3d(0, 0, 1)));

    Eigen::Quaterniond Q3(Eigen::AngleAxisd(acos(-1) / 4.5, Eigen::Vector3d(0, 0, 1)));

    std::cout <<"123Q:" << Q3 << std::endl;

    std::cout << "**********四元数值:x,y,z,w*************" << std::endl;

    std::cout << Q.x() << std::endl;

    std::cout << Q.y() << std::endl;

    std::cout << Q.z() << std::endl;

    std::cout << Q.w() << std::endl;

    auto vc=Q.vec();

    Calcuc({Q,Q1,Q2});

}

上一篇 下一篇

猜你喜欢

热点阅读