2017-10-27 22 views
0

누구나 Eigen을 도와 줄 수 있습니까? 나는 쿼터니온을 행렬로 바꾸려고 시도했다가 완전히 뒤바뀐 행렬을 얻었다. 나는이 문제를 이해하기 전에 쿼터니온을 신뢰할 수 없다.고유 : 회전 행렬을 쿼터니언으로 변환 한 다음 완전히 다른 행렬을 얻는 것

Input matrix: 
    0.991601 0.102421 -0.078975 
    0.125398 -0.611876 0.78095 
-0.0316631 0.784294 0.619581 
Verify_Orthogonal_Matrix: 
|c0|=1,|c1|=1,|c2|=1 
c0c1=-4.39978e-07,c1c2=4.00139e-07,c0c2=2.39639e-08 
Convert to quaternion q: 
[0.706984 0.00118249 -0.0167302 0.00812501] 
Convert back to rotation matrix m1= 
    0.998617 -0.0230481 -0.047257 
    0.0228899  0.99973 -0.00388638 
    0.0473339 0.0027993 0.998875 
Verify_Orthogonal_Matrix: 
|c0|=1,|c1|=1,|c2|=1 
c0c1=1.73472e-18,c1c2=-4.33681e-19,c0c2=6.93889e-18 
Convert again to quaternion q1= 
[0.999653 0.001672 -0.0236559 0.0114885] 

내가 여기 뭘 잘못 했나 :

여기
#include <Eigen/Geometry> 
#include <iostream> 

void Print_Quaternion(Eigen::Quaterniond &q){ 
    std::cout<<"["<<q.w()<<" "<<q.x()<<" "<<q.y()<<" "<<q.z()<<"]"<<std::endl; 
} 
void Verify_Orthogonal_Matrix(Eigen::Matrix3d &m) 
{ 
    std::cout<<"|c0|="<<m.col(0).norm()<<",|c1|="<<m.col(1).norm()<<",|c2|="<<m.col(2).norm()<<std::endl; 
    std::cout<<"c0c1="<<m.col(0).dot(m.col(1))<<",c1c2="<<m.col(1).dot(m.col(2))<<",c0c2="<<m.col(0).dot(m.col(2))<<std::endl; 
} 
int main() 
{ 
    Eigen::Matrix3d m; m<<0.991601,0.102421,-0.078975,0.125398,-0.611876,0.78095,-0.0316631,0.784294,0.619581; 

    std::cout<<"Input matrix:"<<std::endl<<m<<std::endl; 
    std::cout<<"Verify_Orthogonal_Matrix:"<<std::endl; 
    Verify_Orthogonal_Matrix(m); 
    std::cout<<"Convert to quaternion q:"<<std::endl; 
    Eigen::Quaterniond q(m); 
    Print_Quaternion(q); 
    std::cout<<"Convert back to rotation matrix m1="<<std::endl; 
    Eigen::Matrix3d m1=q.normalized().toRotationMatrix(); 
    std::cout<<m1<<std::endl; 
    std::cout<<"Verify_Orthogonal_Matrix:"<<std::endl; 
    Verify_Orthogonal_Matrix(m1); 
    std::cout<<"Convert again to quaternion q1="<<std::endl; 
    Eigen::Quaterniond q1(m1); 
    Print_Quaternion(q1); 
} 

내가 가진 결과는 다음과 같습니다 코드인가? 나는 이것이 잘 알려진 문제가되어야한다고 생각하지만 여기에 붙어있다. 누군가 나를 도울 수 있습니까?

답변

0

입력 행렬은 회전 행렬이 아니며 미러링을 포함합니다. 그것의 결정자 == -1,하지만 회전에는 +1이 있어야합니다. 직교 화 코드를 확인하고 마지막 열의 부호 및 모양을 확인하십시오.

m.col(0).normalize(); 
m.col(1).normalize(); 
m.col(2) = m.col(0).cross(m.col(1)); 
m.col(2).normalize(); 
m.col(0) = m.col(1).cross(m.col(2)); 
m.col(0).normalize(); 

std::cout << "orthogonal matrix:" << std::endl << m << std::endl; 




Input matrix: 
    0.991601 0.102421 -0.078975 
    0.125398 -0.611876 0.78095 
-0.0316631 0.784294 0.619581 
orthogonal matrix: 
    0.991601 0.102421 0.078975 
    0.125398 -0.611876 -0.78095 
-0.0316628 0.784294 -0.619581 
+0

대단히 감사합니다! –

+0

내 대답을 수락하고 투표 할 수 있습니다 ^) – minorlogic