四元数、欧拉角及方向余弦矩阵的相互转换公式

四元数、欧拉角及方向余弦矩阵的相互转换公式四元数 欧拉角及方向余弦矩阵的相互转换公式一 欧拉角转四元数 常用来初始化四元数 按 Z Y X 的旋转变换顺序有 二 四元数与旋转矩阵 常用来作坐标变换 1 b 系到 R 系的坐标变换矩阵 2 R 系至 b 系的坐标变换矩阵公式详情 http blog csdn net u0 article details 三 欧拉角转方向余弦矩阵由以上两式可得 经

四元数、欧拉角及方向余弦矩阵的相互转换公式

1. 欧拉角转四元数(常用来初始化四元数)

按Z-Y-X的旋转变换顺序有:


![欧拉角转四元数](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTE5MTMzODMwODIw)

2. 四元数与旋转矩阵(常用来作坐标变换) 1.b系到R系的坐标变换矩阵

![四元数与旋转矩阵](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTIzMTE1ODE4ODg1)
2.R系至b系的坐标变换矩阵公式

![四元数与旋转矩阵](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTE5MTMzODU0MjEz)
详情:http://blog.csdn.net/u0/article/details/

3. 欧拉角转方向余弦矩阵


![欧拉角转方向余弦矩阵](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTE5MTMzOTM1MTY1)
由以上两式可得,经三次基本旋转对应的坐标变换为:

![这里写图片描述](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTE5MTM0MzUzOTY1)
从上述方向余弦矩阵中可方便提取欧拉角

4. 四元数转欧拉角


![四元数转欧拉角](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwOTE5MTM0MTI0NDY0)

5. 附C程序

 void eulerAnglesToQuaternion(void) { cosRoll = cosf(roll * 0.5f); sinRoll = sinf(roll * 0.5f); cosPitch = cosf(pitch * 0.5f); sinPitch = sinf(pitch * 0.5f); cosHeading = cosf(hdg * 0.5f); sinHeading = sinf(hdg * 0.5f); q0 = cosRoll * cosPitch * cosHeading + sinRoll * sinPitch * sinHeading; q1 = sinRoll * cosPitch * cosHeading - cosRoll * sinPitch * sinHeading; q2 = cosRoll * sinPitch * cosHeading + sinRoll * cosPitch * sinHeading; q3 = cosRoll * cosPitch * sinHeading - sinRoll * sinPitch * cosHeading; } void quaternionToRotationMatrix(void) { float q1q1 = sq(q1); float q2q2 = sq(q2); float q3q3 = sq(q3); float q0q1 = q0 * q1; float q0q2 = q0 * q2; float q0q3 = q0 * q3; float q1q2 = q1 * q2; float q1q3 = q1 * q3; float q2q3 = q2 * q3; rMat[0][0] = 1.0f - 2.0f * q2q2 - 2.0f * q3q3; rMat[0][1] = 2.0f * (q1q2 + -q0q3); rMat[0][2] = 2.0f * (q1q3 - -q0q2); rMat[1][0] = 2.0f * (q1q2 - -q0q3); rMat[1][1] = 1.0f - 2.0f * q1q1 - 2.0f * q3q3; rMat[1][2] = 2.0f * (q2q3 + -q0q1); rMat[2][0] = 2.0f * (q1q3 + -q0q2); rMat[2][1] = 2.0f * (q2q3 - -q0q1); rMat[2][2] = 1.0f - 2.0f * q1q1 - 2.0f * q2q2; } void quaternionToEulerAngles(void) { roll = atan2f(2.f * (q2q3 + q0q1), q0q0 - q1q1 - q2q2 + q3q3); pitch = asinf(2.f * (q0q2 - q1q3)); yaw = atan2f(2.f * (q1q2 + q0q3), q0q0 + q1q1 - q2q2 - q3q3); } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226959.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:17
下一篇 2026年3月16日 下午10:17


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号