#ifndef CONTROL_GENERATOR_H #define CONTROL_GENERATOR_H #include "agv_model.h" #include "path_curve.h" #include /** * @brief 控制序列结构体 */ struct ControlSequence { std::vector controls; // 控制量数组 std::vector timestamps; // 时间戳数组 std::vector predicted_states; // 预测状态轨迹 void clear() { controls.clear(); timestamps.clear(); predicted_states.clear(); } size_t size() const { return controls.size(); } }; /** * @brief 控制序列生成器 * 根据给定的路径曲线生成控制序列 */ class ControlGenerator { public: /** * @brief 构造函数 * @param model AGV运动学模型 */ explicit ControlGenerator(const AGVModel& model); /** * @brief 生成控制序列(基本跟踪方法) * @param path 参考路径 * @param initial_state 初始状态 * @param dt 时间步长 (s) * @param horizon 预测时域 * @return 控制序列 */ ControlSequence generate(const PathCurve& path, const AGVModel::State& initial_state, double dt = 0.1, double horizon = 10.0); /** * @brief 使用Pure Pursuit算法生成控制序列 * @param path 参考路径 * @param initial_state 初始状态 * @param dt 时间步长 (s) * @param lookahead_distance 前视距离 (m) * @param desired_velocity 期望速度 (m/s) * @param horizon 预测时域 * @return 控制序列 */ ControlSequence generatePurePursuit(const PathCurve& path, const AGVModel::State& initial_state, double dt = 0.1, double lookahead_distance = 1.5, double desired_velocity = 1.0, double horizon = 10.0); /** * @brief 使用Stanley算法生成控制序列 * @param path 参考路径 * @param initial_state 初始状态 * @param dt 时间步长 (s) * @param k_gain 增益系数 * @param desired_velocity 期望速度 (m/s) * @param horizon 预测时域 * @return 控制序列 */ ControlSequence generateStanley(const PathCurve& path, const AGVModel::State& initial_state, double dt = 0.1, double k_gain = 1.0, double desired_velocity = 1.0, double horizon = 10.0); private: AGVModel model_; /** * @brief Pure Pursuit算法计算单步控制 */ AGVModel::Control computePurePursuitControl(const AGVModel::State& state, const PathPoint& target_point, double desired_velocity); /** * @brief Stanley算法计算单步控制 */ AGVModel::Control computeStanleyControl(const AGVModel::State& state, const PathPoint& nearest_point, double k_gain, double desired_velocity); /** * @brief 找到前视点 */ PathPoint findLookaheadPoint(const PathCurve& path, const AGVModel::State& state, double lookahead_distance) const; /** * @brief 计算角度差(归一化到[-π, π]) */ double normalizeAngle(double angle) const; }; #endif // CONTROL_GENERATOR_H