|
|
|
@ -21,6 +21,11 @@
@@ -21,6 +21,11 @@
|
|
|
|
|
#include "AP_Math.h" |
|
|
|
|
#include <AP_InternalError/AP_InternalError.h> |
|
|
|
|
|
|
|
|
|
#define HALF_SQRT_2_PlUS_SQRT_2 0.92387953251128673848313610506011 // sqrt(2 + sqrt(2)) / 2
|
|
|
|
|
#define HALF_SQRT_2_MINUS_SQTR_2 0.38268343236508972626808144923416 // sqrt(2 - sqrt(2)) / 2
|
|
|
|
|
#define HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO 0.65328148243818828788676000840496 // sqrt((2 + sqrt(2))/2) / 2
|
|
|
|
|
#define HALF_SQRT_HALF_TIMES_TWO_MINUS_SQRT_TWO 0.27059805007309845059637609665515 // sqrt((2 - sqrt(2))/2) / 2
|
|
|
|
|
|
|
|
|
|
// return the rotation matrix equivalent for this quaternion
|
|
|
|
|
template <typename T> |
|
|
|
|
void QuaternionT<T>::rotation_matrix(Matrix3d &m) const |
|
|
|
@ -137,9 +142,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -137,9 +142,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_YAW_45: |
|
|
|
|
q1 = 0.92387956f; |
|
|
|
|
q1 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
q2 = q3 = 0; |
|
|
|
|
q4 = 0.38268343f; |
|
|
|
|
q4 = HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_YAW_90: |
|
|
|
@ -149,9 +154,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -149,9 +154,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_YAW_135: |
|
|
|
|
q1 = 0.38268343f; |
|
|
|
|
q1 = HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
q2 = q3 = 0; |
|
|
|
|
q4 = 0.92387956f; |
|
|
|
|
q4 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_YAW_180: |
|
|
|
@ -160,9 +165,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -160,9 +165,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_YAW_225: |
|
|
|
|
q1 = -0.38268343f; |
|
|
|
|
q1 = -HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
q2 = q3 = 0; |
|
|
|
|
q4 = 0.92387956f; |
|
|
|
|
q4 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_YAW_270: |
|
|
|
@ -172,9 +177,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -172,9 +177,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_YAW_315: |
|
|
|
|
q1 = 0.92387956f; |
|
|
|
|
q1 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
q2 = q3 = 0; |
|
|
|
|
q4 = -0.38268343f; |
|
|
|
|
q4 = -HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_180: |
|
|
|
@ -184,8 +189,8 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -184,8 +189,8 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_180_YAW_45: |
|
|
|
|
q1 = q4 = 0; |
|
|
|
|
q2 = 0.92387956f; |
|
|
|
|
q3 = 0.38268343f; |
|
|
|
|
q2 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
q3 = HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_180_YAW_90: |
|
|
|
@ -196,8 +201,8 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -196,8 +201,8 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_180_YAW_135: |
|
|
|
|
q1 = q4 = 0; |
|
|
|
|
q2 = 0.38268343f; |
|
|
|
|
q3 = 0.92387956f; |
|
|
|
|
q2 = HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
q3 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_PITCH_180: |
|
|
|
@ -207,8 +212,8 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -207,8 +212,8 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_180_YAW_225: |
|
|
|
|
q1 = q4 = 0; |
|
|
|
|
q2 = -0.38268343f; |
|
|
|
|
q3 = 0.92387956f; |
|
|
|
|
q2 = -HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
q3 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_180_YAW_270: |
|
|
|
@ -220,8 +225,8 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -220,8 +225,8 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_180_YAW_315: |
|
|
|
|
q1 = q4 = 0; |
|
|
|
|
q2 = 0.92387956f; |
|
|
|
|
q3 = -0.38268343f; |
|
|
|
|
q2 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
q3 = -HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_90: |
|
|
|
@ -230,9 +235,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -230,9 +235,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_90_YAW_45: |
|
|
|
|
q1 = 0.65328151f; |
|
|
|
|
q2 = 0.65328145f; |
|
|
|
|
q3 = q4 = 0.27059802f; |
|
|
|
|
q1 = HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO; |
|
|
|
|
q2 = HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO; |
|
|
|
|
q3 = q4 = HALF_SQRT_HALF_TIMES_TWO_MINUS_SQRT_TWO; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_90_YAW_90: |
|
|
|
@ -240,9 +245,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -240,9 +245,9 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_90_YAW_135: |
|
|
|
|
q1 = q2 = 0.27059802f; |
|
|
|
|
q3 = 0.65328145f; |
|
|
|
|
q4 = 0.65328151f; |
|
|
|
|
q1 = q2 = HALF_SQRT_HALF_TIMES_TWO_MINUS_SQRT_TWO; |
|
|
|
|
q3 = HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO; |
|
|
|
|
q4 = HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_270: |
|
|
|
@ -252,10 +257,10 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -252,10 +257,10 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_270_YAW_45: |
|
|
|
|
q1 = 0.65328151f; |
|
|
|
|
q2 = -0.65328145f; |
|
|
|
|
q3 = -0.27059802f; |
|
|
|
|
q4 = 0.27059802f; |
|
|
|
|
q1 = HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO; |
|
|
|
|
q2 = -HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO; |
|
|
|
|
q3 = -HALF_SQRT_HALF_TIMES_TWO_MINUS_SQRT_TWO; |
|
|
|
|
q4 = HALF_SQRT_HALF_TIMES_TWO_MINUS_SQRT_TWO; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_270_YAW_90: |
|
|
|
@ -264,10 +269,10 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -264,10 +269,10 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_270_YAW_135: |
|
|
|
|
q1 = 0.27059802f; |
|
|
|
|
q2 = -0.27059802f; |
|
|
|
|
q3 = -0.65328145f; |
|
|
|
|
q4 = 0.65328151f; |
|
|
|
|
q1 = HALF_SQRT_HALF_TIMES_TWO_MINUS_SQRT_TWO; |
|
|
|
|
q2 = -HALF_SQRT_HALF_TIMES_TWO_MINUS_SQRT_TWO; |
|
|
|
|
q3 = -HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO; |
|
|
|
|
q4 = HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_PITCH_90: |
|
|
|
@ -334,40 +339,40 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
@@ -334,40 +339,40 @@ void QuaternionT<T>::from_rotation(enum Rotation rotation)
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_90_PITCH_68_YAW_293: |
|
|
|
|
q1 = 0.26774535f; |
|
|
|
|
q2 = 0.70698798f; |
|
|
|
|
q3 = 0.01295743f; |
|
|
|
|
q4 = -0.65445596f; |
|
|
|
|
q1 = 0.26774500501681575137524760066299; |
|
|
|
|
q2 = 0.70698804688952421315661922562867; |
|
|
|
|
q3 = 0.012957683254962659713527273197542; |
|
|
|
|
q4 = -0.65445596665363614530264158020145; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_PITCH_315: |
|
|
|
|
q1 = 0.92387956f; |
|
|
|
|
q1 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
q2 = q4 = 0; |
|
|
|
|
q3 = -0.38268343f; |
|
|
|
|
q3 = -HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_90_PITCH_315: |
|
|
|
|
q1 = 0.65328151f; |
|
|
|
|
q2 = 0.65328145f; |
|
|
|
|
q3 = -0.27059802f; |
|
|
|
|
q4 = 0.27059802f; |
|
|
|
|
q1 = HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO; |
|
|
|
|
q2 = HALF_SQRT_HALF_TIMES_TWO_PLUS_SQRT_TWO; |
|
|
|
|
q3 = -HALF_SQRT_HALF_TIMES_TWO_MINUS_SQRT_TWO; |
|
|
|
|
q4 = HALF_SQRT_HALF_TIMES_TWO_MINUS_SQRT_TWO; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_PITCH_7: |
|
|
|
|
q1 = 0.99813479f; |
|
|
|
|
q1 = 0.99813479842186692003735970502021; |
|
|
|
|
q2 = q4 = 0; |
|
|
|
|
q3 = 0.06104854f; |
|
|
|
|
q3 = 0.061048539534856872956769535676358; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_45: |
|
|
|
|
q1 = 0.9238795325112867; |
|
|
|
|
q2 = 0.3826834323650898; |
|
|
|
|
q1 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
q2 = HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
q3 = q4 = 0.0; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
case ROTATION_ROLL_315: |
|
|
|
|
q1 = 0.9238795325112867; |
|
|
|
|
q2 = -0.3826834323650898; |
|
|
|
|
q1 = HALF_SQRT_2_PlUS_SQRT_2; |
|
|
|
|
q2 = -HALF_SQRT_2_MINUS_SQTR_2; |
|
|
|
|
q3 = q4 = 0.0; |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|