using MultiWheelC.TrajectoryPlanning.Utils; namespace MultiWheelC.TrajectoryPlanning.Mapping; /// /// TwoLeg 检测时刻的纯输入快照。 /// /// 单位:位置和两腿局部坐标均为 mm,航向为弧度。该对象不读取检测器或定位模块,确保投影可重复。 /// public sealed class TwoLegProjectionInput { /// /// 创建 TwoLeg 投影快照。 /// /// 参数:hasDetection 表示当前是否检测到目标;detectionWorldX/Y 为检测坐标系原点的世界 mm 坐标;detectionHeadingRadians 为其相对世界坐标系的航向;firstLocalX/Y、secondLocalX/Y 为两腿在检测局部坐标系中的 mm 坐标;radiusMm 为每条腿投影圆半径;diagnostic 为可选诊断文本。 /// 注意:hasDetection 为 false 时其余几何参数不会参与有效性校验。 /// public TwoLegProjectionInput(bool hasDetection, float detectionWorldX, float detectionWorldY, double detectionHeadingRadians, float firstLocalX, float firstLocalY, float secondLocalX, float secondLocalY, float radiusMm, string diagnostic = null) { HasDetection = hasDetection; DetectionWorldX = detectionWorldX; DetectionWorldY = detectionWorldY; DetectionHeadingRadians = detectionHeadingRadians; FirstLocalX = firstLocalX; FirstLocalY = firstLocalY; SecondLocalX = secondLocalX; SecondLocalY = secondLocalY; RadiusMm = radiusMm; Diagnostic = diagnostic ?? string.Empty; } /// 检测是否存在。false 时投影结果为 Empty。 public bool HasDetection { get; } /// 检测局部坐标系原点的世界 X 坐标,单位 mm。 public float DetectionWorldX { get; } /// 检测局部坐标系原点的世界 Y 坐标,单位 mm。 public float DetectionWorldY { get; } /// 检测局部坐标系相对世界坐标系的航向,单位弧度。 public double DetectionHeadingRadians { get; } /// 第一条腿在检测局部坐标系的 X 坐标,单位 mm。 public float FirstLocalX { get; } /// 第一条腿在检测局部坐标系的 Y 坐标,单位 mm。 public float FirstLocalY { get; } /// 第二条腿在检测局部坐标系的 X 坐标,单位 mm。 public float SecondLocalX { get; } /// 第二条腿在检测局部坐标系的 Y 坐标,单位 mm。 public float SecondLocalY { get; } /// 投影为圆形障碍物时的半径,单位 mm。 public float RadiusMm { get; } /// 上游检测阶段提供的可选诊断文本;未提供时为空字符串。 public string Diagnostic { get; } /// 未检测到目标时为 true;检测到目标时,所有数值有限且半径非负才为 true。 public bool IsValid { get { return !HasDetection || (NumericGuard.IsFinite(DetectionWorldX) && NumericGuard.IsFinite(DetectionWorldY) && NumericGuard.IsFinite(DetectionHeadingRadians) && NumericGuard.IsFinite(FirstLocalX) && NumericGuard.IsFinite(FirstLocalY) && NumericGuard.IsFinite(SecondLocalX) && NumericGuard.IsFinite(SecondLocalY) && NumericGuard.IsFinite(RadiusMm) && RadiusMm >= 0f); } } }