using System;
namespace MultiWheelC.Control.Abstractions
{
///
/// 表示横向控制器生成的前、后GCP目标转角,单位为rad,逆时针为正。
///
public readonly struct LateralControlCommand
{
///
/// 创建前、后GCP目标转角命令。
///
public LateralControlCommand(
double frontGcpAngleRadians,
double rearGcpAngleRadians)
{
EnsureFinite(
frontGcpAngleRadians,
nameof(frontGcpAngleRadians));
EnsureFinite(
rearGcpAngleRadians,
nameof(rearGcpAngleRadians));
FrontGcpAngleRadians =
frontGcpAngleRadians;
RearGcpAngleRadians =
rearGcpAngleRadians;
}
///
/// 获取前GCP目标转角,单位为rad,逆时针为正。
///
public double FrontGcpAngleRadians { get; }
///
/// 获取后GCP目标转角,单位为rad,逆时针为正。
///
public double RearGcpAngleRadians { get; }
///
/// 获取前后GCP的共同转角分量,主要用于横向平移修正。
///
public double CommonAngleRadians =>
(FrontGcpAngleRadians +
RearGcpAngleRadians) / 2.0;
///
/// 获取前后GCP的差动转角分量,主要用于曲率前馈和航向修正。
///
public double DifferentialAngleRadians =>
(FrontGcpAngleRadians -
RearGcpAngleRadians) / 2.0;
///
/// 创建前后GCP均保持车头方向的直线命令。
///
public static LateralControlCommand Straight =>
new LateralControlCommand(0.0, 0.0);
///
/// 检查GCP目标转角是否为有限值。
///
private static void EnsureFinite(
double value,
string parameterName)
{
if (double.IsNaN(value) ||
double.IsInfinity(value))
{
throw new ArgumentOutOfRangeException(
parameterName,
"GCP目标转角必须是有限值。");
}
}
}
}