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,
"轨迹累计弧长不能为负数。");
}
}
}
}