Skip to main content

ISO 21423 coverage

How much of ISO/FDIS 21423 OpenRobOps implements today, what is still missing, and where it deliberately goes beyond the standard. Two layers are covered separately, because they have different scopes:

  • SDK@openrobops/iso21423, the TypeScript implementation of the wire standard (topics, schemas, session, request state machine). Usable by any IMR or IMRFM.
  • ORO fleet manager — ORO ingest's IsoRobotsModule, the IMRFM built on the SDK (setup guide). It only needs the subset of the standard a fleet manager consumes.

The ISO Upstream direction (ORO presenting its own fleet as IMRs to another fleet manager) is not implemented yet — only a settings flag and shared groundwork (CCS conversion, deterministic entity UUIDs) exist.

Legend: ✅ implemented · 🌗 partial · ❌ not implemented · — not applicable to that layer.

Clause by clause

ClauseSDKORO fleet managerNotes
4 Common coordinate system (CCS)🌗SDK has the CCS/reference/location-point types and a least-squares rigid-transform fit (Annex D), but no CCS transport — the standard defines none either. ORO calibrates from iso21423.ccs.referencePoints (≥ 3 pairs, as Clause 4 requires) and converts poses, paths and goals both ways.
5 IMR identity and capability🌗SDK: full Table 4 typing, schema validation, provides/accepts/manages/managedBy, identity discovery catalogue. ORO uses identity for admission and reads imrFootprint + imrHeight; model, serial, rated speed/load, charger types, vendor contact, thumbnail, etc. are ignored.
6 IMR location and status🌗SDK: all 32 Table 5 operating states + modes (open vocabulary preserved), odometry, battery, trajectories. ORO maps only online/offline (OFFLINE, LOST_CONNECTION); the other states are not surfaced. Battery health, temperature and current are ignored.
7 IMRFM identity and capabilityORO publishes an IMRFM identity with details.softwareVersions (ingest's own version plus robots.softwareVersions from settings); manages: [] is deliberate — ISO robots are self-managed, ORO never publishes on their behalf.
8 IMRFM stateORO does not publish READY / NOT_READY / OFFLINE; liveness is only the Last Will.
9 Request messages🌗SDK: envelope, details, status, Figures C.3/C.4 state machines, all five C.2.2 concurrency strategies, capability enforcement on send. ORO sends requests (below) but advertises accepts: [] and serves none.
10 Messaging protocol and formatsMQTT 3.1.1 with persistent session, keep-alive 60 s, B.4 Last Will on disconnection (QoS 1, retained), JSON per Annex A. Streaming rate bounds of Table B.1 enforced by a latest-wins gate.
Annex A JSON schema🌗Every object in the SDK schema except ccs, referencePoint and entityFootprintHeight. Ingress normalisation for known FDIS inconsistencies (comma timestamps, id vs entityId).
Annex B topicsRoot namespace /ISO_21423/v1, +/+/identity discovery, request/status topics always include <entityType>.
B.5.2.4 Managed entities (IMRFM publishes for robots)FleetGateway in the SDK; ORO does not use it (decision: robots publish their own resources).
Security (10.1, IEC 62443/27001 "should")🌗SDK: username/password + TLS options, identity self-check probe. ORO adds a concrete model: two-gate onboarding (admission + credentials), per-robot broker credentials and ACLs scoped to the robot's own topic tree.

Resources (Table B.1)

ResourceSDKORO ingestsORO maps it to
identity🌗Admission check, name/hostname, footprint (imrFootprint, imrHeight)
status🌗agentOnline only
batteryStatus🌗batteryPercentage, batteryVoltage, batteryIsCharging
odometrypose (CCS → map), speedLinear, speedAngular, robot pose on the map
localTrajectoryRobot path "1" (Navigation widget, ≤ 1/s)
globalPlanRobot path "0"
globalPath (NURBS)Typed and validated in the SDK; not used by ORO
footprint (live resource)🌗QoS entry only, no schema or typed publisher — the FDIS leaves it half specified. ORO uses the retained identity footprint instead.
request/<uuid>, request/<uuid>/statussend onlySee below
activeRequestsStatusSDK publishes it for served requests; ORO neither serves nor reads it
disconnection (B.4 Last Will)Treated as a first-class resource; LOST_CONNECTION → offline

Request actions (Annex C)

ActionSDKORO sends itTriggered by
moveNavigate to action (goal converted to the CCS). Tolerances and arrivalTime are not set.
cancelCancel navigation, when a move/dock is in flight. Sent as cancelRequest (see extensions); cancel is accepted on ingress.
dockdock / dock=<id> messages; always dockActions: ["CHARGE"], addressed by location (no dockId).
undockNo ORO trigger yet.
pauseImr / resumeImr🌗Wired to commandTopics.pause/.resume, null by default — no built-in ORO action publishes there yet.
Request status feedbackORO does not feed SUCCEEDED/ABORTED/EXECUTING back into its action-execution status; a nav goal is acknowledged on receipt, not arrival.
Multi-detail, priority, atomic, recoveries, empty destinationORO always sends one detail per request to an explicit robot.

What is left

Roughly in the order it is likely to matter:

  1. ISO Upstream — ORO as an IMR proxy for its own wire/ROS robots. Design exists, no code.
  2. IMRFM state (Clause 8).
  3. Request status feedback into ORO's action-execution API; undock; built-in pause/resume actions.
  4. Richer status and identity mapping — operating states beyond online/offline (e.g. CHARGING, LOW_BATTERY, stop categories → statuses/incidents), battery health, model/serial/rated values as robot metadata.
  5. Mixed fleets — a deployment is either wire or ISO today.
  6. SDK: footprint, ccs/referencePoint schema kinds; enforcing Table 5 conditional rules (exactly one MODE_*, stop categories in manual modes); minimum-frequency heartbeats; the planned examples (IMR simulator, gateway template, fleet observer).

Extensions over the standard

All of these use hooks the standard leaves open (resource catalogue B.2.2, entity types B.2.3, action type in Table C.2, state and reason-code vocabularies).

ExtensionWhatWhy
customData resource/ISO_21423/v1/IMR/<uuid>/customData, QoS 1, { timestamp, values: { key: string } }. Robots opt in via capabilities.provides.ISO has no key-value message; this carries deployment-specific data sources, statuses, incidents and the Key-Values widget unchanged.
customCommand action{ type: "customCommand", version: "1.0", properties: { command } }, opt-in via capabilities.accepts.Pass-through for any ORO PublishToTopic action, so existing deployment actions survive the protocol change.
cancelRequest action nameSDK emits cancelRequest, normalises legacy cancel on ingress.Resolves an ambiguity in the FDIS naming; both are in the SDK schema.
disconnection as a resource, JSON Last WillLast Will payload is {"states":["LOST_CONNECTION"]}.The FDIS Last Will text is not valid JSON and its state is unregistered.
Dock conventionsdock / dock=<id> messages, nearest-dock selection, docks configured in ORO's map frame.Standard ISO robots can be docked from ORO without knowing OpenRobOps.
Cancel-nav semanticsWith nothing in flight, "cancel" is a move to the robot's current pose (not pauseImr).Matches ORO's goal-to-current-pose behaviour; pauseImr implies a later resume.
CCS calibration storageReference points in settings, seeded into ORO's spatial_transformations.The standard defines the CCS but no way to distribute it.
Onboarding and ACLsIsoRobot admission object, POST /iso_mqtt_config, per-robot Mosquitto ACLs.The standard only says "should follow IEC 62443/27001".
Fleet gateway helpers (SDK)Retained-request janitor, identity self-check probe.Operational robustness the standard does not address.

The SDK repository keeps a catalogue of FDIS defects explaining each deviation and the position taken.