mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-05-02 05:04:08 +08:00
* added python script with ekf derivation (WIP) Signed-off-by: RomanBapst <bapstroman@gmail.com> * worked on c code auto-generation Signed-off-by: RomanBapst <bapstroman@gmail.com> * save before variable name change Signed-off-by: RomanBapst <bapstroman@gmail.com> * changed symbol names Signed-off-by: RomanBapst <bapstroman@gmail.com> * added codegeneration class Signed-off-by: RomanBapst <bapstroman@gmail.com> * improve 3D mag fusion derivation Signed-off-by: RomanBapst <bapstroman@gmail.com> * EKF: Extend ekf sympy derivation to include all observation types * EKF: Add custom ecl::powf function for integer powers * EKF: Convert ekf covariance prediction to use sympy output * EKF: Add test program to compare sympy and matlab covariance prediction Also tests ecl::powf(x,exp) function * EKF: simplify ecl::powf function * Generate code to subfolder generated/ * Add printouts for showing code generation progress * Move generated covariance code to generated folder * Upgrade code generation to python3 * main.py: Remove unused create_symbols function & making code more compact * main.py: move main part into function * Code generation: fix passing wrong rotation matrix to yaw_observation () * EKF: Amend generated code filename for consistency * Move ecl::powf function test to unit tests * EKF: Use updated ecl:powf functionality in test program * Move ecl::powf to utils.hpp * Update ecl::powf test * Update output change indication * test: update expected output for change indicator * test: update expected output for change indicator again Co-authored-by: RomanBapst <bapstroman@gmail.com> Co-authored-by: kamilritz <kritz@ethz.ch>
39 lines
1.3 KiB
C++
39 lines
1.3 KiB
C++
#include <matrix/math.hpp>
|
|
|
|
#pragma once
|
|
|
|
// converts Tait-Bryan 312 sequence of rotations from frame 1 to frame 2
|
|
// to the corresponding rotation matrix that rotates from frame 2 to frame 1
|
|
// rot312(0) - First rotation is a RH rotation about the Z axis (rad)
|
|
// rot312(1) - Second rotation is a RH rotation about the X axis (rad)
|
|
// rot312(2) - Third rotation is a RH rotation about the Y axis (rad)
|
|
// See http://www.atacolorado.com/eulersequences.doc
|
|
matrix::Dcmf taitBryan312ToRotMat(const matrix::Vector3f &rot312);
|
|
|
|
// Use Kahan summation algorithm to get the sum of "sum_previous" and "input".
|
|
// This function relies on the caller to be responsible for keeping a copy of
|
|
// "accumulator" and passing this value at the next iteration.
|
|
// Ref: https://en.wikipedia.org/wiki/Kahan_summation_algorithm
|
|
float kahanSummation(float sum_previous, float input, float &accumulator);
|
|
|
|
// calculate the inverse rotation matrix from a quaternion rotation
|
|
// this produces the inverse rotation to that produced by the math library quaternion to Dcmf operator
|
|
matrix::Dcmf quatToInverseRotMat(const matrix::Quatf &quat);
|
|
|
|
namespace ecl{
|
|
inline float powf(float x, int exp)
|
|
{
|
|
float ret;
|
|
if (exp > 0) {
|
|
ret = x;
|
|
for (int count = 1; count < exp; count++) {
|
|
ret *= x;
|
|
}
|
|
return ret;
|
|
} else if (exp < 0) {
|
|
return 1.0f / ecl::powf(x, -exp);
|
|
}
|
|
return 1.0f;
|
|
}
|
|
}
|