using System; using MyParking.Shared; namespace MultiWheelC.Trajectory { /// /// 描述按弧长参数化的车体中心参考轨迹点,统一使用SI单位。 /// public readonly struct TrajectoryPoint { /// /// 创建包含中心位姿、曲率和速度信息的参考轨迹点。 /// public TrajectoryPoint( double arcLengthMeters, Pose2D poseInWorld, double curvaturePerMeter, double referenceSpeedMetersPerSecond) { EnsureFiniteNonNegative( arcLengthMeters, nameof(arcLengthMeters)); EnsureFinite( poseInWorld.XMeters, nameof(poseInWorld)); EnsureFinite( poseInWorld.YMeters, nameof(poseInWorld)); EnsureFinite( poseInWorld.YawRadians, nameof(poseInWorld)); EnsureFinite( curvaturePerMeter, nameof(curvaturePerMeter)); EnsureFinite( referenceSpeedMetersPerSecond, nameof(referenceSpeedMetersPerSecond)); ArcLengthMeters = arcLengthMeters; PoseInWorld = new Pose2D( poseInWorld.XMeters, poseInWorld.YMeters, AngleMath.NormalizeRadians( poseInWorld.YawRadians)); CurvaturePerMeter = curvaturePerMeter; ReferenceSpeedMetersPerSecond = referenceSpeedMetersPerSecond; } /// /// 获取从轨迹起点累计到当前点的弧长,单位为m。 /// public double ArcLengthMeters { get; } /// /// 获取车体中心参考坐标系在世界坐标系中的位姿。 /// public Pose2D PoseInWorld { get; } /// /// 获取车体中心参考轨迹曲率,单位为1/m,左转为正。 /// public double CurvaturePerMeter { get; } /// /// 获取沿轨迹切线方向的有符号参考速度,单位为m/s。 /// public double ReferenceSpeedMetersPerSecond { get; } /// /// 检查数值是否为有限值。 /// private static void EnsureFinite( double value, string parameterName) { if (double.IsNaN(value) || double.IsInfinity(value)) { throw new ArgumentOutOfRangeException( parameterName, "轨迹点参数必须是有限值。"); } } /// /// 检查数值是否为非负有限值。 /// private static void EnsureFiniteNonNegative( double value, string parameterName) { EnsureFinite(value, parameterName); if (value < 0.0) { throw new ArgumentOutOfRangeException( parameterName, "轨迹累计弧长不能为负数。"); } } } }