179 const float ux2 =
uv->x *
uv->x;
180 const float uy2 =
uv->y *
uv->y;
181 const float uz2 =
uv->z *
uv->z;
204 const float sphi =
sinf(e->
phi);
205 const float cphi =
cosf(e->
phi);
208 const float spsi =
sinf(e->
psi);
209 const float cpsi =
cosf(e->
psi);
214 RMAT_ELMT(*
rm, 1, 0) = sphi * stheta * cpsi - cphi * spsi;
215 RMAT_ELMT(*
rm, 1, 1) = sphi * stheta * spsi + cphi * cpsi;
217 RMAT_ELMT(*
rm, 2, 0) = cphi * stheta * cpsi + sphi * spsi;
218 RMAT_ELMT(*
rm, 2, 1) = cphi * stheta * spsi - sphi * cpsi;
224 const float sphi =
sinf(e->
phi);
225 const float cphi =
cosf(e->
phi);
228 const float spsi =
sinf(e->
psi);
229 const float cpsi =
cosf(e->
psi);
231 RMAT_ELMT(*
rm, 0, 0) = ctheta * cpsi - sphi * stheta * spsi;
232 RMAT_ELMT(*
rm, 0, 1) = ctheta * spsi + sphi * stheta * cpsi;
237 RMAT_ELMT(*
rm, 2, 0) = stheta * cpsi + sphi * ctheta * spsi;
238 RMAT_ELMT(*
rm, 2, 1) = stheta * spsi - sphi * ctheta * cpsi;
273 1., dt *omega->
r, -dt *omega->
q,
274 -dt *omega->
r, 1., dt *omega->
p,
275 dt *omega->
q, -dt *omega->
p, 1.
288 return 1. /
sqrtf(n);
394 const float qi = q->
qi;
395 const float qx = q->
qx;
396 const float qy = q->
qy;
397 const float qz = q->
qz;
398 const float dp = 0.5 * dt * omega->
p;
399 const float dq = 0.5 * dt * omega->
q;
400 const float dr = 0.5 * dt * omega->
r;
401 q->
qi = qi - dp * qx -
dq * qy -
dr * qz;
402 q->
qx = dp * qi + qx +
dr * qy -
dq * qz;
403 q->
qy =
dq * qi -
dr * qx + qy + dp * qz;
404 q->
qz =
dr * qi +
dq * qx - dp * qy + qz;
412 const float a = 0.5 *
no * dt;
418 const float qi = q->
qi;
419 const float qx = q->
qx;
420 const float qy = q->
qy;
421 const float qz = q->
qz;
422 q->
qi =
ca * qi - dp * qx -
dq * qy -
dr * qz;
423 q->
qx = dp * qi +
ca * qx +
dr * qy -
dq * qz;
424 q->
qy =
dq * qi -
dr * qx +
ca * qy + dp * qz;
425 q->
qz =
dr * qi +
dq * qx - dp * qy +
ca * qz;
460 qd->qi = -0.5 * (r->
p * q->
qx + r->
q * q->
qy + r->
r * q->
qz);
461 qd->qx = -0.5 * (-r->
p * q->
qi - r->
r * q->
qy + r->
q * q->
qz);
462 qd->qy = -0.5 * (-r->
q * q->
qi + r->
r * q->
qx - r->
p * q->
qz);
463 qd->qz = -0.5 * (-r->
r * q->
qi - r->
q * q->
qx + r->
p * q->
qy);
473 qd->qi = -0.5 * (c * q->
qi + r->
p * q->
qx + r->
q * q->
qy + r->
r * q->
qz);
474 qd->qx = -0.5 * (-r->
p * q->
qi + c * q->
qx - r->
r * q->
qy + r->
q * q->
qz);
475 qd->qy = -0.5 * (-r->
q * q->
qi + r->
r * q->
qx + c * q->
qy - r->
p * q->
qz);
476 qd->qz = -0.5 * (-r->
r * q->
qi - r->
q * q->
qx + r->
p * q->
qy + c * q->
qz);
488 const float phi2 = e->
phi / 2.f;
490 const float psi2 = e->
psi / 2.f;
514 const float phi2 = e->
phi / 2.f;
516 const float psi2 = e->
psi / 2.f;
542 const float phi2 = e->
phi / 2.f;
544 const float psi2 = e->
psi / 2.f;
561 const float san =
sinf(angle / 2.f);
562 q->
qi =
cosf(angle / 2.f);
698 const float qx2 = q->
qx * q->
qx;
699 const float qy2 = q->
qy * q->
qy;
700 const float qz2 = q->
qz * q->
qz;
732 const float qx2 = q->
qx * q->
qx;
733 const float qy2 = q->
qy * q->
qy;
734 const float qz2 = q->
qz * q->
qz;
735 const float qi2 = q->
qi * q->
qi;
765 const float qx2 = q->
qx * q->
qx;
766 const float qy2 = q->
qy * q->
qy;
767 const float qz2 = q->
qz * q->
qz;
768 const float qi2 = q->
qi * q->
qi;
801 if (
fabsf(
det) < 1e-4) {
return 1; }
925 if (
fabsf(
det) < 1e-4) {
return 1; }
929 for (i = 0; i < 4; ++i) {
950 for (i = 0; i < n; i++) {
951 for (
j = 0;
j < 2 * n;
j++) {
954 }
else if ((
j >= n) && (
j == i + n)) {
963 for (i = 0; i < n; i++) {
966 for (
j = i;
j < 2 * n;
j++) {
967 a[i][
j] = a[i][
j] /
t;
970 for (
j = 0;
j < n;
j++) {
973 for (k = 0; k < 2 * n; k++) {
974 a[
j][k] = a[
j][k] -
t * a[i][k];
981 for (i = 0 ; i < n ; i++) {
982 for (
j = n;
j < 2 * n;
j++) {
983 o[i][
j - n] = a[i][
j];
1030 for (k = 2; k <= q; k++) {
1031 c = c * (
float)(q - k + 1) / (
float)(k * (2 * q - k + 1));
1051 for (k = 1; k <=
s; k++) {
1063 for (
int i = 0; i < m; i++) {
1065 for (
int j = 0;
j < n;
j++) {
static const float scale[]
static void float_quat_normalize(struct FloatQuat *q)
void float_vect2_scale_in_2d(struct FloatVect2 *vect2, const float norm_des)
void float_rates_of_euler_dot(struct FloatRates *r, const struct FloatEulers *e, const struct FloatEulers *edot)
void float_vect3_bound_in_3d(struct FloatVect3 *vect3, const float bound)
float float_rmat_reorthogonalize(struct FloatRMat *rm)
void float_eulers_of_quat_zxy(struct FloatEulers *e, const struct FloatQuat *q)
euler rotation 'ZXY' This rotation order is useful if you need 90 deg pitch
void float_vect3_scale_in_2d(struct FloatVect3 *vect3, const float norm_des)
void float_mat3_mult(struct FloatVect3 *vect_out, const float mat[3][3], const struct FloatVect3 vect_in)
Multiply 3D matrix with vector.
float float_rmat_norm(const struct FloatRMat *rm)
Norm of a rotation matrix.
void float_rmat_transp_ratemult(struct FloatRates *rb, const struct FloatRMat *m_b2a, const struct FloatRates *ra)
rotate anglular rates by transposed rotation matrix.
void float_quat_derivative_lagrange(struct FloatQuat *qd, const struct FloatRates *r, const struct FloatQuat *q)
Quaternion derivative from rotational velocity.
void float_mat_invert(float **o, float **mat, const int n)
Calculate inverse of any n x n matrix (passed as C array) o = mat^-1 Algorithm verified with Matlab.
#define FLOAT_RATES_NORM(_v)
void float_rmat_of_eulers_312(struct FloatRMat *rm, const struct FloatEulers *e)
void float_quat_inv_comp(struct FloatQuat *b2c, const struct FloatQuat *a2b, const struct FloatQuat *a2c)
Composition (multiplication) of two quaternions.
static void float_mat_scale(float **a, float k, const int m, const int n)
a *= k, where k is a scalar value
void float_vect3_integrate_fi(struct FloatVect3 *vec, const struct FloatVect3 *dv, const float dt)
in place first order integration of a 3D-vector
void float_quat_of_rmat(struct FloatQuat *q, const struct FloatRMat *rm)
Quaternion from rotation matrix.
void float_mat2_mult(struct FloatVect2 *vect_out, const float mat[4], const struct FloatVect2 vect_in)
Multiply 2D matrix with vector.
void float_eulers_of_quat_yxz(struct FloatEulers *e, const struct FloatQuat *q)
euler rotation 'YXZ' This function calculates from a quaternion the Euler angles with the order YXZ,...
void float_rmat_transp_mult(struct FloatEulers *rb, const struct FloatRMat *m_b2a, const struct FloatEulers *ra)
rotate angle by transposed rotation matrix.
void float_rmat_integrate_fi(struct FloatRMat *rm, const struct FloatRates *omega, float dt)
in place first order integration of a rotation matrix
void float_quat_differential(struct FloatQuat *q_out, const struct FloatRates *w, const float dt)
Delta rotation quaternion with constant angular rates.
void float_quat_comp_norm_shortest(struct FloatQuat *a2c, const struct FloatQuat *a2b, const struct FloatQuat *b2c)
Composition (multiplication) of two quaternions with normalization.
void float_eulers_of_rmat(struct FloatEulers *e, const struct FloatRMat *rm)
void float_quat_of_eulers_yxz(struct FloatQuat *q, const struct FloatEulers *e)
quat from euler rotation 'YXZ' This function calculates a quaternion from Euler angles with the order...
void float_rates_vect3_integrate_fi(struct FloatRates *r, const struct FloatVect3 *dr, const float dt)
in place first order integration of angular rates
bool float_mat_inv_3d(float inv_out[3][3], const float mat_in[3][3])
3x3 matrix inverse
void float_rmat_of_eulers_321(struct FloatRMat *rm, const struct FloatEulers *e)
Rotation matrix from 321 Euler angles (float).
static float float_log_n(const float v, const float n)
void float_quat_of_eulers_zxy(struct FloatQuat *q, const struct FloatEulers *e)
quat from euler rotation 'ZXY' This rotation order is useful if you need 90 deg pitch
void float_quat_integrate_fi(struct FloatQuat *q, const struct FloatRates *omega, const float dt)
in place first order quaternion integration with constant rotational velocity
static void float_mat_copy(float **a, float **b, const int m, const int n)
a = b
static void float_mat_diagonal_scal(float **o, float v, const int n)
Make an n x n identity matrix (for matrix passed as array)
void float_quat_comp(struct FloatQuat *a2c, const struct FloatQuat *a2b, const struct FloatQuat *b2c)
Composition (multiplication) of two quaternions.
static void float_quat_invert(struct FloatQuat *qo, const struct FloatQuat *qi)
float float_mat_norm_li(float **a, const int m, const int n)
void float_rmat_vmult(struct FloatVect3 *vb, const struct FloatRMat *m_a2b, const struct FloatVect3 *va)
rotate 3D vector by rotation matrix.
bool float_mat_inv_2d(float inv_out[4], const float mat_in[4])
2x2 matrix inverse
void float_quat_integrate(struct FloatQuat *q, const struct FloatRates *omega, const float dt)
in place quaternion integration with constant rotational velocity
static void float_quat_wrap_shortest(struct FloatQuat *q)
void float_rmat_ratemult(struct FloatRates *rb, const struct FloatRMat *m_a2b, const struct FloatRates *ra)
rotate anglular rates by rotation matrix.
#define FLOAT_VECT3_NORM(_v)
void float_quat_of_orientation_vect(struct FloatQuat *q, const struct FloatVect3 *ov)
Quaternion from orientation vector.
void float_rmat_comp_inv(struct FloatRMat *m_a2b, const struct FloatRMat *m_a2c, const struct FloatRMat *m_b2c)
Composition (multiplication) of two rotation matrices.
void float_rates_integrate_fi(struct FloatRates *r, const struct FloatRates *dr, const float dt)
in place first order integration of angular rates
void float_rmat_mult(struct FloatEulers *rb, const struct FloatRMat *m_a2b, const struct FloatEulers *ra)
rotate angle by rotation matrix.
static void float_mat_sum_scaled(float **a, float **b, const float k, const int m, const int n)
a += k*b, where k is a scalar value
void float_vect3_bound_in_2d(struct FloatVect3 *vect3, const float bound)
bool float_mat_inv_4d(float invOut[4][4], const float mat_in[4][4])
4x4 Matrix inverse
void float_quat_of_eulers(struct FloatQuat *q, const struct FloatEulers *e)
quat of euler roation 'ZYX'
void float_eulers_of_quat(struct FloatEulers *e, const struct FloatQuat *q)
euler rotation 'ZYX'
static float float_quat_norm(const struct FloatQuat *q)
void float_rmat_of_quat(struct FloatRMat *rm, const struct FloatQuat *q)
#define MAKE_MATRIX_PTR(_ptr, _mat, _rows)
Make a pointer to a matrix of _rows lines.
void float_quat_tilt_twist(struct FloatQuat *tilt, struct FloatQuat *twist, const struct FloatQuat *quat)
Tilt twist decomposition of a quaternion (z axis)
void float_vect2_bound_in_2d(struct FloatVect2 *vect2, const float bound)
void float_rmat_of_axis_angle(struct FloatRMat *rm, const struct FloatVect3 *uv, const float angle)
initialises a rotation matrix from unit vector axis and angle
void float_quat_comp_inv_norm_shortest(struct FloatQuat *a2b, const struct FloatQuat *a2c, const struct FloatQuat *b2c)
Composition (multiplication) of two quaternions with normalization.
void float_mat_exp(float **a, float **o, const int n)
void float_rmat_transp_vmult(struct FloatVect3 *vb, const struct FloatRMat *m_b2a, const struct FloatVect3 *va)
rotate 3D vector by transposed rotation matrix.
void float_rmat_inv(struct FloatRMat *m_b2a, const struct FloatRMat *m_a2b)
Inverse/transpose of a rotation matrix.
void float_quat_of_axis_angle(struct FloatQuat *q, const struct FloatVect3 *uv, const float angle)
Quaternion from unit vector and angle.
void float_quat_inv_comp_norm_shortest(struct FloatQuat *b2c, const struct FloatQuat *a2b, const struct FloatQuat *a2c)
Composition (multiplication) of two quaternions with normalization.
void float_quat_comp_inv(struct FloatQuat *a2b, const struct FloatQuat *a2c, const struct FloatQuat *b2c)
Composition (multiplication) of two quaternions.
#define FLOAT_VECT2_NORM(_v)
static void float_mat_mul_copy(float **o, float **a, float **b, const int m, const int n, const int l)
o = a * b
void float_rmat_comp(struct FloatRMat *m_a2c, const struct FloatRMat *m_a2b, const struct FloatRMat *m_b2c)
Composition (multiplication) of two rotation matrices.
void float_quat_derivative(struct FloatQuat *qd, const struct FloatRates *r, const struct FloatQuat *q)
Quaternion derivative from rotational velocity.
void float_quat_vmult(struct FloatVect3 *v_out, const struct FloatQuat *q, const struct FloatVect3 *v_in)
rotate 3D vector by quaternion.
#define VECT3_CROSS_PRODUCT(_vo, _v1, _v2)
#define RMAT_ELMT(_rm, _row, _col)
#define MAT33_ROW_VECT3_SMUL(_mat, _row, _vin, _s)
#define VECT3_SUM_SCALED(_c, _a, _b, _s)
#define VECT3_DOT_PRODUCT(_v1, _v2)
static float renorm_factor(float n)
static float float_mat_det_4d(const float m[4][4])
static float float_mat_minor_4d(const float m[4][4], int r0, int r1, int r2, int c0, int c1, int c2)
static void float_mat_adjoint_4d(float adjOut[4][4], const float m[4][4])
Paparazzi floating point algebra.