加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【软件技术】四元素和三维坐标变换

(2018-02-07 22:39:44)
分类: 软件技术
一、四元素

1、四元素表示一个三维空间的旋转,它使三维向量旋转的同时还使得向量的模发生变化,这是其几何意义。

2、四元素可用矩阵表示:

h = a + bi + cj + dk ,可以表示为:(a,b,c,d)
共轭: h* = a-bi-cj-dk,可以表示为:(a,-b,-c,-d)

二阶复数矩阵表示,mat = [a - di,  -b+ci;  b+ci,   a+di], 定义共轭等于矩阵的共轭转置,这个矩阵变成变量与常数矩阵的乘积形式之和的形式,用于表示电子的自旋。

四阶实数矩阵,mat = [a, -b, d,  -c; b, a, -c, -d; -d, c,  a, -b; c, d, b, a],定义共轭等于矩阵的转置

四元素用矩阵表示后,矩阵运算等价于四元素运算。

3、一个实数、三维向量可视为四元素,实数a的四元素表示为(a,0,0,0),三维向量(x,y,z)的四元素表示为(x,y,z,0)

4、运算与特征定义

四元素运算为:四元素为p、q

加法:p+q,元素分别相加
乘法:q p,元素分别相乘
点积:q.p,表示为( p* q + q* p ) / 2
外积:outer(p,q) =( p* q - q* p ) / 2;
偶积:even(p,q)=( p q + q p ) / 2
叉积:cross(p,q) = ( p q - q p ) / 2
除法:divideby(p,q) = exp(p,-1)q

转置(逆):trans(p) = exp(p,-1) = p* / ( p.p )

模:abs(p) = sqrt( p p* )
辐角:arg(p) = arccos( scalar(p) / abs(p) )
正则化:normalize( p ) = p / abs(p)

纯量部分:scalar(p) =( p + p* )/ 2
向量部分:vector(p) = ( p - p* )/2

符号数:sgn(p) = p / abs(p)

二、三维坐标变换

1、方向余弦:
       方向余弦分别是这向量v(x,y,z)与三个坐标轴之间的角度的余弦,a,b,c分别为v对于x-轴、y-轴、z-轴的角度,则v对于x-轴、y-轴、z-轴的方向余弦alpha、bita、gama,计算公式:

alpha = cos(a) = x/sqrt(x*x+y*y+z*z)
bita = cos(b)= y/sqrt(x*x+y*y+z*z)
gama = cos(c)= z/sqrt(x*x+y*y+z*z)

方向余弦矩阵:有两个三维坐标系P、Q, Q坐标系的三个坐标轴在P中存在三组方向余弦,共九个元素,组成的矩阵

2、欧拉角:
       绕“现时”坐标系的x或者y或者z转动的角度,共有三个角度,顺序绕x、y、z各一次(注:
绕x、y、z各一次共有六种可能性),这三个角度称为欧拉角。对应到飞行器的机体座标系上称为偏航yaw(绕飞行器垂直向上的轴旋转)、俯仰pitch(绕飞行器两翼连线水平轴旋转)、横滚roll(绕飞行器从前到后轴旋转)。

欧拉角到四元素的计算公式为:

[q0,q1,q2,q3] = eulerAnglesToQuaternion(roll,pitch,yaw)
{
    cosRoll = cos(roll * 0.5);
    sinRoll = sin(roll * 0.5);

    cosPitch = cos(pitch * 0.5);
    sinPitch = sin(pitch * 0.5);

    cosYaw = cos(yaw  * 0.5);
    sinYaw = sin(yaw  * 0.5);

    q0 = cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw;
    q1 = sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw;
    q2 = cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw;
    q3 = cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw;
}

四元素到欧拉角的计算公式为:
[roll,pitch,yaw] = quaternionToEulerAngles(q0,q1,q2,q3)
{
    roll = atan2(2 * (q2*q3 + q0*q1), q0*q0 - q1*q1 - q2*q2 + q3*q3);
    pitch = asin(2 * (q0*q2 - q1*q3));
    yaw = atan2(2 * (q1*q2 + q0*q3), q0*q0 + q1*q1 - q2*q2 - q3*q3);
}

四元素到旋转矩阵的计算公式
RotationMatrix quaternionToRotationMatrix(q0,q1,q2,q3)
{
     RotationMatrix[0][0] = 1 - 2*(q2*q2 - q3*q3);
     RotationMatrix[0][1] = 2*(q1*q2 - q3*q0);
     RotationMatrix[0][2] = 2*(q1*q3 + q2*q0);

     RotationMatrix[1][0] = 2*(q1*q2 + q3*q0);
     RotationMatrix[1][1] = 1 - 2*(q1*q1 - q3*q3);
     RotationMatrix[1][2] = 2*(q2*q3 - q1*q0);  

     RotationMatrix[2][0] = 2*(q1*q3 - q2*q0);
     RotationMatrix[2][1] = 2*(q2*q3 + q1*q0);
     RotationMatrix[2][2] = 1 - 2*(q1*q1 - q2*q2);   
}


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有