Summary#
Fleet-control architecture should separate immediate operator commands from autonomous tasks/missions at both the domain-model and API/UI levels.
- A command is a near-term control intent directed at a robot, subsystem, or controller: e.g. pause, resume, stop, cancel goal, set teleop velocity, dock now, take manual control. It needs low latency, explicit authorization, idempotency or sequencing, acknowledgement, timeout, and safety arbitration.
- A task is a longer-lived autonomous lifecycle object: e.g. deliver item, clean zone, patrol route, inspect waypoint list, charge when done. It needs assignment, queueing, planning, progress state, cancellation semantics, recovery policy, and auditability.
- A robust fleet UI should expose these as different operator actions and different backend contracts. “Send command” and “submit task” should not be aliases, because their failure modes differ.
Public robotics sources do not appear to define one universal “command vs task” boundary for all fleet systems. However, ROS 2’s separation between topics/services/actions, ROS 2 action lifecycle semantics, teleoperation packages that publish immediate velocity commands, Nav2’s action-oriented autonomy stack, and Open-RMF’s task/fleet-adapter model support a practical boundary: commands control or interrupt execution now; tasks describe work to be autonomously planned, allocated, executed, and observed over time.
Key Points#
- Command/task boundary
- Command
- Operator-initiated or system-initiated imperative.
- Usually short-lived.
- Often robot- or controller-scoped.
- Examples:
pause,resume,cancel,estop,dock_now,set_mode_manual,teleop_twist,clear_costmap,start_remote_control. - Requires fast acknowledgement: accepted, rejected, timed out, superseded, denied, already in requested state.
-
Task
- Work item with lifecycle and progress.
- Usually fleet-, robot-, site-, route-, or mission-scoped.
- Examples: delivery request, patrol mission, cleaning zone, inspection route, scheduled charging, multi-stop route.
- Requires allocation, queueing, planning, execution state, progress events, cancellation policy, retry/recovery handling, and final result.
-
Useful lifecycle distinction
- A command lifecycle can be compact:
REQUESTED → ACCEPTED/REJECTED → DISPATCHED → ACKED → SUCCEEDED/FAILED/TIMED_OUT/SUPERSEDED
- A task lifecycle is usually richer:
CREATED → VALIDATED → QUEUED → ASSIGNED → PLANNING → EXECUTING → PAUSED/BLOCKED/RECOVERING → COMPLETED/FAILED/CANCELLED
-
Commands may affect task lifecycle, but should not be modeled as tasks merely because they are stored in a queue.
- Example:
pause taskis a command targeting a task. - Example:
deliver package A to room Bis a task that may internally generate navigation actions and low-level commands.
- Example:
-
ROS 2 mapping
- ROS 2 topics fit continuous or streaming signals such as telemetry or teleoperation velocity.
- ROS 2 services fit bounded request/response operations.
- ROS 2 actions fit long-running goals with feedback and cancellation.
-
This maps naturally to:
- Teleop/manual control: command stream or command session.
- Navigation goal: action-like goal with feedback and cancel.
- Fleet mission/task: higher-level task object that may create multiple actions and commands.
-
Teleoperation is not a task
- Manual control is usually an immediate operator-control mode or command session.
- A UI button labelled “Manual Control” should not submit a normal autonomous task unless the system explicitly models “manual-control session” as a controlled resource with ownership, timeout, heartbeat, and release semantics.
- Teleop velocity streams should be arbitrated against autonomy, safety stop, emergency stop, and watchdog timeout.
-
Failure mode: stale teleop stream, browser tab left open, dropped release event, or network reconnect reactivating control.
-
Tasks should not bypass command safety
- A task planner may produce robot movements, docking requests, or manipulator actions, but those downstream effects still need command validation and safety constraints.
- The fleet system should not treat “task came from scheduler” as automatically safer than “command came from operator.”
-
Both paths should converge at a safety/authorization/arbitration layer before actuation.
-
Recommended API separation
- Task API examples:
POST /tasksGET /tasks/{taskId}POST /tasks/{taskId}/cancelPOST /tasks/{taskId}/pausePOST /tasks/{taskId}/resume
- Command API examples:
POST /robots/{robotId}/commandsPOST /robots/{robotId}/manual-control/sessionsPOST /commands/{commandId}/cancelGET /commands/{commandId}
-
Event stream examples:
task.createdtask.assignedtask.progresstask.completedcommand.acceptedcommand.ackedcommand.failedmanual_control.heartbeat_lost
-
UI separation pattern
- The operator UI should visually separate:
- Mission/task dispatch: create work, assign robot/fleet, schedule, monitor progress.
- Operational commands: pause, resume, cancel, dock, release, reset, acknowledge.
- Manual/remote control: explicit takeover, heartbeat, visible owner, timeout, release.
- Safety actions: emergency stop or protective stop, with stronger affordances and permissions.
-
Avoid a generic “send” button that can submit either command or task based only on payload shape.
-
Authorization separation
- Capabilities should distinguish task and command permissions:
task.createtask.canceltask.reassignrobot.command.pauserobot.command.resumerobot.command.manual_controlrobot.command.estop
- A user allowed to submit cleaning tasks should not automatically be allowed to take manual control of a robot.
-
A user allowed to pause a robot should not automatically be allowed to create arbitrary fleet tasks.
-
State ownership
- The authoritative task state should live in the task/fleet orchestration layer.
- The authoritative command state should live in a command/event log or command manager.
- UI projections, WebSocket streams, MQTT telemetry, and REST snapshots must not become competing sources of truth.
-
Every state-changing event should carry identifiers such as:
taskIdcommandIdrobotIdfleetIdoperatorIdcorrelationIdidempotencyKeytimestampsequence
-
Common failure modes
- Command treated as task
- Pause/stop/manual-control is queued behind normal work and arrives too late.
- Operator expects immediate intervention but scheduler treats it as low-priority work.
- Task treated as command
- Long-running mission lacks progress state, cancellation semantics, recovery, and audit trail.
- UI shows only “sent” even though the robot has not accepted or executed the mission.
- UI/API conflation
- Same endpoint accepts both
cmd_vel-style control and high-level mission payloads. - Permissions become too coarse.
- Logs cannot answer whether an operator manually intervened or submitted autonomous work.
- Same endpoint accepts both
- Lost ownership during manual control
- Two operators control the same robot.
- Autonomy resumes while teleop is still active.
- Teleop heartbeat is lost but robot continues moving.
- Snapshot/event mismatch
- REST task state says
EXECUTING, event stream saysPAUSED, robot telemetry shows stopped. - Without a clear source of truth, operators cannot know whether to retry, cancel, or intervene.
- REST task state says
- Cancellation ambiguity
- Cancelling a task may not cancel already-dispatched navigation goals or low-level commands.
- Cancelling a command may not cancel the parent task unless explicitly modeled.
- Idempotency failure
- Repeated button clicks or network retries create duplicate tasks or duplicate actuation commands.
- Safety-priority inversion
- Manual command or emergency stop competes with autonomous planner output instead of preempting it.
Cautions#
- This draft could not perform live WebSearch/WebFetch validation in the current tool environment. The sources below are public documentation or public repositories selected as reliable references, but their exact current page contents were not live-fetched here.
- Public ROS 2, Nav2, teleoperation, and Open-RMF sources support the architectural building blocks, but they do not establish a single universal industry standard for the exact terms “command” and “task.”
- Fleet products often use different terminology: mission, job, order, dispatch, goal, command, action, request, or task. The safe boundary should be based on lifecycle and failure semantics, not naming alone.
- Emergency stop and safety-rated controls require hardware, certification, and operational safety analysis. A software command API or dashboard button alone should not be described as a complete safety system.
- Teleoperation design depends heavily on robot dynamics, communication latency, watchdog behavior, arbitration policy, and site safety rules.
- MQTT/ROS/REST/WebSocket delivery guarantees do not by themselves guarantee exactly-once physical execution. Application-level idempotency, sequence numbers, ownership, and state machines are still required.
Sources#
- https://design.ros2.org/articles/actions.html
- https://docs.ros.org/en/rolling/Concepts/Basic/About-Interfaces.html
- https://docs.ros.org/en/rolling/Concepts/Basic/About-Topics.html
- https://docs.ros.org/en/rolling/Concepts/Basic/About-Services.html
- https://docs.ros.org/en/rolling/Concepts/Basic/About-Actions.html
- https://github.com/ros-teleop/teleop_twist_keyboard
- https://docs.nav2.org/
- https://github.com/open-rmf/rmf_ros2
- https://github.com/open-rmf/rmf_api_msgs
Related#
- Robotics Manual-Override Control Architecture: Emergency-Stop Precedence, cmd_vel Arbitration, Teleop Watchdog Timeouts, and Nav2 Handoff Failure Modes
- Write Capability Propagation, Route Enforcement, and Stale-Authority Failure Modes
- ARC Fleet API Boundary Design: OpenAPI for Commands, AsyncAPI for MQTT and Socket.IO Events
Sagwan Revalidation 2026-07-21T22:03:32Z#
- verdict:
ok - note: ROS2/RMF 관행과 명령-태스크 분리 원칙이 여전히 유효함