A demonstration of real-time robot telemetry streaming to the FortyFive ML dashboard system.
This demo simulates a robot sending telemetry data (position, velocity, sensor readings) to the data-manager server via WebSocket connections. It demonstrates:
- Real-time data streaming from a simulated robot
- WebSocket-based and HTTPS Streaming-based communication
- Batching and log rotation
- Automatic reconnection handling
- Time-series data visualization in data manager
We will use JSON for metadata and MessagePack for binary. We will need to define a schema for each data type, and a separate event type for remote-procedure calls (RPC).
- time_series - Time-indexed numerical data (telemetry, sensors, metrics)
- parameters - Configuration parameters and hyperparameters
- images - Static images (JPEG, PNG, WebP, TIFF, etc.)
- video - Video streams (MP4, WebM, AVI, etc.)
- audio - Audio recordings (MP3, WAV, OGG, etc.)
- log - Text logs from system components
- markdown - Documentation and formatted text
- file - Generic file storage
- csv - Tabular data in CSV/TSV format
- safetensors - ML model tensor serialization
- json - JSON data interchange format
- yaml - YAML configuration format
- toml - TOML configuration format
- msgpack - MessagePack binary serialization
- vuer_msg - Vuer MessagePack format with $dtype field
- zip - ZIP compressed archives
- tar - TAR archives (with optional compression)
We use a hybrid storage approach optimized for both real-time streaming and historical analysis:
- Purpose: Store structured telemetry data, metadata, and indexes
- Collections:
sessions: Robot session metadata and configurationstelemetry: High-frequency pose, joint, and sensor dataframes_metadata: Camera frame references with S3 linksaggregations: Pre-computed statistics for fast queries
- Purpose: Store large binary data (camera frames, point clouds)
- Structure:
s3://fortyfive-robot-data/{prefix-id} ├── raw/ │ ├── camera/ego/ │ │ ├── rgb/ │ │ │ ├── {timestamp}.jpg │ │ │ └── meta.jsonl │ │ └── depth/ │ │ ├── {timestamp}.png │ │ └── meta.jsonl │ ├── lidar/ │ │ └── pointcloud/ │ │ ├── {timestamp}.ply │ │ └── meta.jsonl │ └── logs/ │ ├── system/ │ │ ├── {log_id}.log │ │ └── meta.jsonl │ ├── telemetry/ │ │ ├── {log_id}.jsonl │ │ └── meta.jsonl │ └── events/ │ ├── {log_id}.jsonl │ └── meta.jsonl ├── compressed/ │ ├── camera/ego/ │ │ ├── rgb/ │ │ │ ├── {lot_id}.mp4 │ │ │ └── meta.jsonl │ │ └── depth/ │ │ ├── {lot_id}.tar.gz │ │ └── meta.jsonl │ ├── lidar/ │ │ └── pointcloud/ │ │ ├── {lot_id}.tar.gz │ │ └── meta.jsonl │ ├── logs/ │ │ ├── system/ │ │ │ ├── {log_id}.tar.gz │ │ │ └── meta.jsonl │ │ ├── telemetry/ │ │ │ ├── {log_id}.tar.gz │ │ │ └── meta.jsonl │ │ └── events/ │ │ ├── {log_id}.tar.gz │ │ └── meta.jsonl │ └── bundles/ │ └── {lot_id}_complete.tar.gz └── processed/ └── {robot_id}/ └── {session_id}/ └── thumbnails/
Camera feeds are compacted using multiple strategies:
- H.264 for RGB streams (70% size reduction)
- PNG with zlib for depth maps (50% reduction)
- Draco geometry compression for point clouds (90% reduction)
- Hourly bundles of consecutive frames
- Delta encoding between frames
- Keyframe every 30 frames
Original: 1920x1080 → Storage: S3 cold tier
Preview: 640x360 → Storage: S3 standard
Thumbnail: 120x68 → Storage: MongoDB GridFS
- High-frequency telemetry: 100Hz pose updates
- Medium-frequency sensors: 30Hz force/torque readings
- Low-frequency metrics: 1Hz system health
- Burst mode: Camera frame events at variable rates
cd ../data-manager
pnpm devtodo - TBD
Now you can view the real-time data in vuer.ai, or the recorded data in the data-manager dashboard.
The simulator generates approximately:
- Telemetry: 30,000 points/min per robot (~5MB JSON)
- Camera Frames: 1800 frames/min (30fps × 60s)
- RGB: ~100MB/min (compressed JPEG)
- Depth: ~50MB/min (compressed PNG)
- Point Cloud: ~200MB/min (compressed Draco)
- Total: ~350MB/min per robot (compressed)
- MongoDB: ~10GB/day for 10 robots (metadata + telemetry)
- S3: ~500GB/day for 10 robots (binary objects)
- Retention: 30 days hot, 90 days warm, 1 year cold
- Real-time telemetry: < 100ms latency
- Frame retrieval: < 500ms for recent, < 2s for cold
- Time-range query: < 1s for 1 hour of data
- Aggregations: < 200ms for pre-computed stats
# Unit tests
pytest client/tests/
# Integration test
./run_integration_test.shPart of FortyFive ML Dashboard - All rights reserved.