@@ -99,21 +99,16 @@ FASTRAM float rMat[3][3];
9999
100100STATIC_FASTRAM imuRuntimeConfig_t imuRuntimeConfig ;
101101
102- STATIC_FASTRAM pt1Filter_t rotRateFilterX ;
103- STATIC_FASTRAM pt1Filter_t rotRateFilterY ;
104- STATIC_FASTRAM pt1Filter_t rotRateFilterZ ;
102+ STATIC_FASTRAM pt1Filter_t rotRateFilter [XYZ_AXIS_COUNT ];
105103FASTRAM fpVector3_t imuMeasuredRotationBFFiltered = {.v = {0.0f , 0.0f , 0.0f }};
106104
107- STATIC_FASTRAM pt1Filter_t accelFilterX ;
108- STATIC_FASTRAM pt1Filter_t accelFilterY ;
109- STATIC_FASTRAM pt1Filter_t accelFilterZ ;
105+ STATIC_FASTRAM pt1Filter_t accelFilter [XYZ_AXIS_COUNT ];
110106FASTRAM fpVector3_t imuMeasuredAccelBFFiltered = {.v = {0.0f , 0.0f , 0.0f }};
111107
112- STATIC_FASTRAM pt1Filter_t HeadVecEFFilterX ;
113- STATIC_FASTRAM pt1Filter_t HeadVecEFFilterY ;
114- STATIC_FASTRAM pt1Filter_t HeadVecEFFilterZ ;
108+ STATIC_FASTRAM pt1Filter_t HeadVecEFFilter [XYZ_AXIS_COUNT ];
115109FASTRAM fpVector3_t HeadVecEFFiltered = {.v = {0.0f , 0.0f , 0.0f }};
116110
111+ static pt1Filter_t GPS3DspeedFilter ;
117112
118113FASTRAM bool gpsHeadingInitialized ;
119114
@@ -202,18 +197,19 @@ void imuInit(void)
202197 quaternionInitUnit (& orientation );
203198 imuComputeRotationMatrix ();
204199
205- // Initialize rotation rate filter
206- pt1FilterReset (& rotRateFilterX , 0 );
207- pt1FilterReset (& rotRateFilterY , 0 );
208- pt1FilterReset (& rotRateFilterZ , 0 );
209- // Initialize accel filter
210- pt1FilterReset (& accelFilterX , 0 );
211- pt1FilterReset (& accelFilterY , 0 );
212- pt1FilterReset (& accelFilterZ , 0 );
213- // Initialize Heading vector filter
214- pt1FilterReset (& HeadVecEFFilterX , 0 );
215- pt1FilterReset (& HeadVecEFFilterY , 0 );
216- pt1FilterReset (& HeadVecEFFilterZ , 0 );
200+ // Initialize rotation rate, accel and Heading vector filters
201+ for (uint8_t axis = 0 ; axis < XYZ_AXIS_COUNT ; axis ++ ) {
202+ pt1FilterSetCutoff (& rotRateFilter [axis ], IMU_ROTATION_LPF );
203+ pt1FilterReset (& rotRateFilter [axis ], 0.0f );
204+
205+ pt1FilterSetCutoff (& accelFilter [axis ], IMU_ROTATION_LPF );
206+ pt1FilterReset (& accelFilter [axis ], 0.0f );
207+
208+ pt1FilterSetCutoff (& HeadVecEFFilter [axis ], IMU_ROTATION_LPF );
209+ pt1FilterReset (& HeadVecEFFilter [axis ], 0.0f );
210+ }
211+
212+ pt1FilterSetCutoff (& GPS3DspeedFilter , IMU_ROTATION_LPF );
217213}
218214
219215void imuSetMagneticDeclination (float declinationDeg )
@@ -684,19 +680,11 @@ static float imuCalculateAccelerometerWeightRateIgnore(const float acc_ignore_sl
684680
685681static void imuCalculateFilters (float dT )
686682{
687- //flitering
688- imuMeasuredRotationBFFiltered .x = pt1FilterApply4 (& rotRateFilterX , imuMeasuredRotationBF .x , IMU_ROTATION_LPF , dT );
689- imuMeasuredRotationBFFiltered .y = pt1FilterApply4 (& rotRateFilterY , imuMeasuredRotationBF .y , IMU_ROTATION_LPF , dT );
690- imuMeasuredRotationBFFiltered .z = pt1FilterApply4 (& rotRateFilterZ , imuMeasuredRotationBF .z , IMU_ROTATION_LPF , dT );
691-
692- imuMeasuredAccelBFFiltered .x = pt1FilterApply4 (& accelFilterX , imuMeasuredAccelBF .x , IMU_ROTATION_LPF , dT );
693- imuMeasuredAccelBFFiltered .y = pt1FilterApply4 (& accelFilterY , imuMeasuredAccelBF .y , IMU_ROTATION_LPF , dT );
694- imuMeasuredAccelBFFiltered .z = pt1FilterApply4 (& accelFilterZ , imuMeasuredAccelBF .z , IMU_ROTATION_LPF , dT );
695-
696- HeadVecEFFiltered .x = pt1FilterApply4 (& HeadVecEFFilterX , rMat [0 ][0 ], IMU_ROTATION_LPF , dT );
697- HeadVecEFFiltered .y = pt1FilterApply4 (& HeadVecEFFilterY , rMat [1 ][0 ], IMU_ROTATION_LPF , dT );
698- HeadVecEFFiltered .z = pt1FilterApply4 (& HeadVecEFFilterZ , rMat [2 ][0 ], IMU_ROTATION_LPF , dT );
699-
683+ for (uint8_t axis = 0 ; axis < XYZ_AXIS_COUNT ; axis ++ ) {
684+ imuMeasuredRotationBFFiltered .v [axis ] = pt1FilterApply3 (& rotRateFilter [axis ], imuMeasuredRotationBF .v [axis ], dT );
685+ imuMeasuredAccelBFFiltered .v [axis ] = pt1FilterApply3 (& accelFilter [axis ], imuMeasuredAccelBF .v [axis ], dT );
686+ HeadVecEFFiltered .v [axis ] = pt1FilterApply3 (& HeadVecEFFilter [axis ], rMat [axis ][0 ], dT );
687+ }
700688}
701689
702690static void imuCalculateGPSacceleration (fpVector3_t * vEstAccelEF ,fpVector3_t * vEstcentrifugalAccelBF , float * acc_ignore_slope_multipiler )
@@ -732,12 +720,11 @@ static void imuCalculateTurnRateacceleration(fpVector3_t *vEstcentrifugalAccelBF
732720 if (isGPSTrustworthy ()) {
733721 //first speed choice is gps
734722 static bool lastGPSHeartbeat ;
735- static pt1Filter_t GPS3DspeedFilter ;
736723 static float GPS3DspeedFiltered = 0.0f ;
737724 if (gpsSol .flags .gpsHeartbeat != lastGPSHeartbeat ) {
738725 lastGPSHeartbeat = gpsSol .flags .gpsHeartbeat ;
739726 float GPS3Dspeed = calc_length_pythagorean_3D (gpsSol .velNED [X ], gpsSol .velNED [Y ], gpsSol .velNED [Z ]);
740- GPS3DspeedFiltered = pt1FilterApply4 (& GPS3DspeedFilter , GPS3Dspeed , IMU_ROTATION_LPF , dT );
727+ GPS3DspeedFiltered = pt1FilterApply3 (& GPS3DspeedFilter , GPS3Dspeed , dT );
741728 }
742729 currentspeed = GPS3DspeedFiltered ;
743730 * acc_ignore_slope_multipiler = 4.0f ;
0 commit comments