From d974cf47bec9607893d15473d0cda972a315fcca Mon Sep 17 00:00:00 2001 From: David Wehr <dawehr@iastate.edu> Date: Sat, 22 Apr 2017 02:31:17 -0500 Subject: [PATCH] Added lidar complementary filter and updated accelerometer Z bias. --- quad/src/quad_app/sensor_processing.c | 22 +++++++++++++++++-- .../real_quad/src/hw_impl_zybo_imu.c | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/quad/src/quad_app/sensor_processing.c b/quad/src/quad_app/sensor_processing.c index c1edf7c3d..80e2c22d3 100644 --- a/quad/src/quad_app/sensor_processing.c +++ b/quad/src/quad_app/sensor_processing.c @@ -112,9 +112,8 @@ int sensor_processing(log_t* log_struct, user_input_t *user_input_struct, raw_se sensor_struct->roll_angle_filtered = ALPHA * (sensor_struct->roll_angle_filtered + sensor_struct->phi_dot* get_last_loop_time()) + (1. - ALPHA) * accel_roll; - // Z-axis points upward, so negate distance - sensor_struct->lidar_altitude = -raw_sensor_struct->lidar_distance_m; + //sensor_struct->lidar_altitude = -raw_sensor_struct->lidar_distance_m; // Simply copy optical flow data sensor_struct->optical_flow = raw_sensor_struct->optical_flow; @@ -123,6 +122,25 @@ int sensor_processing(log_t* log_struct, user_input_t *user_input_struct, raw_se //sensor_struct->optical_flow.yVel = biquad_execute(&sensor_struct->flow_y_filt, -sensor_struct->optical_flow.yVel); flow_to_vel(&sensor_struct->optical_flow, raw_sensor_struct->lidar_distance_m); + /* + * Altitude double complementary filter + */ + static float alt_alpha = 0.9975; + static float filtered_vel = 0; + static float filtered_alt = 0; + static float last_lidar = 0; + + float this_lidar = raw_sensor_struct->lidar_distance_m; + // Acceleration in m/s without gravity + float quad_z_accel = -9.8 * (accel_z + 1); + filtered_vel = alt_alpha*(filtered_vel + quad_z_accel*get_last_loop_time()) + + (1 - alt_alpha)*(this_lidar - last_lidar); + filtered_alt = alt_alpha*(filtered_alt + filtered_vel*get_last_loop_time()) + + (1 - alt_alpha)*(this_lidar); + + last_lidar = this_lidar; + sensor_struct->lidar_altitude = filtered_alt; + return 0; } diff --git a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c index 3bfc6c08d..2efebf246 100644 --- a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c +++ b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_imu.c @@ -48,7 +48,7 @@ #define ACCEL_X_BIAS 0.023f #define ACCEL_Y_BIAS 0.009f -#define ACCEL_Z_BIAS 0.087f +#define ACCEL_Z_BIAS 0.0686f int mpu9150_write(struct I2CDriver *i2c, u8 register_addr, u8 data); int mpu9150_read(struct I2CDriver *i2c, u8* recv_buffer, u8 register_addr, int size); -- GitLab