2014-02-13 110 views
9

我試圖將Matrix3d旋轉轉換爲Quaternion<double>,但到目前爲止我只有很奇怪的編譯錯誤。我正在使用的代碼是:Eigen:將Matrix3d旋轉轉換爲四元數

Quaternion<double> getQuaternionFromRotationMatrix(const Matrix3d& mat) 
{ 
    AngleAxisd aa; 
    aa = mat; 
    Quaternion<double> q = aa;// conversion error 

    return q; 
} 

,編譯器錯誤:

path/src/Utils.cpp: In function ‘Eigen::Quaternion<double> Utils::getQuaternionFromRotationMatrix(const Matrix3d&)’: 
path/src/Utils.cpp:55:26: error: conversion from ‘Eigen::AngleAxisd {aka Eigen::AngleAxis<double>}’ to non-scalar type ‘Eigen::Quaternion<double>’ requested 
In file included from /usr/local/include/eigen3/Eigen/Core:283:0, 
       from /usr/local/include/eigen3/Eigen/Dense:1, 
       from path/include/Utils.h:4, 
       from path/src/Utils.cpp:1: 
/usr/local/include/eigen3/Eigen/src/Core/Assign.h: In member function ‘Derived& Eigen::DenseBase<Derived>::lazyAssign(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Matrix<double, 3, 1>, Derived = Eigen::Block<Eigen::Matrix<double, 4, 4>, 4, -0x00000000000000001, true, true>]’: 
/usr/local/include/eigen3/Eigen/src/Core/Assign.h:534:123: instantiated from ‘static Derived& Eigen::internal::assign_selector<Derived, OtherDerived, false, false>::run(Derived&, const OtherDerived&) [with Derived = Eigen::Block<Eigen::Matrix<double, 4, 4>, 4, -0x00000000000000001, true, true>, OtherDerived = Eigen::Matrix<double, 3, 1>]’ 
/usr/local/include/eigen3/Eigen/src/Core/Assign.h:574:89: instantiated from ‘Derived& Eigen::MatrixBase<Derived>::operator=(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Matrix<double, 3, 1>, Derived = Eigen::Block<Eigen::Matrix<double, 4, 4>, 4, -0x00000000000000001, true, true>]’ 
path/src/Utils.cpp:34:20: instantiated from here 
/usr/local/include/eigen3/Eigen/src/Core/Assign.h:504:3: error: static assertion failed: "YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES" 

是否有人知道如何既之間轉換?

回答

14

AngleAxisMatrix的構造器是明確這意味着你必須編寫轉換如下:

Matrix3f mat; 
Quaternionf q(mat); 

Quaternionf q; 
q = mat; 

同爲AngleAxis