Device Trackers#
Trackers (defined in src/core/deviceio_trackers) are the consumer-side API for reading device
data from an active DeviceIOSession.
Each tracker manages one logical device, queries the OpenXR runtime every frame,
and exposes the latest sample through typed get_*() accessors.
There are two categories of trackers:
OpenXR-direct trackers – read pose and input data through standard OpenXR
APIs (xrLocateSpace, xrSyncActions, etc.):
HeadTracker – HMD head pose
HandTracker – articulated hand joints (left and right)
ControllerTracker – controller poses and button/axis inputs (left and right)
FullBodyTrackerPico – 24-joint full body pose (PICO
XR_BD_body_tracking)
SchemaTracker-based trackers – create new device type by defining a FlatBuffer schema and reading it from OpenXR tensor collections via the SchemaTracker utility.
FrameMetadataTrackerOak – per-stream frame metadata from OAK cameras
Generic3AxisPedalTracker – foot pedal axis values
All trackers follow the same lifecycle:
Construct the tracker.
Pass it (along with any other trackers) to
DeviceIOSession::run().Call
session.update()each frame.Read data with the tracker’s
get_*()method.
Note
The DeviceIOSession is considered a low-level API. In practice, it is recommended to
use the Teleop Session to manage a teleop session with multiple
device trackers and retargeters to work together.
Data Schema Convention#
Every tracker’s data is defined by a FlatBuffers schema under src/core/schema/fbs. Each schema follows a three-tier convention:
// 1. Inner data table -- the actual payload
table Xxx {
field_a: SomeType (id: 0);
field_b: AnotherType (id: 1);
}
// 2. Tracked wrapper -- used by the in-memory tracker API.
// data is null when the tracked entity is inactive.
table XxxTracked {
data: Xxx (id: 0);
}
// 3. Record wrapper -- used as the MCAP recording root type.
// Adds a DeviceDataTimestamp alongside the payload.
table XxxRecord {
data: Xxx (id: 0);
timestamp: DeviceDataTimestamp (id: 1);
}
root_type XxxRecord;
Inner data table (e.g.
HeadPose,HandPose,ControllerSnapshot) – contains the device-specific fields. All fields are present when the parent wrapper’sdatapointer is non-null.Tracked wrapper (e.g.
HeadPoseTracked) – wraps the inner data in an optionaldatafield. The in-memoryget_*()accessors return a reference to this wrapper. Whendataisnullptr(C++) orNone(Python), the device is inactive or no sample has arrived yet.Record wrapper (e.g.
HeadPoseRecord) – wraps the inner data plus aDeviceDataTimestamp. This is theroot_typewritten to MCAP channels by the recorder viaserialize_all().
Tracker Reference#
HeadTracker#
Tracks the HMD head pose via the OpenXR view space.
Schema: src/core/schema/fbs/head.fbs
C++ header:
#include <deviceio/head_tracker.hpp>Python import:
from isaacteleop.deviceio import HeadTrackerRecord channels:
head| MCAP schema:core.HeadPoseRecordTests:
Examples:
HandTracker#
Tracks articulated hand joints (26 joints per hand, following the OpenXR
XrHandJointEXT ordering) using the XR_EXT_hand_tracking extension.
Schema: src/core/schema/fbs/hand.fbs
C++ header:
#include <deviceio/hand_tracker.hpp>Python import:
from isaacteleop.deviceio import HandTrackerRecord channels:
left_hand,right_hand| MCAP schema:core.HandPoseRecordTests:
Examples:
ControllerTracker#
Tracks both left and right controllers – grip and aim poses, plus button and axis inputs. Uses standard OpenXR action bindings.
C++ header:
#include <deviceio/controller_tracker.hpp>Python import:
from isaacteleop.deviceio import ControllerTrackerRecord channels:
left_controller,right_controller| MCAP schema:core.ControllerSnapshotRecordTests:
Examples:
FullBodyTrackerPico#
Tracks 24 body joints on PICO devices using the XR_BD_body_tracking
extension.
C++ header:
#include <deviceio/full_body_tracker_pico.hpp>Python import:
from isaacteleop.deviceio import FullBodyTrackerPicoRecord channels:
full_body| MCAP schema:core.FullBodyPosePicoRecordTests:
FrameMetadataTrackerOak#
Multi-channel tracker for per-frame metadata from OAK camera streams. Uses the SchemaTracker utility internally.
Schema: src/core/schema/fbs/oak.fbs
C++ header:
#include <deviceio/frame_metadata_tracker_oak.hpp>Python import:
from isaacteleop.deviceio import FrameMetadataTrackerOakRecord channels: one per configured stream (e.g.
Color,MonoLeft) | MCAP schema:core.FrameMetadataOakRecordTests:
Examples:
Generic3AxisPedalTracker#
Reads foot pedal axis values pushed by a device plugin through OpenXR tensor collections. Uses the SchemaTracker utility internally.
Schema: src/core/schema/fbs/pedals.fbs
C++ header:
#include <deviceio/generic_3axis_pedal_tracker.hpp>Python import:
from isaacteleop.deviceio import Generic3AxisPedalTrackerRecord channels:
pedals| MCAP schema:core.Generic3AxisPedalOutputRecordTests:
Examples:
Note
The Python method is named get_pedal_data() (instead of the C++
get_data()).
Usage Examples#
For end-to-end usage patterns combining trackers with a DeviceIOSession, see:
For higher-level usage with the teleop session manager and retargeting, see: