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 parameterssee 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"]
}