1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-16 04:45:22 +03:00

Compute RMS of filtered gyro data

This commit is contained in:
Pawel Spychalski (DzikuVx) 2024-03-31 18:21:08 +02:00
parent 2612c135ee
commit 93a636d3f1
12 changed files with 146 additions and 2 deletions

View file

@ -57,7 +57,8 @@
"USE_SDCARD_SDIO", "USE_SDCARD_SDIO",
"USE_SDCARD", "USE_SDCARD",
"USE_Q_TUNE", "USE_Q_TUNE",
"USE_GYRO_FFT_FILTER" "USE_GYRO_FFT_FILTER",
"USE_ADAPTIVE_FILTER",
], ],
"configurationProvider": "ms-vscode.cmake-tools" "configurationProvider": "ms-vscode.cmake-tools"
} }

View file

@ -18,6 +18,7 @@ set(CMSIS_DSP_SRC
BasicMathFunctions/arm_scale_f32.c BasicMathFunctions/arm_scale_f32.c
BasicMathFunctions/arm_sub_f32.c BasicMathFunctions/arm_sub_f32.c
BasicMathFunctions/arm_mult_f32.c BasicMathFunctions/arm_mult_f32.c
BasicMathFunctions/arm_offset_f32.c
TransformFunctions/arm_rfft_fast_f32.c TransformFunctions/arm_rfft_fast_f32.c
TransformFunctions/arm_cfft_f32.c TransformFunctions/arm_cfft_f32.c
TransformFunctions/arm_rfft_fast_init_f32.c TransformFunctions/arm_rfft_fast_init_f32.c
@ -26,6 +27,8 @@ set(CMSIS_DSP_SRC
CommonTables/arm_common_tables.c CommonTables/arm_common_tables.c
ComplexMathFunctions/arm_cmplx_mag_f32.c ComplexMathFunctions/arm_cmplx_mag_f32.c
StatisticsFunctions/arm_max_f32.c StatisticsFunctions/arm_max_f32.c
StatisticsFunctions/arm_rms_f32.c
StatisticsFunctions/arm_mean_f32.c
) )
list(TRANSFORM CMSIS_DSP_SRC PREPEND "${CMSIS_DSP_DIR}/Source/") list(TRANSFORM CMSIS_DSP_SRC PREPEND "${CMSIS_DSP_DIR}/Source/")

View file

@ -19,6 +19,7 @@ set(CMSIS_DSP_SRC
BasicMathFunctions/arm_scale_f32.c BasicMathFunctions/arm_scale_f32.c
BasicMathFunctions/arm_sub_f32.c BasicMathFunctions/arm_sub_f32.c
BasicMathFunctions/arm_mult_f32.c BasicMathFunctions/arm_mult_f32.c
BasicMathFunctions/arm_offset_f32.c
TransformFunctions/arm_rfft_fast_f32.c TransformFunctions/arm_rfft_fast_f32.c
TransformFunctions/arm_cfft_f32.c TransformFunctions/arm_cfft_f32.c
TransformFunctions/arm_rfft_fast_init_f32.c TransformFunctions/arm_rfft_fast_init_f32.c
@ -27,6 +28,8 @@ set(CMSIS_DSP_SRC
CommonTables/arm_common_tables.c CommonTables/arm_common_tables.c
ComplexMathFunctions/arm_cmplx_mag_f32.c ComplexMathFunctions/arm_cmplx_mag_f32.c
StatisticsFunctions/arm_max_f32.c StatisticsFunctions/arm_max_f32.c
StatisticsFunctions/arm_rms_f32.c
StatisticsFunctions/arm_mean_f32.c
) )
list(TRANSFORM CMSIS_DSP_SRC PREPEND "${CMSIS_DSP_DIR}/Source/") list(TRANSFORM CMSIS_DSP_SRC PREPEND "${CMSIS_DSP_DIR}/Source/")

View file

@ -343,6 +343,8 @@ main_sources(COMMON_SRC
flight/dynamic_lpf.h flight/dynamic_lpf.h
flight/ez_tune.c flight/ez_tune.c
flight/ez_tune.h flight/ez_tune.h
flight/adaptive_filter.c
flight/adaptive_filter.h
io/adsb.c io/adsb.c
io/beeper.c io/beeper.c

View file

@ -72,5 +72,6 @@ typedef enum {
DEBUG_RATE_DYNAMICS, DEBUG_RATE_DYNAMICS,
DEBUG_LANDING, DEBUG_LANDING,
DEBUG_POS_EST, DEBUG_POS_EST,
DEBUG_ADAPTIVE_FILTER,
DEBUG_COUNT DEBUG_COUNT
} debugType_e; } debugType_e;

