ILLIXR plugins
This page details the structure of ILLIXR's plugins and how they interact with each other. Each plugin is labeled with the OSs they are supported on:
| Logo | OS |
|---|---|
![]() |
Linux |
![]() |
Windows |
![]() |
Android |
Ada 
Ada’s distributed design relies on four communication plugins that coordinate data transfer between the device and server for remote scene provisioning.
ada.device_rx: Receives processed data from the server to the device.- Asynchronously reads a string from the topic
ada_processed, which contains protobuf packets sent by the server. - Publishes
mesh_typetocompressed_scenetopic. forwards compressed mesh chunks toada.mesh_decompression_grey - Publishes
vb_typetoVB_update_liststopic. forwards the unique voxel block list (UVBL) toada.scene_management
- Asynchronously reads a string from the topic
ada.device_tx: Sends encoded depth images (MSB and LSB) along with non-encoded pose information from the device to the server. The LSB encoding bitrate is configurable for bandwidth–reconstruction accuracy trade-offs.- Synchronously reads
scene_recon_typefromScanNet_Datatopic, which provides dataset input (viaada.offline_scannet). - Publishes encoded depth data as a string to the
ada_datatopic.
- Synchronously reads
ada.server_rx: Receives encoded depth images and poses (not encoded) from the device, decodes them, and feeds them to the reconstruction module (ada.infiniTAM).- Asynchronously reads a string from topic
ada_data - Publishes
scene_recon_typetoScanNet_Datatopic. provides decoded depth frames and corresponding pose inforamtion to downstream reconstruction.
- Asynchronously reads a string from topic
ada.server_tx: Sends processed scene data (meshes and Unique Voxel Block Lists(UVBL)) from the server back to the device.
ada.infinitam 
Performs scene reconstruction using incoming depth and pose data from the device, followed by on-demand or proactive scene extraction. During extraction, it generates both the updated partial mesh and the Unique Voxel Block List (UVBL), which are sent downstream for compression and scene management. Extraction frequency is configurable to balance latency and compute cost.
Topic details:
- Synchronously reads
scene_recon_typefromScanNet_Datatopic. - Publishes
mesh_typetorequested_scenetopic. Extracted mesh chunks for compression - Publishes
vb_typetounique_VB_listtopic. This is the metadata for identifying updated voxel regions
ada.mesh_compression 
Compresses mesh chunks from ada.infinitam using a customized version of Google Draco. Compression parallelism can be tuned for different latency–power trade-offs.
Topic details:
- Synchronously reads
mesh_typefromrequested_scenetopic. - Publishes
mesh_typetocompressed_scenetopic. compressed mesh chunks ready for transmission to the device. Voxel block information has been attached to each encoded face.
ada.mesh_decompression_grey 
Decompresses the mesh chunks received from the server and performs a portion of scene management that can be parallelized. Decompression parallelism can be tuned for different latency–power trade-offs.
Topic details:
- Synchronously reads
mesh_typefromcompressed_scenetopic. - Publishes
draco_typetodecoded_inactive_scenetopic. decoded mesh data sent toada.scene_management.
ada.offline_scannet 
Loads the ScanNet dataset for offline or reproducible experiments.
Topic details:
- Publishes
scene_recon_typetoScanNet_Datatopic.
ada.scene_management 
Integrates incremental scene updates into a maintained global mesh, merging new geometry and removing outdated regions for consistency.
Topic details:
- Synchronously reads
draco_typefromdecoded_inactive_scenetopic. - Synchronously reads
vb_typefromVB_update_liststopic.
android_data 
Reads imu_type and binocular_cam_type from files on the Android device and publishes them to the switchboard.
Topic details:
- Publishes
imu_typetoimutopic. - Publishes
binocular_cam_typetocamtopic.
Details Code
audio_pipeline 
Launches a thread for binaural: recording and one for binaural playback.
Audio output is not yet routed to the system's speakers or microphone,
but the plugin's compute workload is still representative of a real system.
By default, this plugin is enabled (see native configuration).
Topic details:
- Calls
pose_prediction
boba_immersive 
Topic details:
- Asynchronously reads
controller_inputfromquest_controllertopic. - Asynchronously reads
openxr_view_framefromopenxr_viewtopic. - Publishes
stereo_frametostereo_frametopic.
boba_streaming_server 
Topic details:
- Asynchronously reads
stereo_framefromstereo_frametopic. - Publishes
compressed_frametocompressed_framestopic. - Publishes
boba_modal_texturetoboba_modal_texturetopic.
debugview 
Renders incoming frames from the graphics pipeline for debugging live executions of the application.
Topic details:
- Calls
pose_prediction - Asynchronously reads
fast_pose_typefromimu_rawtopic. (IMU biases are unused). - Asynchronously reads
pose_typefromslow_posetopic. - Asynchronously reads
rgb_depth_typefromrgb_depthtopic. - Asynchronously reads buffered
binocular_cam_typefromcamtopic.
depthai 
Enables access to the DepthAI library.
Topic details:
- Publishes
imu_typetoimutopic - Publishes
binocular_cam_typetocamtopic` - Publishes
rgb_depth_typetorgb_depthtopic
Details Code
gldemo 1

Renders a static scene (into left and right eye buffers) given the pose
from pose_prediction.
Topic details:
- Calls
pose_prediction - Publishes
rendered_frametoeyebuffertopic. - Publishes
image_handletoimage_handletopic. - Asynchronously reads
time_pointfromvsync_estimatetopic.
ground_truth_slam 
Reads the ground truth from the same dataset as the offline_imu plugin.
Ground truth data can be compared against the head tracking results (e.g. from VIO, IMU integrator, or pose predictor) for accuracy.
Timing information is taken from the offline_imu measurements/data.
Topic details:
- Publishes
pose_typetotrue_posetopic. - Publishes
Eigen::Vector3ftoground_truth_offsettopic. - Asynchronously reads
imu_typefromimutopic.
Details Code
gtsam_integrator 
Integrates over all IMU samples since the last published visual-inertial pose to provide a fast pose every time a new IMU sample arrives using the GTSAM library (upstream).
Topic details:
- Publishes
imu_raw_typetoimu_rawtopic. - Synchronously reads
imu_typefromimutopic. - Asynchronously reads
imu_integrator_inputtoimu_integrator_inputtopic.
Details Code
hand_tracking 
Detects and identifies hands in an image, CPU based calculations. The output from this plugin can be used to track hand movements and recognize hand gestures.
Topic details:
- Synchronously reads one of
monocular_cam_typefromwebcamtopic,binocular_cam_typefromcamtopic, orcam_type_zedfromcam_zedtopic. This is selectable at run time via an environment variable. - Asynchronously reads
camera_datafromcam_datatopic, only once as values are static - If reading from
webcam- Asynchronously reads
pose_typefromposetopic - Asynchronously reads one of
depth_typefromdepthtopic orrgb_depth_typefromrgb_depthtopic, depending on which is available
- Asynchronously reads
- If reading from
cam- Asynchronously reads
pose_typefromposetopic - Asynchronously reads one of
depth_typefromdepthtopic orrgb_depth_typefromrgb_depthtopic, if either is available, but not required
- Asynchronously reads
- If reading from
cam_zed, no additional data are required. - Publishes
ht_frametohttopic.
hand_tracking_gpu 
Detects and identifies hands in an image, GPU based calculations. The output from this plugin can be used to track hand movements and recognize hand gestures. This plugin is currently experimental.
Topic details:
- Synchronously reads one of
monocular_cam_typefromwebcamtopic,binocular_cam_typefromcamtopic, orcam_type_zedfromcam_zedtopic. This is selectable at run time via an environment variable. - Asynchronously reads
camera_datafromcam_datatopic, only once as values are static - If reading from
webcam- Asynchronously reads
pose_typefromposetopic - Asynchronously reads one of
depth_typefromdepthtopic orrgb_depth_typefromrgb_depthtopic, depending on which is available
- Asynchronously reads
- If reading from
cam- Asynchronously reads
pose_typefromposetopic - Asynchronously reads one of
depth_typefromdepthtopic orrgb_depth_typefromrgb_depthtopic, if either is available, but not required
- Asynchronously reads
- If reading from
cam_zed, no additional data are required. - Publishes
ht_frametohttopic.
hand_tracking.viewer 
Reads the output of the hand_tracking plugin and displays the results on the screen. This is most useful for debugging. The capabilities of this plugin will be merged into the debugview plugin in the future.
Topic details:
- Synchronously reads
ht_framefromhttopic.
lighthouse 
Enables lighthouse tracking using the libsurvive library
Topic details:
- Publishes
pose_typetoslow_posetopic. - Publishes
fast_pose_typetofast_posetopic.
native_renderer

Constructs a full rendering pipeline utilizing several ILLIXR components.
Topic details:
- Calls
pose_prediction - Calls
vulkan::display_provider - Calls
vulkan::timewarp - Calls
vulkan::app - Synchronously reads
time_pointfromvsync_estimatetopic.
network_latency

This set of plugins periodically measures round-trip network latency between client and server. One way latency can be measured between devices running the same operating system and with well correlated clocks.
Topic details:
- Publishes
network_latency_resulttonetwork_latencytopic
offline_cam

Reads camera images from files on disk, emulating real cameras on the headset (feeds the application input measurements with timing similar to an actual camera).
Topic details:
- Publishes
binocular_cam_typetocamtopic.
Details Code
offline_imu

Reads IMU data files on disk, emulating a real sensor on the headset (feeds the application input measurements with timing similar to an actual IMU).
Topic details:
- Publishes
imu_typetoimutopic.
Details Code
offload_data 
Writes frames and poses output from the asynchronous reprojection plugin to disk for analysis.
Topic details:
- Synchronously reads
texture_posetotexture_posetopic.
Details Code
offload_rendering_client

Receives encoded frames from the network, sent by offload_rendering_server
Topic details:
Linux:
- Calls vulkan::display_provider
- Calls pose_prediction
- Asynchronously reads compressed_frame from compressed_frames topic.
- Publishes fast_pose_type to render_pose topic.
- Asynchronously reads network_latency_result from network_latency
Android:
- Asynchronously reads compressed_frame from compressed_frames topic.
- Publishes dual_frames to unity_rendered_frame topic.
- Asynchronously reads network_latency_result from network_latency
offload_rendering_server

Encodes and transmits frames to one of the offload_rendering_clients.
Topic details:
- Calls
vulkan::display_provider - Asynchronously reads
fast_pose_typefromrender_pose_topic. - Publishes
compressed_frametocompressed_framestopic.
offload_vio 
Four plugins which work in unison to allow head tracking (VIO) to be rendered remotely.
Topic details:
offload_vio.device_rx- Asynchronously reads a string from topic
vio_pose. - Synchronously reads
imu_typefromimutopic - Publishes
pose_typetoslow_posetopic. - Publishes
imu_integrator_inputtoimu_integrator_inputtopic.
- Asynchronously reads a string from topic
offload_vio.device_tx- Asynchronously reads
binocular_cam_typefromcam topic - Publishes a string to
compressed_imu_camtopic
- Asynchronously reads
offload_vio.server_rx- Asynchronously reads a string from
compressed_imu_camtopic - Publishes
imu_typetoimutopic. - Publishes
binocular_cam_typetocamtopic.
- Asynchronously reads a string from
offload_vio.server_tx- Asynchronously reads
imu_integrator_inputfromimu_integrator_inputtopic. - Synchronously reads
pose_typefromslow_posetopic fromopen_vins - Publishes a string to
vio_posetopic.
- Asynchronously reads
openni 
Enables an interface to the Openni algorithms.
Topic details:
- Publishes
rgb_depth_typetorgb_depthtopic.
open_vins

An alternate head tracking (upstream) implementation that uses a MSCKF (Multi-State Constrained Kalman Filter) to determine poses via camera/IMU.
Topic details:
- Publishes
pose_typeonslow_posetopic. - Publishes
imu_integrator_inputonimu_integrator_inputtopic. - Synchronously reads/subscribes to
imu_typeonimutopic.
openxr_interface 
Connects to the OpenXR runtime on an Android device, gathers head and hand poses, sending them over the network. Receives decoded frames and puts them in the OpenXR swapchain for display.
Topic details:
- Publishes [
combined_pose][A??] tocombined_posetopic - Asynchronously reads
network_latency_resultfrom `network_latency topic - Asynchronously reads
dual_framesfromunity_rendered_framestopic
openwarp_vk 
Provides a Vulkan-based reprojection service.
Topic details:
- Calls
vulkan::timewarp - Calls
pose_prediction
orb_slam3 
Utilizes the ORB_SLAM3 library to enable real-time head tracking.
Topic details:
- Asynchronously reads
binocular_cam_typefromcamtopic. - Synchronously reads/subscribes to
imu_typeonimutopic. - Publishes
pose_typetoslow_posetopic. - Publishes
imu_integrator_inputtoimu_integrator_inputtopic.
passthrough_integrator

