我正在寻找一种将方向矢量(X、Y、Z)转换为欧拉角(航向、俯仰、坡度)的方法。我知道方向向量本身不足以获得坡度角,所以还有另一个所谓的上向量。
有方向向量 (X,Y,Z) 和向上向量 (X,Y,Z) 如何将其转换为欧拉角?
我正在寻找一种将方向矢量(X、Y、Z)转换为欧拉角(航向、俯仰、坡度)的方法。我知道方向向量本身不足以获得坡度角,所以还有另一个所谓的上向量。
有方向向量 (X,Y,Z) 和向上向量 (X,Y,Z) 如何将其转换为欧拉角?
让我们看看我是否理解正确。这是关于刚体在三维空间中的方向,就像飞行中的飞机一样。那架飞机的机头指向方向向量
D=(XD,YD,ZD) .
朝向屋顶的是向上的向量
U=(XU,YU,ZU) .
那么标题 H
将是D
投影到地球表面的方向矢量:
H=(XD,YD,0) ,
有一个相关的角度
angle_H=atan2(YD,XD) .
俯仰P 将是鼻子相对于地平线的上/下角,如果方向矢量D
被归一化,你可以从
ZD=sin(angle_P)
导致
angle_P=asin(ZD) .
最后,对于倾斜角,我们考虑机翼的方向,假设机翼垂直于身体。如果飞机直线飞向D
,机翼指向垂直D
并平行于地球表面:
W0 = ( -YD, XD, 0 )
这将是 0 的坡度角。预期的向上向量将垂直于W0
并垂直于D
U0 = W0 × D
×
表示叉积 。如果坡度角为零,则U
等于,否则和之间的角度是坡度角,可以由下式计算U0
U
U0
angle_B
cos(angle_B) = Dot(U0,U) / abs(U0) / abs(U)
sin(angle_B) = Dot(W0,U) / abs(W0) / abs(U) .
这里 'abs' 计算向量的长度。从那里你得到银行角度为
angle_B = atan2( Dot(W0,U) / abs(W0), Dot(U0,U) / abs(U0) ) .
如果U
和D
被归一化,则归一化因子相互抵消。
我们需要三个向量:用世界坐标系 (WCS) 表示的局部坐标系 (LCS) 的 X1、Y1、Z1。下面的代码展示了如何根据这 3 个向量计算三个欧拉角。
#include <math.h>
#include <float.h>
#define PI 3.141592653589793
/**
* @param X1x
* @param X1y
* @param X1z X1 vector coordinates
* @param Y1x
* @param Y1y
* @param Y1z Y1 vector coordinates
* @param Z1x
* @param Z1y
* @param Z1z Z1 vector coordinates
* @param pre precession rotation
* @param nut nutation rotation
* @param rot intrinsic rotation
*/
void lcs2Euler(
double X1x, double X1y, double X1z,
double Y1x, double Y1y, double Y1z,
double Z1x, double Z1y, double Z1z,
double *pre, double *nut, double *rot) {
double Z1xy = sqrt(Z1x * Z1x + Z1y * Z1y);
if (Z1xy > DBL_EPSILON) {
*pre = atan2(Y1x * Z1y - Y1y*Z1x, X1x * Z1y - X1y * Z1x);
*nut = atan2(Z1xy, Z1z);
*rot = -atan2(-Z1x, Z1y);
}
else {
*pre = 0.;
*nut = (Z1z > 0.) ? 0. : PI;
*rot = -atan2(X1y, X1x);
}
}