#ifndef __LADRC_H #define __LADRC_H #include #include "motor.h" typedef struct { /* 外部命令与内部参考 */ float v_cmd; /* 上层下发的目标 RPM */ float v; /* 内部斜坡后的参考 RPM */ float y; /* 实际速度 RPM */ /* LESO 状态 */ float z1; float z2; /* 核心参数 */ float wc; float wo; float b0; /* LESO 增益 */ float beta1; float beta2; /* 采样与限幅 */ float h; float out_max; /* 控制输出 */ float u; /* Tustin 离散矩阵 */ float Ad11; float Ad12; float Ad21; float Ad22; float Bdu1; float Bdu2; float Bdy1; float Bdy2; /* Anti-windup: 作为 z2_dot 的额外输入,并离散到同一套 Tustin 模型 */ float kaw; float eu_prev; float Bdaw1; float Bdaw2; } LADRC_TypeDef; void LADRC_Init(LADRC_TypeDef *ladrc, float wc, float wo, float b0, float h, float max); float LADRC_Calc(LADRC_TypeDef *ladrc, float actual_val); extern LADRC_TypeDef ladrc_motors[4]; void FourWheel_LADRC_Init(void); void FourWheel_Set_Target_RPM(float fl_rpm, float rl_rpm, float fr_rpm, float rr_rpm); void FourWheel_LADRC_ResetAll(void); void FourWheel_LADRC_Control_Loop(void); /* 命令目标与内部参考分开暴露,便于调试 */ float FourWheel_Get_Target_RPM(Motor_ID_t id); /* 返回 v_cmd */ float FourWheel_Get_Ref_RPM(Motor_ID_t id); /* 返回 v */ float FourWheel_Get_Control_Output(Motor_ID_t id); #endif /* __LADRC_H */