142 lines
4.6 KiB
C#
142 lines
4.6 KiB
C#
// 四舵轮共同搬运协议
|
|
|
|
namespace MyParking.Shared
|
|
{
|
|
/// <summary>定义车队无线协议的公共常量。</summary>
|
|
public static class FleetProtocol
|
|
{
|
|
public const int CurrentVersion = 1;
|
|
public const int BroadcastVehicleId = 0;
|
|
public const long NoActivePlanId = 0;
|
|
public const long NoAppliedCommandSequence = 0;
|
|
}
|
|
|
|
/// <summary>表示成员车本地的车队任务执行阶段。</summary>
|
|
public enum FleetMemberState
|
|
{
|
|
Idle = 0,
|
|
Preparing = 1,
|
|
Ready = 2,
|
|
Active = 3,
|
|
Faulted = 4
|
|
}
|
|
|
|
/// <summary>表示主车要求成员执行的动作。</summary>
|
|
public enum FleetCommandKind
|
|
{
|
|
PrepareRolling = 1,
|
|
PrepareSpin = 2,
|
|
Activate = 3,
|
|
Motion = 4,
|
|
Stop = 5
|
|
}
|
|
|
|
/// <summary>成员车周期上报给主车的状态快照,同时承担心跳和命令确认。</summary>
|
|
public readonly struct FleetMemberReport
|
|
{
|
|
public FleetMemberReport(
|
|
int vehicleId,
|
|
long planId,
|
|
long sequenceNumber,
|
|
double sampleTimestampSeconds,
|
|
Pose2D poseInCommonWorld,
|
|
Twist2D twistAtVehicleOriginInCommonWorld,
|
|
bool isStateAvailable,
|
|
bool hasValidVelocityEstimate,
|
|
FleetMemberState state,
|
|
long lastAppliedCommandSequence,
|
|
int failureCode = 0)
|
|
{
|
|
VehicleId = vehicleId;
|
|
PlanId = planId;
|
|
SequenceNumber = sequenceNumber;
|
|
SampleTimestampSeconds = sampleTimestampSeconds;
|
|
PoseInCommonWorld = poseInCommonWorld;
|
|
TwistAtVehicleOriginInCommonWorld =
|
|
twistAtVehicleOriginInCommonWorld;
|
|
IsStateAvailable = isStateAvailable;
|
|
HasValidVelocityEstimate =
|
|
hasValidVelocityEstimate;
|
|
State = state;
|
|
LastAppliedCommandSequence =
|
|
lastAppliedCommandSequence;
|
|
FailureCode = failureCode;
|
|
}
|
|
|
|
public int VehicleId { get; }
|
|
|
|
// 零表示车辆当前不属于活动任务。
|
|
public long PlanId { get; }
|
|
|
|
// 本车上报流中单调递增,用于丢弃乱序旧报文。
|
|
public long SequenceNumber { get; }
|
|
|
|
// 本车单调时钟的采样时刻,通信层负责换算到主车时间轴。
|
|
public double SampleTimestampSeconds { get; }
|
|
|
|
// 位姿必须已经转换到所有成员约定一致的公共世界坐标系。
|
|
public Pose2D PoseInCommonWorld { get; }
|
|
|
|
public Twist2D TwistAtVehicleOriginInCommonWorld { get; }
|
|
|
|
public bool IsStateAvailable { get; }
|
|
|
|
public bool HasValidVelocityEstimate { get; }
|
|
|
|
public FleetMemberState State { get; }
|
|
|
|
// 零表示尚未执行任何主车命令。
|
|
public long LastAppliedCommandSequence { get; }
|
|
|
|
// 零表示没有结构化故障码。
|
|
public int FailureCode { get; }
|
|
}
|
|
|
|
/// <summary>主车向指定成员或全队下发的一条车队任务命令。</summary>
|
|
public readonly struct FleetCommand
|
|
{
|
|
public FleetCommand(
|
|
long planId,
|
|
long sequenceNumber,
|
|
int targetVehicleId,
|
|
FleetCommandKind kind,
|
|
double motionDirectionInBodyRadians,
|
|
Twist2D twistInVehicleBody,
|
|
double validForSeconds,
|
|
int reasonCode = 0)
|
|
{
|
|
PlanId = planId;
|
|
SequenceNumber = sequenceNumber;
|
|
TargetVehicleId = targetVehicleId;
|
|
Kind = kind;
|
|
MotionDirectionInBodyRadians =
|
|
motionDirectionInBodyRadians;
|
|
TwistInVehicleBody = twistInVehicleBody;
|
|
ValidForSeconds = validForSeconds;
|
|
ReasonCode = reasonCode;
|
|
}
|
|
|
|
public long PlanId { get; }
|
|
|
|
// 主车命令流中单调递增,成员据此拒绝乱序旧命令。
|
|
public long SequenceNumber { get; }
|
|
|
|
// 零表示广播,正数表示指定成员车。
|
|
public int TargetVehicleId { get; }
|
|
|
|
public FleetCommandKind Kind { get; }
|
|
|
|
// 仅PrepareRolling使用,单位rad,车体系X轴到运动X轴逆时针为正。
|
|
public double MotionDirectionInBodyRadians { get; }
|
|
|
|
// 仅Motion使用,采用目标成员车体系。
|
|
public Twist2D TwistInVehicleBody { get; }
|
|
|
|
// 从成员本机收到消息时开始计时,超时后必须停车。
|
|
public double ValidForSeconds { get; }
|
|
|
|
// 零表示没有结构化停止或故障原因。
|
|
public int ReasonCode { get; }
|
|
}
|
|
}
|