Quadcopter/User/module/xm_quadctrl.h
2025-10-19 16:06:48 +08:00

162 lines
3.5 KiB
C

#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include "device/at9s_pro.h"
#include "component/pid.h"
// 卡尔曼滤波器结构体
typedef struct {
float Q_angle; // 过程噪声协方差(角度)
float Q_bias; // 过程噪声协方差(陀螺仪偏置)
float R_measure; // 测量噪声协方差
float angle; // 估计角度
float bias; // 估计陀螺仪偏置
float P[2][2]; // 误差协方差矩阵
} KalmanFilter;
typedef struct{
float x;
float y;
float z;
}Quad_Vectory3f_t;
typedef struct{
float yaw;
float pit;
float rol;
}Quad_EulrVectory3f_t;
typedef struct {
uint16_t pos_alt;
uint16_t pos_vel;
uint16_t att_agl;
uint16_t att_omg;
}Quad_CtrlFreqParams_t;
typedef struct {
LowPassFilter2p_t accl_x;
LowPassFilter2p_t accl_y;
LowPassFilter2p_t accl_z;
LowPassFilter2p_t gyro_x;
LowPassFilter2p_t gyro_y;
LowPassFilter2p_t gyro_z;
LowPassFilter2p_t eulr_yaw;
LowPassFilter2p_t eulr_pit;
LowPassFilter2p_t eulr_rol;
LowPassFilter2p_t alt;
LowPassFilter2p_t vel_z;
}Quad_LowPassFilter2p_t;
typedef struct {
KPID_Params_t pit_agl;
KPID_Params_t rol_agl;
KPID_Params_t yaw_agl;
KPID_Params_t pit_omg;
KPID_Params_t rol_omg;
KPID_Params_t yaw_omg;
KPID_Params_t alt_pos;
KPID_Params_t alt_vel;
}Quad_PIDParams_t;
typedef struct {
KPID_t rol_omg, rol_agl; // rol轴PID
KPID_t pit_omg, pit_agl; // rol轴PID
KPID_t yaw_omg, yaw_agl; // rol轴PID
KPID_t alt_pos, alt_vel; // 高度环PID
}Quad_PID_t;
typedef struct {
KalmanFilter rol_kf, pit_kf;
}Quad_Kalman_t;
// 电机配置结构体
typedef struct {
float min_output; // 最小输出值 (0.0-1.0)
float max_output; // 最大输出值 (0.0-1.0)
}Quad_MotorConfig_t;
typedef struct {
bool online;
bool stop;
float throttle;
float yaw;
float rol;
float pit;
}Quad_CMD_t;
typedef struct{
Quad_Vectory3f_t accl; // m/s²
Quad_Vectory3f_t gyro;
Quad_EulrVectory3f_t eulr;
float alt; // 气压计加速度计融合后相对高度 (m)
float vel_z; //z轴速度
}Quad_CurrentStatus_t;
typedef struct {
float yaw_agl;
float rol_agl;
float pit_agl;
float yaw_omg;
float rol_omg;
float pit_omg;
float vel;
float thrust;
float alt;
}Quad_ExpectStatus_t;
typedef struct{
float yaw_omg;
float rol_agl;
float pit_agl;
}Quad_ExpectStatusLimit_t;
typedef struct {
float throttle;
float rol;
float pit;
float yaw;
float mix[4]; // 混控计算中间变量
float motor[4]; // 电机输出值 (0.0-1.0)
}Quad_Output_t;
typedef struct {
Quad_CtrlFreqParams_t ctrl_freq; // 控制频率参数
float baseThrottle; // 基础油门值
Quad_PIDParams_t pid; // PID参数
// 低通滤波器参数
Quad_ExpectStatusLimit_t expect_status_limit;
Quad_MotorConfig_t motor_limit; // 四个电机的配置
}Quad_Params_t;
typedef struct{
int64_t now;
float dt;
int64_t last;
Quad_Params_t *param;
Quad_PID_t pid;
Quad_LowPassFilter2p_t filter;
Quad_Kalman_t kalman;
Quad_CurrentStatus_t current_status;
Quad_ExpectStatus_t expect_status;
Quad_Output_t output;
}Quad_t;
int8_t Quad_Init(Quad_t *q, Quad_Params_t *param, float freq);
int8_t Quad_Ctrl(Quad_t *q, Quad_CMD_t cmd);
void Quad_stop();
#ifdef __cplusplus
}
#endif