using System.Collections.Generic; using MultiWheelC.TrajectoryPlanning.Utils; namespace MultiWheelC.TrajectoryPlanning.Mapping; /// 将检测局部坐标中的两条腿转换为世界 mm 坐标圆形障碍物。 public static class TwoLegObstacleProjector { /// /// 投影一份 TwoLeg 快照。 /// /// 参数:input 为检测时刻采集的纯数据快照,可为 null。 /// 返回:null 为 Unavailable;未检测到目标为 Empty;数值无效为 Invalid;成功时为含两个圆形障碍物的 Applied。 /// 注意:本方法只读取 input,不访问传感器、定位、UI 或时钟。 /// public static ObstacleProjectionResult Project(TwoLegProjectionInput input) { if (input == null) return ObstacleProjectionResult.Unavailable("TwoLeg snapshot is unavailable."); if (!input.HasDetection) return ObstacleProjectionResult.Empty(input.Diagnostic); if (!input.IsValid) return ObstacleProjectionResult.Invalid("TwoLeg snapshot contains invalid values."); CoordinateTransform.LocalToWorld(input.DetectionWorldX, input.DetectionWorldY, input.DetectionHeadingRadians, input.FirstLocalX, input.FirstLocalY, out double firstX, out double firstY); CoordinateTransform.LocalToWorld(input.DetectionWorldX, input.DetectionWorldY, input.DetectionHeadingRadians, input.SecondLocalX, input.SecondLocalY, out double secondX, out double secondY); var obstacles = new List { new CircleObstacle((float)firstX, (float)firstY, input.RadiusMm), new CircleObstacle((float)secondX, (float)secondY, input.RadiusMm), }; return ObstacleProjectionResult.Applied(obstacles, input.Diagnostic); } }