mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-01 19:07:45 +08:00
AngularAcceleration: explicitly disable filter when cutoff <= 0
This commit is contained in:
committed by
Mathieu Bresciani
parent
4a14a8bc7f
commit
43fb076828
@@ -73,19 +73,18 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCutoffFreq(float sample_freq, float cutoff_freq)
|
bool setCutoffFreq(float sample_freq, float cutoff_freq)
|
||||||
{
|
{
|
||||||
if ((sample_freq <= 0.f) || (cutoff_freq <= 0.f) || (cutoff_freq >= sample_freq / 2.f)
|
if ((sample_freq <= 0.f) || (cutoff_freq <= 0.f) || (cutoff_freq >= sample_freq / 2.f)
|
||||||
|| !isFinite(sample_freq) || !isFinite(cutoff_freq)) {
|
|| !isFinite(sample_freq) || !isFinite(cutoff_freq)) {
|
||||||
|
|
||||||
// No filtering
|
// Invalid parameters
|
||||||
_alpha = 1.f;
|
return false;
|
||||||
_cutoff_freq = 0.f;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setParameters(1.f / sample_freq, 1.f / (2.f * M_PI_F * cutoff_freq));
|
setParameters(1.f / sample_freq, 1.f / (2.f * M_PI_F * cutoff_freq));
|
||||||
_cutoff_freq = cutoff_freq;
|
_cutoff_freq = cutoff_freq;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -241,6 +241,22 @@ TEST(AlphaFilterTest, AlphaZeroTest)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(AlphaFilterTest, SetFrequencyTest)
|
||||||
|
{
|
||||||
|
AlphaFilter<float> _alpha_filter;
|
||||||
|
const float fs = .1f;
|
||||||
|
|
||||||
|
EXPECT_FALSE(_alpha_filter.setCutoffFreq(fs, 0.f));
|
||||||
|
EXPECT_FALSE(_alpha_filter.setCutoffFreq(fs, fs)); // Cutoff above Nyquist freq
|
||||||
|
EXPECT_FALSE(_alpha_filter.setCutoffFreq(0.f, fs / 4.f));
|
||||||
|
EXPECT_FALSE(_alpha_filter.setCutoffFreq(0.f, 0.f));
|
||||||
|
EXPECT_FALSE(_alpha_filter.setCutoffFreq(-fs, fs / 4.f));
|
||||||
|
EXPECT_FALSE(_alpha_filter.setCutoffFreq(-fs, -fs / 4.f));
|
||||||
|
EXPECT_FALSE(_alpha_filter.setCutoffFreq(fs, -fs / 4.f));
|
||||||
|
|
||||||
|
EXPECT_TRUE(_alpha_filter.setCutoffFreq(fs, fs / 4.f));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(AlphaFilterTest, ConvergenceTest)
|
TEST(AlphaFilterTest, ConvergenceTest)
|
||||||
{
|
{
|
||||||
AlphaFilter<float> _alpha_filter;
|
AlphaFilter<float> _alpha_filter;
|
||||||
|
|||||||
@@ -167,8 +167,14 @@ void VehicleAngularVelocity::ResetFilters()
|
|||||||
_notch_filter_velocity[axis].reset(angular_velocity_uncalibrated(axis));
|
_notch_filter_velocity[axis].reset(angular_velocity_uncalibrated(axis));
|
||||||
|
|
||||||
// angular acceleration low pass
|
// angular acceleration low pass
|
||||||
_lp_filter_acceleration[axis].setCutoffFreq(_filter_sample_rate_hz, _param_imu_dgyro_cutoff.get());
|
if ((_param_imu_dgyro_cutoff.get() > 0.f)
|
||||||
|
&& (_lp_filter_acceleration[axis].setCutoffFreq(_filter_sample_rate_hz, _param_imu_dgyro_cutoff.get()))) {
|
||||||
_lp_filter_acceleration[axis].reset(angular_acceleration_uncalibrated(axis));
|
_lp_filter_acceleration[axis].reset(angular_acceleration_uncalibrated(axis));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// disable filtering
|
||||||
|
_lp_filter_acceleration[axis].setAlpha(1.f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// force reset notch filters on any scale change
|
// force reset notch filters on any scale change
|
||||||
|
|||||||
Reference in New Issue
Block a user