using System;
using MultiWheelC.TrajectoryPlanning.CoarsePath;
namespace MultiWheelC.TrajectoryPlanning.EMPlanner;
///
/// 从已验证轨迹执行状态导出的不可变、控制器中立运动命令。
/// 只表示带符号纵向速度和 yaw rate;不包含横向车体速度、蟹行、原地旋转、UI 或硬件字段。
///
public sealed class TrajectoryControlCommand
{
/// 创建控制器中立命令。
/// 车体纵向速度,单位 m/s;正数前进、负数倒车,保持制动时必须为 0。
/// 车辆 yaw rate,单位 rad/s;保持制动或完成时必须为 0。
/// 命令关联的实际行驶方向。
/// 仅在零速 dwell 完成后的单个更新周期请求方向变更。
/// 为 时调用方必须保持零速度和零 yaw rate。
/// 到达 Goal 或 RollingSafetyStop 后为 。
public TrajectoryControlCommand(double signedLongitudinalVelocity, double yawRate, TravelDirection direction,
bool requestDirectionChange, bool holdBrake, bool isTrajectoryComplete)
{
if (double.IsNaN(signedLongitudinalVelocity) || double.IsInfinity(signedLongitudinalVelocity))
throw new ArgumentOutOfRangeException(nameof(signedLongitudinalVelocity));
if (double.IsNaN(yawRate) || double.IsInfinity(yawRate))
throw new ArgumentOutOfRangeException(nameof(yawRate));
if (!Enum.IsDefined(typeof(TravelDirection), direction))
throw new ArgumentOutOfRangeException(nameof(direction));
SignedLongitudinalVelocity = signedLongitudinalVelocity;
YawRate = yawRate;
Direction = direction;
RequestDirectionChange = requestDirectionChange;
HoldBrake = holdBrake;
IsTrajectoryComplete = isTrajectoryComplete;
}
/// 权威带符号纵向速度,单位 m/s。
public double SignedLongitudinalVelocity { get; }
/// 逆时针为正的 yaw rate,单位 rad/s。
public double YawRate { get; }
public TravelDirection Direction { get; }
/// 是否在本次更新请求一次方向切换。
public bool RequestDirectionChange { get; }
/// 是否要求调用方保持制动,不允许轨迹运动。
public bool HoldBrake { get; }
public bool IsTrajectoryComplete { get; }
}