-
Notifications
You must be signed in to change notification settings - Fork 13.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
local position acceleration: use mean value between two publications #24105
base: main
Are you sure you want to change the base?
Conversation
To avoid aliasing on the ned acceleration, add an accumulation of acceleration to improve the downsampling
For navigation you could also rather use |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think your changes makes sense as it's better to avoid aliasing anyways
lpos.ax = vel_deriv(0); | ||
lpos.ay = vel_deriv(1); | ||
lpos.az = vel_deriv(2); | ||
if (vel_integ_duration_ > 0.001f) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if (vel_integ_duration_ > 0.001f) { | |
if (vel_integ_duration_ > FLT_EPSILON) { |
@@ -280,6 +280,9 @@ class EKF2 final : public ModuleParams, public px4::ScheduledWorkItem | |||
perf_counter_t _ekf_update_perf{perf_alloc(PC_ELAPSED, MODULE_NAME": EKF update")}; | |||
perf_counter_t _msg_missed_imu_perf{perf_alloc(PC_COUNT, MODULE_NAME": IMU message missed")}; | |||
|
|||
Vector3f delta_vel_{0.f, 0.f, 0.f}; | |||
float vel_integ_duration_{0}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
float vel_integ_duration_{0}; | |
float _delta_vel_dt{0}; |
@@ -280,6 +280,9 @@ class EKF2 final : public ModuleParams, public px4::ScheduledWorkItem | |||
perf_counter_t _ekf_update_perf{perf_alloc(PC_ELAPSED, MODULE_NAME": EKF update")}; | |||
perf_counter_t _msg_missed_imu_perf{perf_alloc(PC_COUNT, MODULE_NAME": IMU message missed")}; | |||
|
|||
Vector3f delta_vel_{0.f, 0.f, 0.f}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Vector3f delta_vel_{0.f, 0.f, 0.f}; | |
Vector3f _delta_vel{0.f, 0.f, 0.f}; |
@@ -731,6 +731,10 @@ void EKF2::Run() | |||
_ekf.setIMUData(imu_sample_new); | |||
PublishAttitude(now); // publish attitude immediately (uses quaternion from output predictor) | |||
|
|||
// accumulate delta velocity to compute mean acceleration | |||
delta_vel_ += _ekf.getVelocityDerivative() * imu_sample_new.delta_vel_dt; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could do this directly in the output predictor so that getVelocityDerivative()
returns the average.
Solved Problem
On our onboard computer, we use the vehicle local position message for estimation and control purpose.
We use the acceleration fields to have a higher order than just velocity and position.
We have observed aliasing on tests with vibrations. The NED acceleration integral become very different from the velocity.
Solution
To avoid aliasing on the NED acceleration, add an accumulation of acceleration to improve the down sampling.
This implementation looks like a hack... Of course, I'm open to any suggestions for a better implementation.
Test coverage