我真的struggeling找到正确的方式从任意四元数避开单一轴的旋转角度。 所以换句话说,我想找到一个绕指定轴的旋转表示的部分(在我的情况的坐标系的Z轴,但任意的解决方案将是很好)的角度而言。 任何人都可以指出来实现这一目标? 理想的情况是一些Java片段将是很好。
我想提出的解决方案1的态度,那就是:
asin(2*qx*qy + 2*qz*qw)
然而,这种失败在某些情况下,例如,围绕Z轴的单次旋转超过0.6 * PI。
我真的struggeling找到正确的方式从任意四元数避开单一轴的旋转角度。 所以换句话说,我想找到一个绕指定轴的旋转表示的部分(在我的情况的坐标系的Z轴,但任意的解决方案将是很好)的角度而言。 任何人都可以指出来实现这一目标? 理想的情况是一些Java片段将是很好。
我想提出的解决方案1的态度,那就是:
asin(2*qx*qy + 2*qz*qw)
然而,这种失败在某些情况下,例如,围绕Z轴的单次旋转超过0.6 * PI。
答案可以在这里找到组件四元数旋转的绕轴
“摇摆扭动分解”从http://www.euclideanspace.com/maths/geometry/rotations/for/decomposition/
每四元数Q可以分解为某种极分解的
Q = R *(C + S * E)
哪里
R = | Q |,S = | IMAG(Q / R)|,C =真(Q / R)和e = IMAG(Q / S / R)
X↦Q的旋转轴线* X * Q ^( - 1)是E,该角度是在单元上的点(C,S)=(cos(α),SIN(α))的两倍的角度α圈。
只计算旋转的角度,用r比例并不重要,所以
angle = 2*atan2( norm(imag(q)), real(q) )
绕X轴的旋转是由一个四元数表示的ca+sa*i
,关于Y轴由四元数旋转cb+sb*j
和Z轴通过cc+sc*k
,其中ca²+sa²= 1表示余弦正弦对一半的旋转角度的等后来2A,C2a和S2A等将表示双角和其正弦和余弦值。
在应用程序在原点的对象的顺序XYZ乘以赋予了
q=qw+qx*i+qy*j+qz*k
=(cc+sc*k)*(cb+sb*j)*(ca+sa*i)
现在,有趣的事情发生在q*i*q^(-1)
和q^(-1)*k*q
,在内部方面通勤和取消,使
q*i*q^(-1)*(-i) = (cc+sc*k)*(cb+sb*j)*(cb+sb*j)*(cc+sc*k)
= (cc+sc*k)*(c2b+s2b*j)*(cc+sc*k)
= (c2c+s2c*k)*c2b+s2b*j
(-k)*q^(-1)*k*q = (ca+sa*i)*(cb+sb*j)*(cb+sb*j)*(ca+sa*i)
=(ca+sa*i)*(c2b+s2b*j)*(ca+sa*i)
=(c2a+s2a*i)*c2b+s2b*j
然后可将其用于从隔离角度2a,2b和2c的
q*i*q^(-1)*(-i) = (q*i)*(i*q)^(-1)
= (qw*i-qx-qy*k+qz*j)*(-qw*i-qx-qy*k+qz*j)
= (qw²+qx²-qy²-qz²)
+ 2*(qw*qy-qx*qz)*j
+ 2*(qw*qz+qx*qy)*k
(-k)*q^(-1)*k*q = (q*k)^(-1)*(k*q)
= (-qw*k+qx*j-qy*i-qz)*(qw*k+qx*j-qy*i-qz)
= (qw²-qx²-qy²+qz²)
+ 2*(qw*qx+qy*qz)*i
+ 2*(qw*qy-qx*qz)*j
确定表达式的结果
s2b = 2*(qw*qy-qx*qz)
c2b*(c2a+s2a*i) = (qw²-qx²-qy²+qz²) + 2*(qw*qx+qy*qz)*i
c2b*(c2c+s2c*k) = (qw²+qx²-qy²-qz²) + 2*(qw*qz+qx*qy)*k
要么
2a = atan2(2*(qw*qx+qy*qz), (qw²-qx²-qy²+qz²))
2b = asin(2*(qw*qy-qx*qz))
2c = atan2(2*(qw*qz+qx*qy), (qw²+qx²-qy²-qz²))
这种构造的角度的方式,
c2b=sqrt( (qw²+qx²+qy²+qz²)²+8*qw*qx*qy*qz )
是正的,所以2b是-pi / 2和pi / 2之间。 通过一些迹象的操作,人们还可以得到一个解决方案,C2B是负的。
很显然,使用不同类型的旋转次序的,其中Z-旋转中间的旋转。 准确地说,
Q =(CB + *大概j)的*(CC + SC * K)*(C + I中*)
哪里
图2b =标题2A =银行2C =姿态
为了处理态度旋转角度2C较大0.5 * PI,你需要计算的全套欧拉角,因为它们含有随后围绕其他轴两个框之前和Z旋转之后。
或者你需要检测这种情况,可通过保持银行正余弦或检查过大的角度的变化,并应用迹象修改公式反正切内,改变他们的PI(+或 - )导致的角度,并改变Z轴角运算到pi-asin(...)
或者,仅计算之后操纵角,如果(2A,2B,2C)是所计算的溶液,然后,
(2a-sign(2a)*pi, 2b-sign(2b)*pi, sign(2c)*pi-2c)
另一种解决方案给予同样的四元数和旋转。 选择了一个最接近预期的行为。