mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-05 23:49:00 +08:00
added a rotation matrix reorthogonalization function
This commit is contained in:
@@ -124,7 +124,9 @@ struct FloatRates {
|
|||||||
/* _vo = _vi * _s */
|
/* _vo = _vi * _s */
|
||||||
#define FLOAT_VECT3_SMUL(_vo, _vi, _s) VECT3_SMUL(_vo, _vi, _s)
|
#define FLOAT_VECT3_SMUL(_vo, _vi, _s) VECT3_SMUL(_vo, _vi, _s)
|
||||||
|
|
||||||
#define FLOAT_VECT3_NORM(_v) (sqrtf((_v).x*(_v).x + (_v).y*(_v).y + (_v).z*(_v).z))
|
#define FLOAT_VECT3_NORM2(_v) ((_v).x*(_v).x + (_v).y*(_v).y + (_v).z*(_v).z)
|
||||||
|
|
||||||
|
#define FLOAT_VECT3_NORM(_v) (sqrtf(FLOAT_VECT3_NORM2(_v)))
|
||||||
|
|
||||||
#define FLOAT_VECT3_DOT_PRODUCT(_v1, _v2) ((_v1).x*(_v2).x + (_v1).y*(_v2).y + (_v1).z*(_v2).z)
|
#define FLOAT_VECT3_DOT_PRODUCT(_v1, _v2) ((_v1).x*(_v2).x + (_v1).y*(_v2).y + (_v1).z*(_v2).z)
|
||||||
|
|
||||||
@@ -376,15 +378,34 @@ struct FloatRates {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static inline float renorm_factor(float n) {
|
||||||
|
if (n < 1.5625f && n > 0.64f)
|
||||||
|
return .5 * (3-n);
|
||||||
|
else if (n < 100.0f && n > 0.01f)
|
||||||
|
return 1. / sqrtf(n);
|
||||||
|
else
|
||||||
|
return 0.;
|
||||||
|
}
|
||||||
|
|
||||||
static inline float float_rmat_reorthogonalize(struct FloatRMat* rm) {
|
static inline float float_rmat_reorthogonalize(struct FloatRMat* rm) {
|
||||||
|
|
||||||
struct FloatVect3* r0 = (struct FloatVect3*)(&RMAT_ELMT(*rm, 0,0));
|
struct FloatVect3* r0 = (struct FloatVect3*)(&RMAT_ELMT(*rm, 0,0));
|
||||||
struct FloatVect3* r1 = (struct FloatVect3*)(&RMAT_ELMT(*rm, 1,0));
|
struct FloatVect3* r1 = (struct FloatVect3*)(&RMAT_ELMT(*rm, 1,0));
|
||||||
|
struct FloatVect3* r2 = (struct FloatVect3*)(&RMAT_ELMT(*rm, 2,0));
|
||||||
float _err = -0.5*FLOAT_VECT3_DOT_PRODUCT(*r0, *r1);
|
float _err = -0.5*FLOAT_VECT3_DOT_PRODUCT(*r0, *r1);
|
||||||
|
struct FloatVect3 r0_t;
|
||||||
|
VECT3_SUM_SCALED(r0_t, *r0, *r1, _err);
|
||||||
|
VECT3_SUM_SCALED(*r1, *r1, *r0, _err);
|
||||||
|
VECT3_COPY(*r0, r0_t);
|
||||||
|
FLOAT_VECT3_CROSS_PRODUCT(*r2, *r0, *r1);
|
||||||
|
float s = renorm_factor(FLOAT_VECT3_NORM2(*r0));
|
||||||
|
FLOAT_VECT3_SMUL(*r0, *r0, s);
|
||||||
|
s = renorm_factor(FLOAT_VECT3_NORM2(*r1));
|
||||||
|
FLOAT_VECT3_SMUL(*r1, *r1, s);
|
||||||
|
s = renorm_factor(FLOAT_VECT3_NORM2(*r2));
|
||||||
|
FLOAT_VECT3_SMUL(*r2, *r2, s);
|
||||||
return _err;
|
return _err;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user