View file

@ -51,6 +51,7 @@
#include "flight/rpm_filter.h" #include "flight/rpm_filter.h"
#include "flight/servos.h" #include "flight/servos.h"
#include "flight/wind_estimator.h" #include "flight/wind_estimator.h"
#include "flight/adaptive_filter.h"
#include "navigation/navigation.h" #include "navigation/navigation.h"
@ -421,6 +422,10 @@ void fcTasksInit(void)
#if defined(USE_SMARTPORT_MASTER) #if defined(USE_SMARTPORT_MASTER)
setTaskEnabled(TASK_SMARTPORT_MASTER, true); setTaskEnabled(TASK_SMARTPORT_MASTER, true);
#endif #endif
#ifdef USE_ADAPTIVE_FILTER
setTaskEnabled(TASK_ADAPTIVE_FILTER, true);
#endif
} }
cfTask_t cfTasks[TASK_COUNT] = { cfTask_t cfTasks[TASK_COUNT] = {
@ -672,4 +677,12 @@ cfTask_t cfTasks[TASK_COUNT] = {
.desiredPeriod = TASK_PERIOD_HZ(TASK_AUX_RATE_HZ), // 100Hz @10ms .desiredPeriod = TASK_PERIOD_HZ(TASK_AUX_RATE_HZ), // 100Hz @10ms
.staticPriority = TASK_PRIORITY_HIGH, .staticPriority = TASK_PRIORITY_HIGH,
}, },
#ifdef USE_ADAPTIVE_FILTER
[TASK_ADAPTIVE_FILTER] = {
.taskName = "ADAPTIVE_FILTER",
.taskFunc = adaptiveFilterTask,
.desiredPeriod = TASK_PERIOD_HZ(ADAPTIVE_FILTER_RATE_HZ), // 100Hz @10ms
.staticPriority = TASK_PRIORITY_LOW,
},
#endif
}; };

View file

@ -88,7 +88,7 @@ tables:
values: ["NONE", "AGL", "FLOW_RAW", "FLOW", "ALWAYS", "SAG_COMP_VOLTAGE", values: ["NONE", "AGL", "FLOW_RAW", "FLOW", "ALWAYS", "SAG_COMP_VOLTAGE",
"VIBE", "CRUISE", "REM_FLIGHT_TIME", "SMARTAUDIO", "ACC", "VIBE", "CRUISE", "REM_FLIGHT_TIME", "SMARTAUDIO", "ACC",
"NAV_YAW", "PCF8574", "DYN_GYRO_LPF", "AUTOLEVEL", "ALTITUDE", "NAV_YAW", "PCF8574", "DYN_GYRO_LPF", "AUTOLEVEL", "ALTITUDE",
"AUTOTRIM", "AUTOTUNE", "RATE_DYNAMICS", "LANDING", "POS_EST"] "AUTOTRIM", "AUTOTUNE", "RATE_DYNAMICS", "LANDING", "POS_EST", "ADAPTIVE_FILTER"]
- name: aux_operator - name: aux_operator
values: ["OR", "AND"] values: ["OR", "AND"]
enum: modeActivationOperator_e enum: modeActivationOperator_e

View file

