2014-02-13 4 views
9

Я пытаюсь преобразовать оборот Matrix3d в Quaternion<double>, но до сих пор у меня были только странные ошибки компилятора. Код я использую:Eigen: convert Matrix3d ​​rotation to Quaternion

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

Конструкторы определенного AngleAxis или Matrix являются явным означает, что вы должны написать преобразование следующим образом:

Matrix3f mat; 
Quaternionf q(mat); 

или

Quaternionf q; 
q = mat; 

Same для AngleAxis.

Смежные вопросы