@@ -127,3 +127,45 @@ Matrix<double> GlobalXYZ::getRPY(double & roll,double & pitch,double & yaw)
127
127
yaw = atan2 (DCM (1 ,0 ),DCM (0 ,0 ));
128
128
return DCM;
129
129
}
130
+
131
+ Vector<double > GlobalXYZ::getQuaternion ()
132
+ {
133
+ Vector<double > quaternion (4 );
134
+ Vector<double > newX,newY,newZ;
135
+ getXYZ (newX,newY,newZ);
136
+ Matrix<double > DCM (3 ,3 );
137
+ // 计算体坐标系->全局坐标系的转换矩阵
138
+ DCM (0 ,0 ) = newX (0 ); DCM (0 ,1 ) = newX (1 ); DCM (0 ,2 ) = newX (2 );
139
+ DCM (1 ,0 ) = newY (0 ); DCM (1 ,1 ) = newY (1 ); DCM (1 ,2 ) = newY (2 );
140
+ DCM (2 ,0 ) = newZ (0 ); DCM (2 ,1 ) = newZ (1 ); DCM (2 ,2 ) = newZ (2 );
141
+ double trace = DCM (0 ,0 ) + DCM (1 ,1 ) + DCM (2 ,2 );
142
+ if (trace > 0 ) {
143
+ double s = 0.5 / sqrt (trace + 1.0 );
144
+ quaternion (0 ) = 0.25 / s;
145
+ quaternion (1 ) = (DCM (2 ,1 ) - DCM (1 ,2 )) * s;
146
+ quaternion (2 ) = (DCM (0 ,2 ) - DCM (2 ,0 )) * s;
147
+ quaternion (3 ) = (DCM (1 ,0 ) - DCM (0 ,1 )) * s;
148
+ } else {
149
+ if (DCM (0 ,0 ) > DCM (1 ,1 ) && DCM (0 ,0 ) > DCM (2 ,2 )) {
150
+ double s = 2.0 * sqrt (1.0 + DCM (0 ,0 ) - DCM (1 ,1 ) - DCM (2 ,2 ));
151
+ quaternion (0 ) = (DCM (2 ,1 ) - DCM (1 ,2 )) / s;
152
+ quaternion (1 ) = 0.25 * s;
153
+ quaternion (2 ) = (DCM (0 ,1 ) + DCM (1 ,0 )) / s;
154
+ quaternion (3 ) = (DCM (0 ,2 ) + DCM (2 ,0 )) / s;
155
+ } else if (DCM (1 ,1 ) > DCM (2 ,2 )) {
156
+ double s = 2.0 * sqrt (1.0 + DCM (1 ,1 ) - DCM (0 ,0 ) - DCM (2 ,2 ));
157
+ quaternion (0 ) = (DCM (0 ,2 ) - DCM (2 ,0 )) / s;
158
+ quaternion (1 ) = (DCM (0 ,1 ) - DCM (1 ,0 )) / s;
159
+ quaternion (2 ) = 0.25 * s;
160
+ quaternion (3 ) = (DCM (1 ,2 ) + DCM (2 ,1 )) / s;
161
+ } else {
162
+ double s = 2.0 * sqrt (1.0 + DCM (2 ,2 ) - DCM (0 ,0 ) - DCM (1 ,1 ));
163
+ quaternion (0 ) = (DCM (1 ,0 ) - DCM (0 ,1 )) / s;
164
+ quaternion (1 ) = (DCM (0 ,2 ) + DCM (2 ,0 )) / s;
165
+ quaternion (2 ) = (DCM (1 ,2 ) + DCM (2 ,1 )) / s;
166
+ quaternion (3 ) = 0.25 * s;
167
+ }
168
+ }
169
+
170
+ return quaternion;
171
+ }
0 commit comments