2016-07-27 2 views
0

내 시스템은 좌표계로 구성되며이 시스템의 쿼터니온은 4 개의 값 (qx, qy, qz, qw)의 형태로 롤 (약 x), 피치 (약 y) 및 yaw (약 z)를 나타냅니다.쿼터니언의 개별 구성 요소?

어떻게이 쿼터니온을 3 개의 독립적 인 쿼터니언으로 분리 할 수 ​​있습니까? 하나는 롤을 나타내고 다른 하나는 피치를 나타내며 세 번째는 요 로테이션을 나타냅니다.

감사합니다.

+0

이것은 프로그래밍 질문 사이트가 아닌 http://math.stackexchange.com/ 더 적합 질문처럼 들린다. – mituw16

+0

둘 다 스택 교환 웹 사이트이기 때문에 Q를 전송할 방법이 있습니까? – simplename

+0

그냥 오일러로 변환 천사 표현 – minorlogic

답변

0

오일러 각을 추출한 다음 3 개의 새로운 쿼터니언을 생성 한 다음 올바른 순서로 다시 결합하여 원래의 쿼터니언에 다시 도달해야하는 것처럼 들립니다.

This PDF has formulas 오일러와 쿼터니언을 수동으로 변환합니다. 수식은 RPY 대신 YPR 형식으로 작동합니다. 그들을 사용할 수 있습니까? 여기에 그들이 C에서 구현

:

/* euler_2_quaternion_ZYX */ 

quat->w = cos(az/2.0f) * cos(ay/2.0f) * cos(ax/2.0f) + sin(az/2.0f) * sin(ay/2.0f) * sin(ax/2.0f); 
quat->x = cos(az/2.0f) * cos(ay/2.0f) * sin(ax/2.0f) - sin(az/2.0f) * sin(ay/2.0f) * cos(ax/2.0f); 
quat->y = cos(az/2.0f) * sin(ay/2.0f) * cos(ax/2.0f) + sin(az/2.0f) * cos(ay/2.0f) * sin(ax/2.0f); 
quat->z = sin(az/2.0f) * cos(ay/2.0f) * cos(ax/2.0f) - cos(az/2.0f) * sin(ay/2.0f) * sin(ax/2.0f); 



/* quaternion_2_euler_ZYX */ 

float qx, qy, qz, qw; 

qw = quat->w; 
qx = quat->x; 
qy = quat->y; 
qz = quat->z; 

*az = atan2(qy * qz + qw * qx, 0.5f - ((qx * qx) + (qy * qy))); 
*ay = asin(-2.0f * ((qx * qz) - (qw * qy))); 
*ax = atan2(((qx * qy) + (qw * qz)), 0.5f - ((qy * qy) + (qz * qz)));