Skip to main content

Live data

Connect to live data sources with the Foxglove WebSocket, Rosbridge, and Velodyne Lidar connections. You can also load remote data files via URL.

Supported formats​

Supported formatsConfiguration options
Foxglove WebSocketWebSocket URL
RosbridgeWebSocket URL
ROS 1ROS 1 (Desktop app only)ROS_MASTER_URI and ROS_HOSTNAME
Velodyne LidarVelodyne (Desktop app only)UDP port
Remote fileRequires CORS setup

Limitations​

When connecting to a live robotics stack, each connection will have different capabilities.

Foxglove WebSocket (recommended)RosbridgeROS 1
Stream ROS 1 data✓✓✓
Stream ROS 2 data✓✓
Stream custom data✓
Custom message schemas✓✓✓
Publish messages✓ (ROS 1, ROS 2, JSON)✓✓
Call services✓✓
Call actions
Read and set parameters✓see discussion✓

Cross-Origin Resource Sharing (CORS) setup​

To load remote data files, you must host your files in a server or cloud provider that supports Cross-Origin Resource Sharing (CORS) and accepts range requests.

When loading remote data into Foxglove for playback and analysis, we recommend hosting your files in a cloud provider like Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), or Azure Storage. You can also host files on your own server, but it may be difficult and time-consuming to set up support for Cross-Origin Resource Sharing (CORS) and range requests.

If your data is sensitive, generate and use a signed URL – make sure that you point to the resource directly, as redirects will not work with CORS:

This signed URL will work for a limited period of time. You can set up your server to only sign URLs for authenticated users.

Finally, set up your CORS configuration. Check out the following example of a Terraform config for an S3 bucket (docs):

cors_rule {
allowed_methods = ["GET", "HEAD", "OPTIONS"]
allowed_origins = ["https://app.foxglove.dev"]
allowed_headers = ["*"]
expose_headers = ["ETag", "Content-Type", "Accept-Ranges", "Content-Length"]
}

And a Terraform config for a GCS bucket (docs):

cors {
origin = ["https://app.foxglove.dev"]
method = ["GET", "HEAD", "OPTIONS"]
response_header = ["ETag", "Content-Type", "Accept-Ranges", "Content-Length"]
}