四元数和欧拉角的相互转换
生活随笔
收集整理的這篇文章主要介紹了
四元数和欧拉角的相互转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
四元數轉歐拉角&歐拉角轉四元數程序:四元數轉歐拉角&歐拉角轉四元數程序。
?| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | #include "stdafx.h"#include "math.h"#include<iostream>#include<string.h>using namespace std;void EulerAnglesToQuaternion(double roll, double yaw, double pitch) { ????double cosRoll,sinRoll,cosPitch,sinPitch,cosyaw,sinyaw,qw,qx,qy,qz;????cosRoll = cosf(roll * 0.5f); //z????sinRoll = sinf(roll * 0.5f);//z????cosyaw= cosf(yaw * 0.5f);//y????sinyaw = sinf(yaw * 0.5f);//y????cosPitch = cosf(pitch * 0.5f);//x????sinPitch = sinf(pitch * 0.5f);//x????qw = cosRoll * cosyaw* cosPitch + sinRoll * sinyaw * sinPitch;????qx = cosRoll * sinyaw * cosPitch + sinRoll * cosyaw * sinPitch;????qy = cosRoll * cosyaw * sinPitch - sinRoll * sinyaw * cosPitch;????qz = sinRoll * cosyaw * cosPitch - cosRoll * sinyaw * sinPitch; ????cout << "qw = " << qw << endl;????cout << "qx = " << qx << endl;????cout << "qy = " << qy << endl;????cout << "qz = " << qz << endl;}void QuaternionToEulerAngles(double qw, double qx, double qy, double qz) {????double roll, yaw, pitch;????roll = atan2f(2.f * (qw*qz + qx*qy), 1-2*(qz*qz+qx*qx)); //Z????yaw =? asinf(2.f * (qw*qx - qy*qz)); //Y????pitch =atan2f(2.f * (qw*qy + qz*qx), 1-2*(qy*qy+qx*qx));//X????cout << "roll = " << roll << endl;????cout << "yaw = " << yaw << endl;????cout << "pitch = " << pitch << endl;}int main(){????QuaternionToEulerAngles(0, 0.707106, 0.707106, 0);????EulerAnglesToQuaternion(1.5707,0,3.14159);????return 0;}</string.h></iostream> |
二、Ctrl+F5執行
三、結果
總結
以上是生活随笔為你收集整理的四元数和欧拉角的相互转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++浮点数在内存中的存储方式
- 下一篇: Xsens MTi -1 姿态传感器恢复