Module reference · Downlink
Operator-side Assistance (downlink)
The optional feedback-side attachment point. It uses required reconstructed information and declared local dependencies, then publishes assistance output that Operator Presentation combines with reconstructed feedback.
What
Operator-side Assistance produces prediction, state estimation, filtering, warnings, or visualisations from declared inputs. Remote information comes through Operator-side State Reconstruction; local command history can also drive assistance without any new remote observation.
It does not apply delay or update the authoritative robot. Base reconstructed feedback reaches presentation independently. A technique that replaces or hides that feedback must define how its presentation implementation uses the assistance output.
Why
The same delayed feedback can support different operator-side techniques. A baseline can show only the delayed video, while another condition can add a command timeline, a predicted path, or an uncertainty envelope. Keeping that choice in one module lets a study vary the assistance technique while holding the vehicle, task, observation streams, and communication conditions fixed.
The paper's demonstration uses this as the experimental factor. The Every Move You Make reconstruction has four scenes: Baseline, Network, Path, and Envelope. They share the same apparatus and differ only in the selected Operator-side Assistance (downlink) implementation.
How
The Kernel queues explicitly reconstructed results before calling ProcessPackage, then calls UpdateAssistance once per tick. A technique consumes only the reconstructed contracts it needs. It may publish output from local dependencies even when no reconstruction result arrived.
- Input. Required reconstructed information and declared dependencies, such as command history, vehicle configuration, route information, communication delay, or a reconstructed map.
- Output. Study-defined assistance packages on declared streams. Base feedback need not be forwarded.
- Timing. Assistance runs after reconstruction and before presentation in the same kernel cycle.
Boundary
Owns
- Consuming required reconstructed information after module 5.9, and declared local dependencies.
- Computing study-defined assistance output; presentation defines any replacement or suppression of base feedback.
- Publishing assistance that Operator Presentation combines with reconstructed feedback.
Does not own
- Applying communication delay, ordering, or release rules — Downlink Communication's job.
- Reconstructing the operator-side remote state — Operator-side State Reconstruction's job.
- Updating authoritative robot state or calculating the assistance technique in the presentation layer.
Contract
Implementations inherit the package queue and publish through PackageProduced. The base class rejects input whose payload is not a ReconstructedFeedbackContract, calls ProcessPackage for reconstructed results, and then calls UpdateAssistance.
using System;
using System.Collections.Generic;
using Unite.Core;
using UnityEngine;
namespace Unite.Kernel
{
/// <summary>
/// Optional operator-side attachment point after operator-side state
/// reconstruction and before feedback presentation. Reconstruction also
/// feeds presentation directly; assistance need not forward base feedback.
/// </summary>
public abstract class DownlinkOperatorSideAssistanceModule
: TeleroboticsModule, IPackageSource, IPackageConsumer
{
private readonly Queue<Package> pendingPackages = new Queue<Package>();
public event Action<Package> PackageProduced;
internal sealed override int ExecutionOrder => 900;
public void ReceivePackage(Package package)
{
if (package == null || !(package.Payload is ReconstructedFeedbackContract))
{
Debug.LogError(
$"{GetType().Name} requires a reconstructed feedback package.", this);
return;
}
pendingPackages.Enqueue(package);
}
internal sealed override void Step(double timestampSeconds)
{
while (pendingPackages.Count > 0)
{
ProcessPackage(pendingPackages.Dequeue(), timestampSeconds);
}
UpdateAssistance(timestampSeconds);
}
/// <summary>
/// Publishes one feedback package to the downstream presentation stage.
/// </summary>
protected void PublishPackage(Package package)
{
if (package == null)
{
Debug.LogError($"{GetType().Name} tried to publish a null package.", this);
return;
}
PackageProduced?.Invoke(package);
}
/// <summary>
/// Processes one reconstructed result when needed by the technique.
/// Output supplements the independent reconstruction-to-presentation
/// path. Replacing or hiding base feedback requires a study-defined
/// presentation contract; omitting output does not suppress that path.
/// </summary>
protected abstract void ProcessPackage(
Package package,
double timestampSeconds);
/// <summary>
/// Allows assistance implementations to publish locally computed output
/// from declared dependencies even when no downlink package was released
/// during this tick.
/// </summary>
protected virtual void UpdateAssistance(double timestampSeconds)
{
}
}
}- Call
PublishPackagefor assistance output; there is no need to forward the base feedback. - Publish a new
Packagewhen the assistance output is supplementary or transformed. - Preserve the source observation metadata for derived outputs and use a declared assistance stream. Producing no output does not hide independently reconstructed feedback.
- Do not modify the vehicle or the authoritative remote state from this module.
Examples
The four conditions keep communication, vehicle, task, and observation settings fixed while changing the presentation assistance.
Input: no reconstructed information is needed. Output: none. Presentation still shows the video supplied directly by reconstruction.
public abstract class EveryMoveAssistanceBase : DownlinkOperatorSideAssistanceModule
{
protected override void ProcessPackage(
Package package,
double timestamp)
{
// No assistance output; reconstruction supplies the base video.
}
}
[EveryMoveCondition("condition-baseline")]
public sealed partial class NoAssistance
: EveryMoveAssistanceBase
{
}Input: mapped commands and the uplink queue. Output: a NetworkTimelinePackage describing when each command is expected to complete. It does not predict the robot path.
[EveryMoveCondition("condition-network")]
public sealed partial class CommandTimelineAssistance
: CommandTimelineAssistanceBase
{
// The shared base converts mapped commands into
// NetworkTimelinePackage feedback.
}Input: a ReconstructedMotionState from 5.9, the vehicle configuration, and commands released or still queued after its sample time. Image pixels and received video packages are not needed. Output: a predicted centre path and wheel-offset paths.
[EveryMoveCondition("condition-path")]
public sealed partial class IdealTrajectoryAssistance
: TrajectoryAssistanceBase
{
protected override object BuildOverlayPayload(
ReconstructedMotionState state,
PredictedPose[] centre)
{
PredictedPose[] left = Offset(
centre, -vehicleConfiguration.wheelbase * .5f);
PredictedPose[] right = Offset(
centre, vehicleConfiguration.wheelbase * .5f);
return new PathAssistancePackage(centre, left, right);
}
}Input: the same delayed captured state and command history as Path, plus the configured disturbance parameters. Output: the centre path, widened side boundaries, and end-cap trajectories that form the uncertainty envelope.
[EveryMoveCondition("condition-envelope")]
public sealed partial class WorstCaseEnvelopeAssistance
: TrajectoryAssistanceBase
{
protected override object BuildOverlayPayload(
ReconstructedMotionState state,
PredictedPose[] centre)
{
float uncertainty = Mathf.Clamp01(
vehicleConfiguration.wheelSlipFactor *
vehicleConfiguration.terrainRoughness +
vehicleConfiguration.motorResponseVariation +
vehicleConfiguration.wheelRadiusVariation +
vehicleConfiguration.encoderNoise +
vehicleConfiguration.vibrationIntensity);
float offset = vehicleConfiguration.wheelbase * .5f;
PredictedPose[] left = Integrate(
state, 1f - uncertainty, 1f, -offset);
PredictedPose[] right = Integrate(
state, 1f, 1f - uncertainty, offset);
return new EnvelopeAssistancePackage(
centre, left, right,
Integrate(state, 1f - uncertainty * .5f, 1f, 0f),
Integrate(state, 1f, 1f - uncertainty * .5f, 0f));
}
}Config
- Implement
DownlinkOperatorSideAssistanceModulein the study's Runtime assembly. - Attach one selected implementation to the
TeleroboticsAgent; the module connects to the configured downlink feedback path. - Declare and wire only the dependencies the technique needs. The demo's trajectory assistance uses the uplink queue, vehicle configuration, communication configuration, and the copied motion state published by reconstruction, aligned to the reconstructed video exposure.
- Configure the selected assistance component in the Inspector for the study condition.
Baseline needs no assistance output. Leave the module unassigned when a study has no downlink assistance. In the shipped demonstration, the explicit NoAssistance class is used so the generated baseline scene has the same wiring shape as the other conditions.