Provides IMU integration.
Topic details:
- Asynchronously reads
imu_integrator_inputfromimu_integrator_inputtopic. - Synchronously reads
imu_typefromimutopic. - Publishes
imu_raw_typetoimu_rawtopic.
Details Code
quest3.controller 
Provides an interface to the Quest 3 hand controller
Topic details:
- Publishes
quest_controller_inputtoquest_controllertopic. - Publishes
openxr_view_frametoopenxr_viewtopic. - Asynchronously reads
stereo_framefromstereo_frametopic.
quest3.unity 
Captures camera and depth images from a Quest 3 headset, encodes them, and sends them over the network to a server. The camera images are captured via standard Android APIs. The depth images have to come over OpenXR, so the plugin hooks into the Unity app and uses it to acquire the depth images.
Topic details:
- Publishes [
semantic_frame][A30] tosemantic_frame` topic
realsense 
Reads images and IMU measurements from the Intel Realsense.
Topic details:
- Publishes
imu_typetoimutopic. - Publishes
binocular_cam_typetocamtopic. - Publishes
rgb_depth_typetorgb_depthtopic.
Details Code
record_imu_cam 
Writes imu_type and binocular_cam_type data to disk.
Topic details:
- Asynchronously reads
binocular_cam_typefromcamtopic. - Synchronously reads
imu_typefromimutopic.
record_rgb_depth 
Writes rgb_depth_type data to disk.
Topic details:
- Synchronously reads
rgb_depth_typefromrgb_depthtopic.
Details Code
rk4_integrator

Integrates over all IMU samples since the last published visual-inertial pose to provide a fast pose every time a new IMU sample arrives using RK4 integration.
Topic details:
- Asynchronously reads
imu_integrator_inputfromimu_integrator_inputtopic. - Synchronously reads
imu_typefromimutopic. - Publishes
imu_raw_typetoimu_rawtopic.
Details Code
semantic_python 
Provides reader and writer handles to a Python script, allowing the script to access the switchboard directly.
Topic details:
- Asynchronously reads
semantic_framefromsemantic_frametopic - Asynchronously reads
voice_queryfromsemantic_querytopic - Publishes
query_responsetosemantic_responsenetworked topic
tcp_network_backend

Provides network communications over TCP.
timewarp_gl 1 
Asynchronous reprojection of the eye buffers. The timewarp ends right before vsync, so it can deduce when the next vsync will be.
Topic details:
- Calls
pose_prediction - Publishes
hologram_inputtohologram_intopic. - If using Monado
- Asynchronously reads
rendered_frameoneyebuffertopic, if using Monado. - Publishes
time_pointtovsync_estimatetopic. - Publishes
texture_posetotexture_posetopic ifILLIXR_OFFLOAD_ENABLEis set in the env.
- Asynchronously reads
- If not using Monado
- Publishes
signal_to_quadtosignal_quadtopic.
- Publishes
timewarp_vk

Asynchronous reprojection of the eye buffers. The timewarp ends right before vsync, so it can deduce when the next vsync will be.
Topic details:
- Calls
vulkan::timewarp - Calls
pose_prediction - Asynchronously reads
time_pointfromvsync_estimatetopic.
udp_network_backend

Provides network communications over UDP.
webcam 
Uses a webcam to capture images for input into the hand_tracking plugin. This plugin is useful for debugging and is not meant to be used in a production pipeline.
Topic details:
- Publishes
monocular_cam_typetowebcamtopic.
zed 
Reads images and IMU measurements from the ZED Mini.
Unlike offline_imu, zed additionally has RGB and depth data.
Note
This plugin implements two threads: one for the camera, and one for the IMU.
Topic details:
- Publishes
imu_typetoimutopic. - Publishes
binocular_cam_typetocamtopic. - Publishes
rgb_depth_typetorgb_depthtopic. - Publishes
camera_datatocam_datatopic. - Publishes
cam_type_zedoncam_zedtopic.
zed.data_injection 
Reads images and pose information from disk and publishes them to ILLIXR.
Topic details:
- Publishes
binocular_cam_typetocamtopic - Publishes
pose_typetoposetopic. - Publishes
camera_datatocam_datatopic.
Below this point, we will use Switchboard terminology. Read the API documentation on Switchboard for more information.
Current dataflow between all plugins and services. Dark blue boxes represent plugins and cyan component boxes represent services. Data types are represented with cylinders and labelled as topic <data_type>. Service data types are represented by octagons. Solid lines point from the plugin/service which publishes them to the data type. Dashed lines point from data types to the plugin/service which reads them synchronously. Dotted lines point from data types to the plugin/service which reads them asynchronously.
See Writing Your Plugin to extend ILLIXR.
Plugin Interdependencies
Some plugins require other plugins to be loaded in order to work. The table below gives a listing of the plugin interdependencies.
| Plugin | Requires | Provided by plugin |
|---|---|---|
| debugview | pose_prediction | fauxpose, pose_lookup, pose_prediction |
| gldemo | pose_prediction | fauxpose, pose_lookup, pose_prediction |
| native_renderer | app | vkdemo |
| display_sink | display_vk | |
| pose_prediction | fauxpose, pose_lookup, pose_prediction | |
| timewarp | timewarp_vk | |
| timewarp_gl | pose_prediction | fauxpose, pose_lookup, pose_prediction |
| timewarp_vk | display_sink | display_vk |
| pose_prediction | fauxpose, pose_lookup, pose_prediction | |
| vkdemo | display_sink | display_vk |
See Getting Started for more information on adding plugins to a profile file.

