Files
ParkingRobot/MultiWheelC/Fleet/FleetState.cs
T

65 lines
2.3 KiB
C#

using MyParking.Shared;
namespace MultiWheelC.Fleet
{
// 一次经过校验的虚拟车队原点状态快照。
public readonly struct FleetState
{
public FleetState(
double sampleTimestampSeconds,
Pose2D fleetPoseInWorld,
Twist2D twistAtFleetOriginInWorld,
bool hasValidVelocityEstimate)
{
NumericGuard.EnsureFiniteNonNegative(
sampleTimestampSeconds,
nameof(sampleTimestampSeconds));
NumericGuard.EnsureFinite(
fleetPoseInWorld,
nameof(fleetPoseInWorld));
NumericGuard.EnsureFinite(
twistAtFleetOriginInWorld,
nameof(twistAtFleetOriginInWorld));
SampleTimestampSeconds =
sampleTimestampSeconds;
FleetPoseInWorld = new Pose2D(
fleetPoseInWorld.XMeters,
fleetPoseInWorld.YMeters,
AngleMath.NormalizeRadians(
fleetPoseInWorld.YawRadians));
HasValidVelocityEstimate =
hasValidVelocityEstimate;
// 位姿有效但速度尚未初始化时显式置零,避免控制器误用输入值。
TwistAtFleetOriginInWorld =
hasValidVelocityEstimate
? twistAtFleetOriginInWorld
: Twist2D.Zero;
var worldPoseInFleet =
FrameTransform2D.Inverse(
FleetPoseInWorld);
TwistAtFleetOriginInFleet =
FrameTransform2D.TransformTwistAtSamePoint(
worldPoseInFleet,
TwistAtFleetOriginInWorld);
}
// 状态源单调时钟中的采样时刻,单位为s。
public double SampleTimestampSeconds { get; }
// 车队坐标系原点在世界坐标系中的实际位姿。
public Pose2D FleetPoseInWorld { get; }
// 车队原点处的实际刚体速度,在世界坐标系中表达。
public Twist2D TwistAtFleetOriginInWorld { get; }
// 同一刚体速度在车队坐标系中表达,供车队控制器使用。
public Twist2D TwistAtFleetOriginInFleet { get; }
// 速度是否已经初始化并可用于闭环控制。
public bool HasValidVelocityEstimate { get; }
}
}