using System; namespace MultiWheelC.TrajectoryPlanning.EMPlanner; /// /// 世界车辆位姿投影到单一受限方向段后的 Frenet 描述。 /// S 与 L 单位均为 m,航向误差为 rad,距离以 m² 保存;对象不代表跨越换向边界的投影。 /// public sealed class FrenetProjection { /// /// 从参考点和相对量创建不可变投影结果。 /// 参数:lateralOffset 为沿行驶方向左法线的 L(m),headingError 为行驶航向差(rad),squaredDistanceMeters 为非负 m²。 /// 返回:携带参考 S 的投影;空参考点、非有限值或负平方距离会被拒绝。 /// public FrenetProjection(FrenetReferencePoint referencePoint, double lateralOffset, double headingError, double squaredDistanceMeters) { if (referencePoint == null) throw new ArgumentNullException(nameof(referencePoint)); if (!IsFinite(lateralOffset) || !IsFinite(headingError) || !IsFinite(squaredDistanceMeters) || squaredDistanceMeters < 0d) throw new ArgumentOutOfRangeException(nameof(lateralOffset)); ReferencePoint = referencePoint; ReferenceS = referencePoint.ReferenceS; LateralOffset = lateralOffset; HeadingError = headingError; SquaredDistanceMeters = squaredDistanceMeters; } /// /// 投影命中的插值参考点,其坐标为世界 X/Y(m)。 /// public FrenetReferencePoint ReferencePoint { get; } /// /// 命中点在当前方向段的局部参考弧长 S,单位 m。 /// public double ReferenceS { get; } /// /// 世界位姿相对参考行驶方向左法线的横向偏移 L,单位 m。 /// public double LateralOffset { get; } /// /// 车辆行驶航向相对参考行驶航向的归一化误差,单位 rad。 /// public double HeadingError { get; } /// /// 世界位置与命中参考位置的欧氏距离平方,单位 m²。 /// public double SquaredDistanceMeters { get; } /// /// 判定投影标量是否有限。 /// 参数:value 为任意实数;返回:NaN 和正负无穷均返回 false。 /// private static bool IsFinite(double value) { return !double.IsNaN(value) && !double.IsInfinity(value); } }