Skip to main content

ROSQL

The open source query language that natively speaks robot

A SQL-like language purpose-built for ROS2 telemetry — distributed tracing, logs, metrics, and pose/kinematics with first-class support for nodes, actions, topics, and message causality, powered by OpenTelemetry.

Try it — pick a scenario and hit Run

Loading editor…

Querying a 3-robot warehouse fleet · About this dataset →

Available as a library, CLI, gRPC server, and WASM package.

One query. Every format you need.

Results are unified across signal types — tables for SQL consumers, structured objects for programmatic processing, chart-ready data for visualization, and causality graphs for message tracing.

ROSQL QueryYour robot's language
Robot Telemetry
PostgreSQLPostgres
TimescaleDBTimescaleDBTimescale
ClickHouseClickHouseClickHouse
ParquetParquet
BigQueryBigQuerysoon
Structured dataTables, JSON objects, programmatic output
Time-series & chartsFleet metrics via TIMESERIES + FACET
Sensor & topic dataUnit-aware readings, topic streams
Causality & tracesGantt spans, topology graphs, directed graphs
3D joint replayJoint state animations from recorded data

Why ROSQL?

Robot observability is hard. ROS2 systems generate a firehose of traces, logs, and sensor data across dozens of nodes, but general-purpose query languages have no awareness of topics, action graphs, or message causality. ROSQL closes that gap: write queries in the language of your robot, not your database.

Robotics-native syntax

First-class support for ROS2 nodes, actions, topics, named joints, and ParentSpanId-based message causality. No glue code.

Distributed tracing

Full OpenTelemetry-native tracing — not just within a robot's nodes, but across robots, fleet management systems, and external services. Trace a mission from dispatch to completion.

Cross-signal correlation

DURING() correlates events across traces, logs, metrics, and topics in a single query — something SQL has no primitive for.

Native framework support

First-class topic aliases for common ROS2 frameworks: FROM odom, FROM joint_states, FROM cmd_vel, FROM imu. Nav2 and MoveIt data without memorizing topic names.

Robot model understanding

Query by named joint, inspect URDF-derived limits with SHOW JOINTS, and measure actual-vs-planned deviation with JOINT DEVIATION and PATH DEVIATION.

Deep systems telemetry

Not just ROS2 — query CPU, memory, network, and custom metrics alongside robot data. Full OpenTelemetry compatibility means any OTel-instrumented service is a first-class citizen.

Deployment-aware scoping

Scope any query to a specific robot, version, environment, or session — FOR ROBOT 'arm-01' FOR VERSION 'v1.3.0'. Compare error rates across versions or flag regressions since your last deploy without timestamp math.

Causality graphs

TRACE 'id' walks the parent_span_id chain recursively — see exactly how a message propagated through your robot's nodes and across system boundaries.

Unit-aware filtering

Write physical quantities in any unit — fields['joint_angle'] > 30 deg, position WITHIN 500 m OF (lat, lon), fields['torque'] > 12 Nm. ROSQL auto-converts to SI for geospatial, kinematic, and sensor queries alike. No manual conversion.

Visual format hints

Every query returns a format_hint — Gantt, StackedLineChart, NodeGraph, and more — so your UI renders the right visualization automatically.

Complex questions, instant answers

From proximity checks to 3D joint replay — ask in plain English, query in ROSQL.

"Did robot amr-foo-1 move within 2 ft of a point in the last 24 hours?"

09:23:14amr-foo-129.512 ft
09:24:02amr-foo-126.342 ft
09:24:51amr-foo-123.143 ft
09:25:37amr-foo-121.188 ft

"Did the link left_shoulder ever exceed 30° since the last deploy?"

10:15:08left_shoulder28.3°
10:16:22left_shoulder31.7°
10:17:05left_shoulder29.1°

"What was the joint deviation on robot-123 vs robot-456 in the last hour?"

robot-123robot-456

"Show me the 3D joint states in the 15 seconds before the error"

0:12 / 0:15

"Show me all the logs associated with a failed trace"

ERRORAction /navigate_to_pose failed: goal rejecteda1b2…
WARNCostmap inflation radius exceeded thresholda1b2…
INFOBT node NavigateToPose tickeda1b2…
ERRORTF lookup timeout: map → base_linka1b2…

"Where was the bottleneck across all spans in this action?"

navigate_to_pose
compute_path
planner_server
follow_path
controller_server

See the Cookbook for more examples →

One query, multiple signals

Find every joint limit breach that happened while the battery was critically low — scoped to your robot, auto-bounded to the last deploy. ROSQL converts units, understands lifecycle anchors, and correlates topic streams in a single pass. No JOINs.

Cross-signal correlation with robot-native scoping
FROM joint_states
WHERE fields['position[2]'] > 30 deg
DURING(
FROM battery WHERE fields['percentage'] < 15
)
FOR ROBOT 'arm-01'
SINCE last deployment

Fleet-wide time-series, one line

Group by any field with FACET. Bucket into intervals with TIMESERIES. Results include a format_hint so your UI renders a stacked chart automatically.

Multi-robot CPU over time
SELECT cpu_usage FROM metrics
TIMESERIES 2 min FACET robot_id
SINCE 45 min ago

Sensor units — inline, auto-converted

Write physical quantities in whatever unit makes sense. ROSQL normalizes to SI before hitting the database — no manual conversion, no unit mismatch bugs.

fields['voltage'] < 11.5 V→ 11.5 VCatch battery sag
fields['distance'] < 24 in→ 0.61 mProximity alert
fields['joint_angle'] > 30 deg→ 0.524 radJoint limit warning
fields['speed'] > 3.5 mph→ 1.56 m/sFlag velocity outliers

Architecture

ROS2 System │ │ ros.node, ros.action.*, ros.topic │ ParentSpanId (OTel attributes) ▼ Robot Ops Agent or OTel Collector │ │ OTLP gRPC ▼ Datastore (PostgreSQL, Clickhouse, Parquet/S3 …) │ │ OTel standard schema ▼ rosql (parse + compile + execute) │ ▼ Query results
LibraryEmbed in Rust apps. Parse + execute against any driver.
CLI + gRPCrosql query / compile / parse — pipe into scripts.
WASMParse and validate in the browser. No server needed.

Driver support

BackendFeature flagStatus
PostgreSQL / TimescaleDBpostgres✅ v0.1
MySQL / MariaDBmysql✅ v0.1
Parquet (local / S3) via DuckDBduckdb✅ v0.4.5
ClickHouseclickhouse📋 Planned
AWS Athenaathena📋 Planned
Google BigQuerybigquery📋 Planned

Driver docs →

Quick start

Linux · macOS (Intel & Apple Silicon) · Windows via cargo

curl -fsSL https://rosql.org/install.sh | sh

Linux x86_64 / arm64 · macOS Intel & Apple Silicon. Installs to ~/.local/bin/.

Run your first query
rosql query "FROM traces WHERE status = 'ERROR' LIMIT 5" \
--backend parquet \
--url s3://robotops-production-rosql-demo/data

Need fleet-scale telemetry?

ROSQL is created and used by Robot Ops, Inc. to power the Robot Ops observability platform — managed ingestion, storage, and dashboards with lifecycle anchors, fleet-wide anomaly detection, and ClickHouse performance.

Explore Robot Ops →