yincheng.zhong
2 天以前 567085ead3f6adaabd884f16ab4b17c62e8f0403
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*******************************************************************************
 * 文件名称 : 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_ */