四元数(クォータニオン)の計算やらなんやらができます.主に演算子オーバーロードの練習で作りました.温かい目で見てやってください.

Dependents:   Hybrid_AttitudeEstimation

Committer:
Gaku0606
Date:
Sat Jan 28 19:53:10 2017 +0000
Revision:
0:31fe79c6544c
Child:
1:81bcd478f8d7
???(???????)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Gaku0606 0:31fe79c6544c 1 #ifndef _QUATERNION_HPP_
Gaku0606 0:31fe79c6544c 2 #define _QUATERNION_HPP_
Gaku0606 0:31fe79c6544c 3
Gaku0606 0:31fe79c6544c 4 /**
Gaku0606 0:31fe79c6544c 5 @fn Quaternion.hpp
Gaku0606 0:31fe79c6544c 6 @author Gaku MATSUMOTO
Gaku0606 0:31fe79c6544c 7 @bref クォータニオンを使えるクラスです.
Gaku0606 0:31fe79c6544c 8 */
Gaku0606 0:31fe79c6544c 9
Gaku0606 0:31fe79c6544c 10 class Quaternion{
Gaku0606 0:31fe79c6544c 11 public:
Gaku0606 0:31fe79c6544c 12 /**
Gaku0606 0:31fe79c6544c 13 @bref Quaternionインスタンスを生成します
Gaku0606 0:31fe79c6544c 14 */
Gaku0606 0:31fe79c6544c 15 Quaternion(){
Gaku0606 0:31fe79c6544c 16 w = 1.0f;
Gaku0606 0:31fe79c6544c 17 x = 0.0f;
Gaku0606 0:31fe79c6544c 18 y = 0.0f;
Gaku0606 0:31fe79c6544c 19 z = 0.0f;
Gaku0606 0:31fe79c6544c 20 };
Gaku0606 0:31fe79c6544c 21 /**
Gaku0606 0:31fe79c6544c 22 @bref 要素を代入しながら,インスタンスを生成します.
Gaku0606 0:31fe79c6544c 23 */
Gaku0606 0:31fe79c6544c 24 Quaternion(double _w, double _x, double _y, double _z){
Gaku0606 0:31fe79c6544c 25 w = _w; x = _x; y = _y; z = _z;
Gaku0606 0:31fe79c6544c 26 };
Gaku0606 0:31fe79c6544c 27
Gaku0606 0:31fe79c6544c 28 public:
Gaku0606 0:31fe79c6544c 29 double w;
Gaku0606 0:31fe79c6544c 30 double x;
Gaku0606 0:31fe79c6544c 31 double y;
Gaku0606 0:31fe79c6544c 32 double z;
Gaku0606 0:31fe79c6544c 33
Gaku0606 0:31fe79c6544c 34 public:
Gaku0606 0:31fe79c6544c 35
Gaku0606 0:31fe79c6544c 36 /**
Gaku0606 0:31fe79c6544c 37 @bref クォータニオンの要素をコピーします.
Gaku0606 0:31fe79c6544c 38 */
Gaku0606 0:31fe79c6544c 39 Quaternion operator=(Quaternion r){
Gaku0606 0:31fe79c6544c 40 w = r.w;
Gaku0606 0:31fe79c6544c 41 x = r.x;
Gaku0606 0:31fe79c6544c 42 y = r.y;
Gaku0606 0:31fe79c6544c 43 z = r.z;
Gaku0606 0:31fe79c6544c 44 return *this;
Gaku0606 0:31fe79c6544c 45 };
Gaku0606 0:31fe79c6544c 46
Gaku0606 0:31fe79c6544c 47 /**
Gaku0606 0:31fe79c6544c 48 @bref クォータニオンを足して代入します.
Gaku0606 0:31fe79c6544c 49 */
Gaku0606 0:31fe79c6544c 50 Quaternion operator+=(Quaternion r){
Gaku0606 0:31fe79c6544c 51 w += r.w;
Gaku0606 0:31fe79c6544c 52 x += r.x;
Gaku0606 0:31fe79c6544c 53 y += r.y;
Gaku0606 0:31fe79c6544c 54 z += r.z;
Gaku0606 0:31fe79c6544c 55 return *this;
Gaku0606 0:31fe79c6544c 56 };
Gaku0606 0:31fe79c6544c 57
Gaku0606 0:31fe79c6544c 58 /**
Gaku0606 0:31fe79c6544c 59 @bref クォータニオンを引いて代入します.
Gaku0606 0:31fe79c6544c 60 */
Gaku0606 0:31fe79c6544c 61 Quaternion operator-=(Quaternion r){
Gaku0606 0:31fe79c6544c 62 w -= r.w;
Gaku0606 0:31fe79c6544c 63 x -= r.x;
Gaku0606 0:31fe79c6544c 64 y -= r.y;
Gaku0606 0:31fe79c6544c 65 z -= r.z;
Gaku0606 0:31fe79c6544c 66 return *this;
Gaku0606 0:31fe79c6544c 67 };
Gaku0606 0:31fe79c6544c 68
Gaku0606 0:31fe79c6544c 69 /**
Gaku0606 0:31fe79c6544c 70 * @bref クォータニオンの掛け算をします.
Gaku0606 0:31fe79c6544c 71 * @note この際も順序は重要です.
Gaku0606 0:31fe79c6544c 72 */
Gaku0606 0:31fe79c6544c 73 Quaternion operator*=(Quaternion r){
Gaku0606 0:31fe79c6544c 74 static Quaternion QQ;
Gaku0606 0:31fe79c6544c 75 QQ.w = w*r.x - x*r.x - y*r.y - z*r.z;
Gaku0606 0:31fe79c6544c 76 QQ.x = x*r.w + w*r.x - z*r.y + y*r.z;
Gaku0606 0:31fe79c6544c 77 QQ.y = y*r.w + z*r.x + w*r.y - x*r.z;
Gaku0606 0:31fe79c6544c 78 QQ.z = z*r.w - y*r.x + x*r.y + w*r.z;
Gaku0606 0:31fe79c6544c 79 w = QQ.w;
Gaku0606 0:31fe79c6544c 80 x = QQ.x;
Gaku0606 0:31fe79c6544c 81 y = QQ.y;
Gaku0606 0:31fe79c6544c 82 z = QQ.z;
Gaku0606 0:31fe79c6544c 83 return *this;
Gaku0606 0:31fe79c6544c 84 };
Gaku0606 0:31fe79c6544c 85
Gaku0606 0:31fe79c6544c 86 /**
Gaku0606 0:31fe79c6544c 87 @bref クォータニオンの複素共役を返します.
Gaku0606 0:31fe79c6544c 88 @note 本当はアスタリスクが良かったのですが,ポインタと紛らわしいのでマイナスにしました.
Gaku0606 0:31fe79c6544c 89 */
Gaku0606 0:31fe79c6544c 90 Quaternion operator-(){
Gaku0606 0:31fe79c6544c 91 Quaternion Q;
Gaku0606 0:31fe79c6544c 92 Q.w = w;
Gaku0606 0:31fe79c6544c 93 Q.x = -x;
Gaku0606 0:31fe79c6544c 94 Q.y = -y;
Gaku0606 0:31fe79c6544c 95 Q.z = -z;
Gaku0606 0:31fe79c6544c 96 return Q;
Gaku0606 0:31fe79c6544c 97 };
Gaku0606 0:31fe79c6544c 98
Gaku0606 0:31fe79c6544c 99 /**
Gaku0606 0:31fe79c6544c 100 @bref クォータニオンを正規化して,単位クォータニオンにします.
Gaku0606 0:31fe79c6544c 101 @note 掛け算などを行うたびに実行することをお勧めします.
Gaku0606 0:31fe79c6544c 102 */
Gaku0606 0:31fe79c6544c 103 void normalize(){
Gaku0606 0:31fe79c6544c 104 double norm = sqrt(w*w + x*x + y*y + z*z);
Gaku0606 0:31fe79c6544c 105 if (norm != 0.0){
Gaku0606 0:31fe79c6544c 106 w /= norm;
Gaku0606 0:31fe79c6544c 107 x /= norm;
Gaku0606 0:31fe79c6544c 108 y /= norm;
Gaku0606 0:31fe79c6544c 109 z /= norm;
Gaku0606 0:31fe79c6544c 110 return;
Gaku0606 0:31fe79c6544c 111 }
Gaku0606 0:31fe79c6544c 112 else{
Gaku0606 0:31fe79c6544c 113 return;
Gaku0606 0:31fe79c6544c 114 }
Gaku0606 0:31fe79c6544c 115 };
Gaku0606 0:31fe79c6544c 116 };
Gaku0606 0:31fe79c6544c 117
Gaku0606 0:31fe79c6544c 118 /**
Gaku0606 0:31fe79c6544c 119 @bref クォータニオンの掛け算をします.この際,順序が重要です.
Gaku0606 0:31fe79c6544c 120 */
Gaku0606 0:31fe79c6544c 121 Quaternion operator*(Quaternion l, Quaternion r){
Gaku0606 0:31fe79c6544c 122 static Quaternion Q;
Gaku0606 0:31fe79c6544c 123 Q.w = l.w*r.w - l.x*r.x - l.y*r.y - l.z*r.z;
Gaku0606 0:31fe79c6544c 124 Q.x = l.x*r.w + l.w*r.x - l.z*r.y + l.y*r.z;
Gaku0606 0:31fe79c6544c 125 Q.y = l.y*r.w + l.z*r.x + l.w*r.y - l.x*r.z;
Gaku0606 0:31fe79c6544c 126 Q.z = l.z*r.w - l.y*r.x + l.x*r.y + l.w*r.z;
Gaku0606 0:31fe79c6544c 127 /*double q0Dot, q1Dot, q2Dot, q3Dot;//クォータニオンの時間微分
Gaku0606 0:31fe79c6544c 128 q0Dot = -gx*qg1 - gy*qg2 - gz*qg3;
Gaku0606 0:31fe79c6544c 129 q1Dot = gx*qg0 + gz*qg2 - gy*qg3;
Gaku0606 0:31fe79c6544c 130 q2Dot = gy*qg0 - gz*qg1 + gx*qg3;
Gaku0606 0:31fe79c6544c 131 q3Dot = gz*qg0 + gy*qg1 - gx*qg2;*/
Gaku0606 0:31fe79c6544c 132 return Q;
Gaku0606 0:31fe79c6544c 133 };
Gaku0606 0:31fe79c6544c 134 /**
Gaku0606 0:31fe79c6544c 135 @bref クォータニオンをスカラー倍します..
Gaku0606 0:31fe79c6544c 136 */
Gaku0606 0:31fe79c6544c 137 Quaternion operator*(double s, Quaternion q){
Gaku0606 0:31fe79c6544c 138 static Quaternion Q;
Gaku0606 0:31fe79c6544c 139 Q.w = q.w * s;
Gaku0606 0:31fe79c6544c 140 Q.x = q.x * s;
Gaku0606 0:31fe79c6544c 141 Q.y = q.y * s;
Gaku0606 0:31fe79c6544c 142 Q.z = q.z * s;
Gaku0606 0:31fe79c6544c 143 return Q;
Gaku0606 0:31fe79c6544c 144 };
Gaku0606 0:31fe79c6544c 145 Quaternion operator*(Quaternion q, double s){
Gaku0606 0:31fe79c6544c 146 static Quaternion Q;
Gaku0606 0:31fe79c6544c 147 Q.w = q.w * s;
Gaku0606 0:31fe79c6544c 148 Q.x = q.x * s;
Gaku0606 0:31fe79c6544c 149 Q.y = q.y * s;
Gaku0606 0:31fe79c6544c 150 Q.z = q.z * s;
Gaku0606 0:31fe79c6544c 151 return Q;
Gaku0606 0:31fe79c6544c 152 };
Gaku0606 0:31fe79c6544c 153
Gaku0606 0:31fe79c6544c 154 /**
Gaku0606 0:31fe79c6544c 155 @bref クォータニオンの足し算をします.
Gaku0606 0:31fe79c6544c 156 */
Gaku0606 0:31fe79c6544c 157 Quaternion operator+(Quaternion l, Quaternion r){
Gaku0606 0:31fe79c6544c 158 static Quaternion Q;
Gaku0606 0:31fe79c6544c 159 Q.w = l.w + r.w;
Gaku0606 0:31fe79c6544c 160 Q.x = l.x + r.x;
Gaku0606 0:31fe79c6544c 161 Q.y = l.y + r.y;
Gaku0606 0:31fe79c6544c 162 Q.z = l.z + r.z;
Gaku0606 0:31fe79c6544c 163 return Q;
Gaku0606 0:31fe79c6544c 164 }
Gaku0606 0:31fe79c6544c 165
Gaku0606 0:31fe79c6544c 166 /**
Gaku0606 0:31fe79c6544c 167 @bref クォータニオンの引き算をします.
Gaku0606 0:31fe79c6544c 168 */
Gaku0606 0:31fe79c6544c 169 Quaternion operator-(Quaternion l, Quaternion r){
Gaku0606 0:31fe79c6544c 170 static Quaternion Q;
Gaku0606 0:31fe79c6544c 171 Q.w = l.w - r.w;
Gaku0606 0:31fe79c6544c 172 Q.x = l.x - r.x;
Gaku0606 0:31fe79c6544c 173 Q.y = l.y - r.y;
Gaku0606 0:31fe79c6544c 174 Q.z = l.z - r.z;
Gaku0606 0:31fe79c6544c 175 return Q;
Gaku0606 0:31fe79c6544c 176 }
Gaku0606 0:31fe79c6544c 177
Gaku0606 0:31fe79c6544c 178 #endif