using System; using System.Collections.Generic; using System.Collections.ObjectModel; using MultiWheelC.TrajectoryPlanning.PathSmoothing; namespace MultiWheelC.TrajectoryPlanning.PathSmoothing.Processing; /// 同一几何分析器产生的路径、方向段和未验证质量统计。 public sealed class PathGeometryAnalysis { /// 创建一次几何重算的只读结果快照。 /// 重算后的完整路径点集合。 /// 完整覆盖 的方向段集合。 /// 路径总弧长,单位 m。 /// 车辆曲率绝对值峰值,单位 1/m。 /// 车辆曲率导数绝对值峰值,单位 1/m²。 /// 车辆曲率均方根,单位 1/m。 /// 不跨换向点的累计绝对曲率变化,单位 1/m。 /// 不跨换向点的曲率变化代价。 /// 输入点携带的最小保守车体净空,单位 m。 internal PathGeometryAnalysis( IReadOnlyList path, IReadOnlyList segments, double pathLengthMeters, double maximumAbsoluteVehicleCurvaturePerMeter, double maximumAbsoluteVehicleCurvatureDerivativePerSquareMeter, double rootMeanSquareVehicleCurvaturePerMeter, double totalAbsoluteCurvatureVariationPerMeter, double curvatureVariationEnergy, double minimumBodyClearanceMeters) { Path = CopyReadOnly(path); Segments = CopyReadOnly(segments); PathLengthMeters = pathLengthMeters; MaximumAbsoluteVehicleCurvaturePerMeter = maximumAbsoluteVehicleCurvaturePerMeter; MaximumAbsoluteVehicleCurvatureDerivativePerSquareMeter = maximumAbsoluteVehicleCurvatureDerivativePerSquareMeter; RootMeanSquareVehicleCurvaturePerMeter = rootMeanSquareVehicleCurvaturePerMeter; TotalAbsoluteCurvatureVariationPerMeter = totalAbsoluteCurvatureVariationPerMeter; CurvatureVariationEnergy = curvatureVariationEnergy; MinimumBodyClearanceMeters = minimumBodyClearanceMeters; } /// 完成几何重计算的不可变路径。 public IReadOnlyList Path { get; } /// 完整覆盖 的不可变方向段。 public IReadOnlyList Segments { get; } /// 路径总长度,单位 m。 public double PathLengthMeters { get; } /// 车辆曲率绝对值峰值,单位 1/m。 public double MaximumAbsoluteVehicleCurvaturePerMeter { get; } /// 车辆曲率导数绝对值峰值,单位 1/m²。 public double MaximumAbsoluteVehicleCurvatureDerivativePerSquareMeter { get; } /// 车辆曲率均方根,单位 1/m。 public double RootMeanSquareVehicleCurvaturePerMeter { get; } /// 不跨换向点累计的绝对曲率变化,单位 1/m。 public double TotalAbsoluteCurvatureVariationPerMeter { get; } /// 不跨换向点累计的曲率变化代价。 public double CurvatureVariationEnergy { get; } /// 曲率变化代价的面向用户名称;保留 以兼容既有调用方。 public double CurvatureVariationCost => CurvatureVariationEnergy; /// 输入点携带的最小保守净空,单位 m。 public double MinimumBodyClearanceMeters { get; } private static IReadOnlyList CopyReadOnly(IReadOnlyList source) { var copy = new List(source == null ? 0 : source.Count); if (source != null) { for (int index = 0; index < source.Count; index++) copy.Add(source[index]); } return new ReadOnlyCollection(copy); } }