/******************************************************************************* * 文件名称 : motion_control.h * 文件说明 : 割草机纯追踪运动控制器(C 接口声明) * 创建日期 : 2025-11-22 *******************************************************************************/ #ifndef FML_MOTION_CONTROL_H_ #define FML_MOTION_CONTROL_H_ #include "HIDO_TypeDef.h" #include "GPS.h" /* 控制器状态机阶段 */ typedef enum { MC_STAGE_IDLE = 0, /* 未运行,等待首次 GPS */ MC_STAGE_GOTO_START, /* 移动到起点并校准航向 */ MC_STAGE_FOLLOW_PATH, /* 正常纯追踪阶段 */ MC_STAGE_FINISHED /* 路径已完成(保持静止) */ } E_MCStage; /* 可调参数(默认值见 motion_config.h) */ typedef struct { float max_forward_mps; /* m/s:前进限速 */ float max_reverse_mps; /* m/s:倒车限速(未使用,可扩展) */ float max_turn_rate; /* rad/s:yaw 速率上限 */ float base_speed_mps; /* m/s:巡航基准速度 */ float min_follow_speed_mps; /* m/s:防止速度降至 0 的下限 */ float lookahead_min_m; /* m:低速时的最小前视距离 */ float lookahead_max_m; /* m:高速时的最大前视距离 */ float start_pos_tolerance_m; /* m:判断到达起点的距离容差 */ float start_heading_tolerance_rad; /* rad:起点航向容差 */ float goal_tolerance_m; /* m:终点完成阈值 */ float heading_kp; /* 航向误差 P 增益 */ float heading_kd; /* 航向误差 D 增益 */ float xtrack_kp; /* 横向误差 P 增益 */ float heading_speed_scale; /* 航向误差→减速比例 */ float xtrack_speed_scale; /* 横向误差→减速比例 */ } MC_Config; /* 控制器输出(前向速度 + 角速度 + 调试信息) */ typedef struct { float forward_mps; /* 期望前向速度 (m/s) */ float turn_rate; /* 期望 yaw 角速度 (rad/s) */ float heading_error; /* 航向误差 (rad) */ float cross_track_error; /* 横向误差 (m) */ HIDO_BOOL active; /* 是否生成了有效控制量 */ E_MCStage stage; /* 当前控制阶段 */ float pos_enu[3]; /* 当前 ENU 位置 (E/N/U) */ float heading_deg; /* 当前航向 (deg) */ float target_heading_deg; /* 目标航向 (deg) */ float pitch_deg; /* 当前俯仰 (deg) */ float roll_deg; /* 当前横滚 (deg) */ HIDO_BOOL target_valid; /* 目标点是否有效 */ float target_xy[2]; /* 目标点 (ENU) */ } MC_Output; /* 控制器内部状态结构 */ typedef struct { MC_Config config; /* 运行时使用的配置 */ const float *path_xy; /* ENU 路径数组(x0,y0,...) */ HIDO_UINT32 path_count; /* 路径点数量 */ float pos[3]; /* 当前 ENU 位置 (E,N,U) (m) */ float vel[2]; /* ENU 速度向量 (m/s) */ float heading_rad; /* 当前航向 (rad) */ float heading_deg; /* 当前航向 (deg) */ float pitch_deg; /* 当前俯仰 (deg) */ float roll_deg; /* 当前横滚 (deg) */ float yaw_rate_rad; /* 当前角速度 (rad/s) */ float speed_mps; /* 标量速度 (m/s) */ HIDO_BOOL pose_valid; /* GPS 数据是否有效 */ HIDO_BOOL imu_valid; /* IMU 数据是否有效 */ E_MCStage stage; /* 控制阶段 */ float current_target_xy[2]; /* 最近一次纯追踪目标点 */ HIDO_UINT32 nearest_index; /* 最近路径点索引(缓存) */ HIDO_UINT32 lookahead_index; /* 前视点索引(缓存) */ float last_heading_err; /* 上一周期航向误差 (rad) */ float last_turn_sign; /* 上一周期选择的转向方向(-1/0/+1) */ float heading_err_d; /* 保留字段:航向误差微分 */ float progress_m; /* 累计里程 (m,可扩展) */ } MC_State; /* 使用库默认值初始化配置 */ HIDO_VOID MC_DefaultConfig(MC_Config *_cfg); /* 绑定路径与配置,初始化控制器状态 */ HIDO_VOID MC_Init(MC_State *_state, const MC_Config *_cfg, const float *_path_xy, HIDO_UINT32 _point_count); /* 注入最新 GPRMI 数据(ENU 位姿 + 航向/速度) */ HIDO_VOID MC_UpdateGps(MC_State *_state, const float _enu[3], const ST_GPRMI *_gprmi); /* 注入 IMU 陀螺数据(yaw 角速度) */ HIDO_VOID MC_UpdateImu(MC_State *_state, const ST_GPIMU *_gpimu); /* 执行一次控制循环,输出目标控制量 */ HIDO_VOID MC_Compute(MC_State *_state, float _dt_s, MC_Output *_out); #endif /* FML_MOTION_CONTROL_H_ */