forked from Archive/PX4-Autopilot
sensors/vehicle_angular_velocity: RPM filter add harmonics
This commit is contained in:
parent
8f242ec444
commit
b74bdb0250
|
@ -335,8 +335,10 @@ void VehicleAngularVelocity::DisableDynamicNotchEscRpm()
|
|||
|
||||
// device id mismatch, disable all
|
||||
for (auto &dnf : _dynamic_notch_filter_esc_rpm) {
|
||||
for (int axis = 0; axis < 3; axis++) {
|
||||
dnf[axis].setParameters(0, 0, 0);
|
||||
for (int harmonic = 0; harmonic < MAX_NUM_ESC_RPM_HARMONICS; harmonic++) {
|
||||
for (int axis = 0; axis < 3; axis++) {
|
||||
dnf[harmonic][axis].setParameters(0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -376,20 +378,27 @@ void VehicleAngularVelocity::UpdateDynamicNotchEscRpm(bool force)
|
|||
if ((esc_status.esc[i].timestamp != 0) && ((_timestamp_sample_last - esc_status.esc[i].timestamp) < 1_s)
|
||||
&& (esc_status.esc[i].esc_rpm > MIN_ESC_RPM)) {
|
||||
|
||||
// TODO: rotor frequency, blade pass frequency, harmonics
|
||||
const float frequency_hz = static_cast<float>(esc_status.esc[i].esc_rpm) / 60.f;
|
||||
const float esc_hz = static_cast<float>(esc_status.esc[i].esc_rpm) / 60.f;
|
||||
|
||||
for (int axis = 0; axis < 3; axis++) {
|
||||
auto &dnf = _dynamic_notch_filter_esc_rpm[i][axis];
|
||||
const float change_percent = fabsf(dnf.getNotchFreq() - frequency_hz) / frequency_hz;
|
||||
for (int harmonic = 0; harmonic < MAX_NUM_ESC_RPM_HARMONICS; harmonic++) {
|
||||
const float frequency_hz = esc_hz * (harmonic + 1);
|
||||
|
||||
auto &dnf0 = _dynamic_notch_filter_esc_rpm[i][harmonic][0];
|
||||
const float change_percent = fabsf(dnf0.getNotchFreq() - frequency_hz) / frequency_hz;
|
||||
|
||||
if (change_percent > 0.001f) {
|
||||
// peak frequency changed by at least 0.1%
|
||||
dnf.setParameters(_filter_sample_rate_hz, frequency_hz, 1.f); // TODO: configurable bandwidth
|
||||
for (int axis = 0; axis < 3; axis++) {
|
||||
auto &dnf = _dynamic_notch_filter_esc_rpm[i][harmonic][axis];
|
||||
dnf.setParameters(_filter_sample_rate_hz, frequency_hz, 1.f); // TODO: configurable bandwidth
|
||||
}
|
||||
|
||||
// only reset if there's sufficient change (> 1%)
|
||||
if ((change_percent > 0.01f) && (_last_scale > 0.f)) {
|
||||
dnf.reset(_angular_velocity(axis) / _last_scale);
|
||||
for (int axis = 0; axis < 3; axis++) {
|
||||
auto &dnf = _dynamic_notch_filter_esc_rpm[i][harmonic][axis];
|
||||
dnf.reset(_angular_velocity(axis) / _last_scale);
|
||||
}
|
||||
}
|
||||
|
||||
perf_count(_dynamic_notch_filter_esc_rpm_update_perf);
|
||||
|
@ -399,10 +408,11 @@ void VehicleAngularVelocity::UpdateDynamicNotchEscRpm(bool force)
|
|||
_dynamic_notch_esc_rpm_available = true;
|
||||
|
||||
} else {
|
||||
// disable this notch filter
|
||||
for (int axis = 0; axis < 3; axis++) {
|
||||
auto &dnf = _dynamic_notch_filter_esc_rpm[i][axis];
|
||||
dnf.setParameters(0, 0, 0);
|
||||
// disable all notch filters for this ESC
|
||||
for (int harmonic = 0; harmonic < MAX_NUM_ESC_RPM_HARMONICS; harmonic++) {
|
||||
for (int axis = 0; axis < 3; axis++) {
|
||||
_dynamic_notch_filter_esc_rpm[i][harmonic][axis].setParameters(0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -525,8 +535,13 @@ void VehicleAngularVelocity::Run()
|
|||
perf_begin(_dynamic_notch_filter_esc_rpm_perf);
|
||||
|
||||
for (auto &dnf : _dynamic_notch_filter_esc_rpm) {
|
||||
if (dnf[axis].getNotchFreq() > 0.f) {
|
||||
dnf[axis].applyDF1(data, N);
|
||||
for (int harmonic = 0; harmonic < MAX_NUM_ESC_RPM_HARMONICS; harmonic++) {
|
||||
if (dnf[harmonic][axis].getNotchFreq() > 0.f) {
|
||||
dnf[harmonic][axis].applyDF1(data, N);
|
||||
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -621,8 +636,13 @@ void VehicleAngularVelocity::Run()
|
|||
perf_begin(_dynamic_notch_filter_esc_rpm_perf);
|
||||
|
||||
for (auto &dnf : _dynamic_notch_filter_esc_rpm) {
|
||||
if (dnf[axis].getNotchFreq() > 0.f) {
|
||||
dnf[axis].applyDF1(&angular_velocity(axis), 1);
|
||||
for (int harmonic = 0; harmonic < MAX_NUM_ESC_RPM_HARMONICS; harmonic++) {
|
||||
if (dnf[harmonic][axis].getNotchFreq() > 0.f) {
|
||||
dnf[harmonic][axis].applyDF1(&angular_velocity(axis), 1);
|
||||
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -133,10 +133,12 @@ private:
|
|||
};
|
||||
|
||||
static constexpr int MAX_NUM_ESC_RPM = sizeof(esc_status_s::esc) / sizeof(esc_status_s::esc[0]);
|
||||
static constexpr int MAX_NUM_ESC_RPM_HARMONICS = 3;
|
||||
|
||||
static constexpr int MAX_NUM_FFT_PEAKS = sizeof(sensor_gyro_fft_s::peak_frequencies_x) / sizeof(
|
||||
sensor_gyro_fft_s::peak_frequencies_x[0]);
|
||||
|
||||
math::NotchFilterArray<float> _dynamic_notch_filter_esc_rpm[MAX_NUM_ESC_RPM][3] {};
|
||||
math::NotchFilterArray<float> _dynamic_notch_filter_esc_rpm[MAX_NUM_ESC_RPM][MAX_NUM_ESC_RPM_HARMONICS][3] {};
|
||||
math::NotchFilterArray<float> _dynamic_notch_filter_fft[MAX_NUM_FFT_PEAKS][3] {};
|
||||
|
||||
perf_counter_t _dynamic_notch_filter_esc_rpm_update_perf{nullptr};
|
||||
|
|
Loading…
Reference in New Issue