feat: 发布 EM 轨迹规划首个版本
This commit is contained in:
@@ -58,6 +58,12 @@ public sealed class EmPlanningCoordinator
|
||||
/// <param name="cancellationToken">调用方取消令牌;会与本周期内部令牌链接。</param>
|
||||
/// <returns>完成后给出不可变 <see cref="PlanningCycleResult"/>;只有版本和身份仍当前且结果成功完整时其 <c>Published</c> 为 <see langword="true"/>。</returns>
|
||||
public Task<PlanningCycleResult> PlanLatestAsync(PlanningCycleInput input, CancellationToken cancellationToken)
|
||||
{
|
||||
return PlanLatestAsync(input, cancellationToken, null);
|
||||
}
|
||||
|
||||
internal Task<PlanningCycleResult> PlanLatestAsync(PlanningCycleInput input,
|
||||
CancellationToken cancellationToken, Action<EmTrajectory> publicationCommit)
|
||||
{
|
||||
if (input == null)
|
||||
throw new ArgumentNullException(nameof(input));
|
||||
@@ -75,7 +81,8 @@ public sealed class EmPlanningCoordinator
|
||||
replanPeriodSeconds = input.ReplanPeriodSeconds;
|
||||
}
|
||||
|
||||
return Task.Run(() => CompleteCycle(version, input, cycleCancellation));
|
||||
return Task.Run(() => CompleteCycle(version, input, cycleCancellation, cancellationToken,
|
||||
publicationCommit));
|
||||
}
|
||||
|
||||
/// <summary>从协调器当前已发布的不可变轨迹构建下一周期的安全交接决策。</summary>
|
||||
@@ -100,7 +107,8 @@ public sealed class EmPlanningCoordinator
|
||||
/// <param name="cycleCancellation">本周期与调用方取消状态链接的令牌源。</param>
|
||||
/// <returns>包含原始或 Superseded 规划结果、发布标记和观察器诊断的周期记录。</returns>
|
||||
private PlanningCycleResult CompleteCycle(long version, PlanningCycleInput input,
|
||||
CancellationTokenSource cycleCancellation)
|
||||
CancellationTokenSource cycleCancellation, CancellationToken callerCancellationToken,
|
||||
Action<EmTrajectory> publicationCommit)
|
||||
{
|
||||
EmPlanningResult planned;
|
||||
try
|
||||
@@ -130,11 +138,57 @@ public sealed class EmPlanningCoordinator
|
||||
}
|
||||
else
|
||||
{
|
||||
bool publishable = (planned.Status == EmPlanningStatus.Success || planned.Status == EmPlanningStatus.SuccessWithFallback) &&
|
||||
planned.Trajectory != null;
|
||||
bool publishable = (planned.Status == EmPlanningStatus.Success ||
|
||||
planned.Status == EmPlanningStatus.SuccessWithFallback) && planned.Trajectory != null;
|
||||
if (publishable)
|
||||
publishedTrajectory = planned.Trajectory;
|
||||
result = new PlanningCycleResult(version, input.Identity, planned, publishable, planned.FailureReason);
|
||||
{
|
||||
EmPlanningPublicationDecision decision = input.Request.TryAuthorizePublication(
|
||||
callerCancellationToken, () =>
|
||||
{
|
||||
publicationCommit?.Invoke(planned.Trajectory);
|
||||
publishedTrajectory = planned.Trajectory;
|
||||
});
|
||||
if (decision == EmPlanningPublicationDecision.CallerCancelled)
|
||||
{
|
||||
var cancelled = new EmPlanningResult(EmPlanningStatus.Cancelled, null,
|
||||
"callerCancellation=true;phase=publication");
|
||||
result = new PlanningCycleResult(version, input.Identity, cancelled, false,
|
||||
cancelled.FailureReason);
|
||||
}
|
||||
else if (decision == EmPlanningPublicationDecision.DeadlineExpired)
|
||||
{
|
||||
var expired = new EmPlanningResult(EmPlanningStatus.CycleDeadlineExpired, null,
|
||||
"cycleDeadlineExpired=true;phase=publication;remainingMs=0.000");
|
||||
result = new PlanningCycleResult(version, input.Identity, expired, false,
|
||||
expired.FailureReason);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = new PlanningCycleResult(version, input.Identity, planned, true,
|
||||
planned.FailureReason);
|
||||
}
|
||||
}
|
||||
else if (input.Request.CallerCancellationToken.IsCancellationRequested ||
|
||||
callerCancellationToken.IsCancellationRequested)
|
||||
{
|
||||
var cancelled = new EmPlanningResult(EmPlanningStatus.Cancelled, null,
|
||||
"callerCancellation=true;phase=publication");
|
||||
result = new PlanningCycleResult(version, input.Identity, cancelled, false,
|
||||
cancelled.FailureReason);
|
||||
}
|
||||
else if (input.Request.CycleDeadlineToken.IsCancellationRequested ||
|
||||
input.Request.IsCycleDeadlineExpired())
|
||||
{
|
||||
var expired = new EmPlanningResult(EmPlanningStatus.CycleDeadlineExpired, null,
|
||||
"cycleDeadlineExpired=true;phase=publication;remainingMs=0.000");
|
||||
result = new PlanningCycleResult(version, input.Identity, expired, false,
|
||||
expired.FailureReason);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = new PlanningCycleResult(version, input.Identity, planned, false,
|
||||
planned.FailureReason);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user