ILLIXR plugins
This page details the structure of ILLIXR's plugins and how they interact with each other.
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.
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
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.
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:
- Calls
vulkan::display_provider - Calls
pose_prediction - Asynchronously reads
compressed_framefromcompressed_framestopic. - Publishes
fast_pose_typetorender_posetopic.
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.
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
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
tcp_network_backend
Provides network communications over TCP.
Details Code
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.
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.