@ -0,0 +1,77 @@
/*
* This file is part of INAV Project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Alternatively, the contents of this file may be used under the terms
* of the GNU General Public License Version 3, as described below:
*
* This file is free software: you may copy, redistribute and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This file is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
#include "platform.h"
#ifdef USE_ADAPTIVE_FILTER
#include <stdlib.h>
#include "flight/adaptive_filter.h"
#include "arm_math.h"
#include <math.h>
#include "common/maths.h"
#include "common/axis.h"
#include "build/debug.h"
static float32_t adaptiveFilterSamples[XYZ_AXIS_COUNT][ADAPTIVE_FILTER_BUFFER_SIZE];
static uint8_t adaptiveFilterSampleIndex = 0;
void adaptiveFilterPush(const flight_dynamics_index_t index, const float value) {
//Push new sample to the buffer so later we can compute RMS and other measures
adaptiveFilterSamples[index][adaptiveFilterSampleIndex] = value;
adaptiveFilterSampleIndex = (adaptiveFilterSampleIndex + 1) % ADAPTIVE_FILTER_BUFFER_SIZE;
}
void adaptiveFilterTask(timeUs_t currentTimeUs) {
UNUSED(currentTimeUs);
//Compute RMS for each axis
for (flight_dynamics_index_t axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
//Copy axis samples to a temporary buffer
float32_t tempBuffer[ADAPTIVE_FILTER_BUFFER_SIZE];
//Use memcpy to copy the samples to the temporary buffer
memcpy(tempBuffer, adaptiveFilterSamples[axis], sizeof(adaptiveFilterSamples[axis]));
//Use arm_mean_f32 to compute the mean of the samples
float32_t mean;
arm_mean_f32(tempBuffer, ADAPTIVE_FILTER_BUFFER_SIZE, &mean);
float32_t normalizedBuffer[ADAPTIVE_FILTER_BUFFER_SIZE];
//Use arm_offset_f32 to subtract the mean from the samples
arm_offset_f32(tempBuffer, -mean, normalizedBuffer, ADAPTIVE_FILTER_BUFFER_SIZE);
//Compute RMS from normalizedBuffer using arm_rms_f32
float32_t rms;
arm_rms_f32(normalizedBuffer, ADAPTIVE_FILTER_BUFFER_SIZE, &rms);
DEBUG_SET(DEBUG_ADAPTIVE_FILTER, axis, rms * 1000.0f);
}
}
#endif /* USE_ADAPTIVE_FILTER */

View file

@ -0,0 +1,32 @@
/*
* This file is part of INAV Project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Alternatively, the contents of this file may be used under the terms
* of the GNU General Public License Version 3, as described below:
*
* This file is free software: you may copy, redistribute and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This file is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
#include "common/axis.h"
#include "common/time.h"
#define ADAPTIVE_FILTER_BUFFER_SIZE 32
#define ADAPTIVE_FILTER_RATE_HZ 100
void adaptiveFilterPush(const flight_dynamics_index_t index, const float value);
void adaptiveFilterTask(timeUs_t currentTimeUs);

View file

@ -121,6 +121,9 @@ typedef enum {
#endif #endif
#ifdef USE_IRLOCK #ifdef USE_IRLOCK
TASK_IRLOCK, TASK_IRLOCK,
#endif
#ifdef USE_ADAPTIVE_FILTER
TASK_ADAPTIVE_FILTER,
#endif #endif
/* Count of real tasks */ /* Count of real tasks */
TASK_COUNT, TASK_COUNT,

View file

@ -68,6 +68,7 @@
#include "flight/gyroanalyse.h" #include "flight/gyroanalyse.h"
#include "flight/rpm_filter.h" #include "flight/rpm_filter.h"
#include "flight/kalman.h" #include "flight/kalman.h"
#include "flight/adaptive_filter.h"
#ifdef USE_HARDWARE_REVISION_DETECTION #ifdef USE_HARDWARE_REVISION_DETECTION
#include "hardware_revision.h" #include "hardware_revision.h"
@ -453,6 +454,8 @@ void FAST_CODE NOINLINE gyroFilter(void)
gyroADCf = gyroLpf2ApplyFn((filter_t *) &gyroLpf2State[axis], gyroADCf); gyroADCf = gyroLpf2ApplyFn((filter_t *) &gyroLpf2State[axis], gyroADCf);
adaptiveFilterPush(axis, gyroADCf);
#ifdef USE_DYNAMIC_FILTERS #ifdef USE_DYNAMIC_FILTERS
if (dynamicGyroNotchState.enabled) { if (dynamicGyroNotchState.enabled) {
gyroDataAnalysePush(&gyroAnalyseState, axis, gyroADCf); gyroDataAnalysePush(&gyroAnalyseState, axis, gyroADCf);

View file

@ -203,3 +203,9 @@
#define MAX_MIXER_PROFILE_COUNT 1 #define MAX_MIXER_PROFILE_COUNT 1
#endif #endif
#define USE_EZ_TUNE #define USE_EZ_TUNE
#ifdef STM32H7
#define USE_ADAPTIVE_FILTER
#endif