ROSplat
August 18, 2026 ยท View on GitHub
The Online ROS2-Based Gaussian Splatting-Enabled Visualizer

Overview
ROSplat is the first online ROS2-based visualizer that leverages Gaussian splatting to render complex 3D scenes. It is designed to efficiently visualize millions of Gaussians by using custom ROS2 messages and GPU-accelerated sorting and rendering techniques. ROSplat also supports data loading from PLY files.
Features
- Real-Time Visualization: Render millions of Gaussian "splats" in real time.
- ROS2 Integration: Built on ROS2 for online data exchange of Gaussians, Images, and IMU data.
- Custom Gaussian Messages: Uses custom message types (SingleGaussian and GaussianArray) to encapsulate properties such as position, rotation, scale, opacity, and spherical harmonics.
- Portable Vulkan Rendering: Uses Spirula Studio's Vulkan projection, tile sorting, and Gaussian rasterization through a small native bridge.
- Vulkan ImGui UI: The application and all dynamic textures use Dear ImGui through wgpu-py's Vulkan backend; there is no CUDA, Torch, gsplat, or OpenGL renderer path.
Setup
The supported container targets Ubuntu 26.04 LTS, ROS 2 Lyrical, and a Vulkan 1.2-capable GPU. The renderer requires Vulkan buffer device addresses and timeline semaphores, matching Spirula Studio's backend requirements.
Dependencies
- Docker with the Compose plugin
- A Vulkan 1.2-capable GPU and current graphics driver
- NVIDIA Container Toolkit when using an NVIDIA GPU through Docker
The Docker image builds the pinned Spirula Studio source, its Slang shaders,
the ROSplat native bridge, ROS, the Vulkan UI dependencies, and the generated
gaussian_interface messages. CUDA and PyTorch are not required.
Docker-Based Setup
Docker is the supported setup path. On Arch Linux, install the NVIDIA Container Toolkit once:
sudo pacman -S --needed nvidia-container-toolkit
The Compose service requests every available GPU through the toolkit's CDI device. Confirm the CDI devices are visible with:
nvidia-ctk cdi list
Then build and run ROSplat:
./docker/run_docker.sh -b # Build rosplat:lyrical-vulkan once
./docker/launch_ui.sh # Start/reuse the container and launch ROSplat
For an interactive development shell or cleanup:
./docker/run_docker.sh -u
./docker/run_docker.sh -c
Run the unit-test suite inside the development container with:
docker compose -f docker/docker-compose.yml exec rosplat rosplat-entrypoint python3 -m unittest discover -s tests
The Compose configuration enables the graphics, display, and utility driver
capabilities required for Vulkan and X11 presentation. wgpu-py is forced to
Vulkan and ROSplat rejects a different backend at startup.
Native build without Docker
Initialize the pinned renderer dependency and build the bridge:
git submodule update --init --recursive
cmake -S . -B build-native -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build-native --target rosplat_spirula
The first configure downloads Spirula's pinned Slang compiler and the first
build compiles its SPIR-V shader set. ROSplat finds
build-native/librosplat_spirula.so automatically. Override the path with
ROSPLAT_SPIRULA_LIBRARY when installing elsewhere.
Third-party licensing
Spirula Studio stays pinned and unmodified in external/spirula-studio, with
its upstream history and GPL-3.0 license intact. ROSplat-owned bridge code is
under native/. See THIRD_PARTY_LICENSES.md for the
exact revision and license boundary. ROSplat itself is GPL-3.0, so the combined
distribution is license-compatible without relicensing upstream files.
Building the Gaussian Messages
ROSplat defines two custom ROS2 messages to handle Gaussian data, located in the gaussian_interface/msg folder.
Note: The Gaussian messages are based on the original Gaussian Splatting implementation by graphdeco-inria.
Message Definitions
1. SingleGaussian.msg
# Gaussian.msg
# 3D Pose
float32[3] xyz
# Rotation as Quaternion
float32[4] rotation
# Scale along each axis
float32[3] scale
# Opacity
# Quantized as a number between 0-255 instead of 0-1
uint8 opacity
# Spherical Harmonics
float32[] spherical_harmonics
2. GaussianArray.msg
gaussian_interface/SingleGaussian[] gaussians
Building the Messages Without Docker
a) Build your workspace using colcon:
colcon build --packages-select gaussian_interface
b) Source your workspace:
. install/setup.bash
Important: Depending on your shell, you might need to adjust these commands.
Usage
Inside the Docker container the messages are already built and sourced. For a manual installation, build the messages first and then launch the visualizer from the project's root directory:
python3 -m rosplat.main
Testing Gaussian Visualization
The development container is a reusable background service. Build it once after cloning or whenever Docker/native dependencies change:
./docker/run_docker.sh -b
Normal Python source edits are bind-mounted into /workspace immediately and
do not require rebuilding or recreating the container. Use the two host-side
helpers from the repository root:
# Terminal 1: start/reuse the container and run the Vulkan ImGui app
./docker/launch_ui.sh
# Terminal 2: stream a repository PLY using the same container
./docker/publish_ply.sh data/horse.ply
The publisher accepts the existing options after the PLY path:
./docker/publish_ply.sh data/horse.ply --batch-size 10000 --rate 10
./docker/publish_ply.sh data/horse.ply --topic /my_gaussians
The default topic is /gaussian_test. In ROSplat, select it in ROS
Settings and click Add. The publisher waits for that subscription before
sending anything, so either terminal can be started first.
Closing the UI or publisher only stops that foreground process; the container continues running and is reused by the next command. Check or stop it explicitly:
docker compose -f docker/docker-compose.yml ps
./docker/run_docker.sh -c
Use -c only when you intentionally want to stop the development service.
Contributions
Contributions and feedback are welcome!
Acknowledgments
I'm glad to have worked on such a challenging topic and grateful for the invaluable advice and support I received throughout this project.
Special thanks to Qihao Yuan and Kailai Li for their guidance and encouragement as well as the constructive feedback that helped shape this work.
This project was additionally influenced by limacv 's implementation of the GaussianSplattingViewer repository.
Contact
For questions or further information, please email: shady.gmira[at]gmail.com