Skip to main content

System Architecture

OpenRobOps follows a modular architecture where each component has a clear responsibility. This page describes how the components interact.

Component Diagram

This diagram describes the scenario where the robot runs the ORO Agent. In an ISO 21423 deployment the robot side is instead any ISO 21423-compliant robot (IMR) publishing standard JSON resources on /ISO_21423/v1/..., and ingest loads IsoRobotsModule — acting as the standard's fleet manager (IMRFM) — in place of the wire-protocol modules.

┌──────────────────────────────────────────────────────────────┐
│ Robot (on-device) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Agent (agentlets, e.g.) │ │
│ │ ├── SystemAgentlet (CPU, RAM, disk, network) │ │
│ │ ├── RosLocalizationAgentlet (pose, map, laser, path)│ │
│ │ ├── CustomDataAgentlet (key-value, text, images) │ │
│ │ └── RosDiagnostics, RosOdometry, RosTeleop, ... │ │
│ └──────────────────────┬───────────────────────────────┘ │
│ │ MQTT (protobuf) │
└─────────────────────────┼────────────────────────────────────┘
│ ORO Protocol

┌──────────────────────────────────────────────────────────────┐
│ Mosquitto MQTT Broker │
│ ├── Port 1883 (MQTT) │
│ ├── Port 9001 (WebSocket) │
│ └── Auth: mosquitto-go-auth → MongoDB (mqtt_credentials) │
└──────────┬──────────────────────────────┬────────────────────┘
│ │
│ Subscribe │ Subscribe (browser)
▼ │
┌──────────────────────────────┐ │
│ Ingest Service │ │
│ ├── OroMqtt │ │
│ ├── BasicsModule │ │
│ ├── SystemModule │ │
│ ├── CustomDataModule │ │
│ ├── RobotEventsModule │ │
│ ├── DiagnosticsModule │ │
│ ├── CustomCommandsModule │ │
│ ├── RobotLocalizationModule │ │
│ └── UpstreamModule (opt.) │ │
└──────────┬───────────────────┘ │
│ Write │
▼ │
┌──────────────────────────────────────┐ │
│ MongoDB (:3001) │ │
│ ├── robots │ │
│ ├── localization │ │
│ ├── attr_values │ │
│ ├── module_states │ │
│ ├── incidents / notifications │ │
│ └── per-kind config (attr_defs, …) │ │
└──────────┬───────────────────────────┘ │
│ Reactive queries │
▼ │
┌──────────────────────────────────────┐ │
│ Meteor App Server (:3000) │ │
│ ├── Pub/Sub (DDP WebSocket) │ │
│ ├── REST API (/api/*) │ │
│ ├── ConfigAPI (/api/configuration/*)│ │
│ ├── OAuth (Google, GitHub, Email) │ │
│ └── Static assets (React UI) │ │
└──────────┬───────────────────────────┘ │
│ HTTP / WebSocket │
▼ ▼
┌───────────────────────────────────────────┐
│ Web Browser │
│ ├── React 18 + Material UI │
│ ├── Fleet Dashboard │
│ ├── Robot Dashboard │
│ └── MQTT (WebSocket) for direct streams │
└───────────────────────────────────────────┘

Component Responsibilities

Robot Agent

Runs on-device. Collects telemetry from the robot's systems and publishes it over MQTT using Protocol Buffer serialization. The agent is composed of agentlets, each responsible for a specific data type.

MQTT Broker (Mosquitto)

Central message bus. Routes telemetry from robots to the ingest service and browser clients. Uses the mosquitto-go-auth plugin for authentication against MongoDB, where robot credentials are stored.

Ingest Service

A Node.js process that subscribes to MQTT topics and processes incoming telemetry. Uses a pluggable module architecture — each module handles a specific message type (system stats, localization, custom data, etc.). Writes processed data to MongoDB.

The ingest service also communicates with the web app via a Peer API (/peer/* endpoints) for creating alerts and relaying robot commands. Peer calls authenticate with a peerKey field inside the JSON body; the x-auth-peer-key HTTP header is a separate mechanism used by internal callers of the REST /api surface.

MongoDB

Single database (meteor) shared by all components. Stores robot records, telemetry data, user accounts, MQTT credentials, and ConfigAPI objects. Meteor's reactive driver enables real-time data updates to the browser.

Meteor App Server

Full-stack application server providing:

  • REST API — CRUD operations for robots, attributes, localization, and configuration
  • Pub/Sub — Meteor's DDP protocol pushes real-time data changes to connected browsers
  • Authentication — OAuth and passwordless email via Meteor Accounts
  • Static assets — serves the React 18 frontend

Web Browser

React 18 SPA with Material UI. Connects to the Meteor server via WebSocket (DDP) for reactive data and optionally to the MQTT broker via WebSocket for direct telemetry streams.

Data Flow Summary

FlowPathProtocol
Robot → CloudAgent → MQTT broker → Ingest → MongoDBMQTT + protobuf
Cloud → BrowserMongoDB → Meteor pub/sub → BrowserDDP (WebSocket)
Cloud → RobotWeb app → MQTT broker → Agent (commands, with echo callbacks)MQTT
API accessClient → Meteor REST API → MongoDBHTTP + JSON
Config changesClient → ConfigAPI → MongoDB → Meteor pub/sub → BrowserHTTP + DDP
UpstreamIngest UpstreamModule → upstream ORO/InOrbit brokerMQTT (see Upstream Forwarding)
Direct telemetryMQTT broker → BrowserMQTT over WebSocket

Next Steps