/* Includes ----------------------------------------------------------------- */ #include "bsp/time.h" #include "BarometerDriver/spl06.h" #include "BarometerDriver/user_iic.h" #include "component/AltitudeKalman.h" #include "component/filter.h" #include "task/user_task.h" /* Private defin#define INITIALIZE_SAMPLE_COUNT 100e ----------------------------------------------------------- */ #define INITIALIZE_SAMPLE_COUNT 100 /* Private macro ------------------------------------------------------------ */ /* Private typedef ---------------------------------------------------------- */ /* Private variables -------------------------------------------------------- */ uint16_t initializeCounter=0; //初始化采样计数 /* 运行时间 */ uint64_t HeightEstimation_now; float HeightEstimation_dt; uint64_t HeightEstimation_last; /* 气压数据 */ int32_t pressure=0; int32_t temperature=0; int32_t height=0; //绝对高度,单位mm int32_t initial_height=0; //初始高度,单位mm float relative_height=0; //相对高度,单位m LowPassFilter2p_t relative_height_filter; float relative_height_filtered; /* 加速度数据 */ LowPassFilter2p_t accl_z_filter;//加速度z轴低通滤波器 float accl_z_filtered; //低通滤波后的z轴加速度 float gravity; //重力加速度 float accl_z_WithoutGravity; //z轴去g加速度 /* 卡尔曼滤波器估计高度 */ AltitudeKalman alt_kf; /* Private function -------------------------------------------------------- */ float remove_gravity_q(float ax, float ay, float az, float q0, float q1, float q2, float q3) { /* Body -> NED 方向余弦矩阵第三行 */ float C31 = 2.0f*(q1*q3 - q0*q2); float C32 = 2.0f*(q2*q3 + q0*q1); float C33 = 1.0f - 2.0f*(q1*q1 + q2*q2); /* NED 下 DOWN 方向的原始加速度 */ float an_z = C31*ax + C32*ay + C33*az; /* 去重力 */ return an_z; } float accel_z_earth; int8_t HeightEstimation_Updata(AHRS_Accl_t accl, AHRS_Quaternion_t quaternion) { SPL06_Update(&temperature, &pressure); height = SPL06_CaculateHeight(pressure); relative_height=(float)((height - initial_height)/1000.0f); relative_height_filtered=LowPassFilter2p_Apply(&relative_height_filter, relative_height); accel_z_earth = remove_gravity_q(accl.x, accl.y, accl.z, quaternion.q0, quaternion.q1, quaternion.q2, quaternion.q3); accel_z_earth=LowPassFilter2p_Apply(&accl_z_filter, accel_z_earth); accl_z_WithoutGravity = (accel_z_earth - gravity) * 9.80665f; return 0; } /* Exported functions ------------------------------------------------------- */ int8_t HeightEstimation_Init(float freq) { SPL06_Init(); BSP_TIME_Delay(100); LowPassFilter2p_Init(&accl_z_filter, freq, 10.0f); LowPassFilter2p_Init(&relative_height_filter, freq, 5.0f); AltKalman_Init(&alt_kf); while(initializeCounter