IsaacCapture / live_trackers
AGENTS.md438 starsChanged 31 days agoApache-2.0View on GitHub
CRITICAL (non-optional): Before editing this package, complete the mandatory AGENTS.md preflight in ../../../AGENTS.md (read every applicable AGENTS.md on your paths, not just this file). - Cache an XDev topology only after every ID/hand pair reaches a settled outcome. Treat XR_ERROR_FEATURE_UNSUPPORTED as settled, but leave transient creation failures retryable even when the IDs do not change. - Store last_update_time_ as int64_t (monotonic ns), not XrTime. - Once per update call: const XrTime xr_time = time_converter_.convert_monotonic_ns_to_xrtime(monotonic_time_ns); then use xr_time for every xrLocate*…
1 other project uses a version of this.
Adopted by
Most recently taken up by
- NVIDIA/IsaacTeleopword for word, first seen Oct 13, 2026
Other versions1 project uses a version of this.
Word for word · 1
- NVIDIA/IsaacTeleop★ 438100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,542 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository28 other files it gives its agents.
- AGENTS.mdAGENTS.md
- deps/cloudxr/webxr_client/AGENTS.mdAGENTS.md
- docs/AGENTS.mdAGENTS.md
- examples/camera_streamer/AGENTS.mdAGENTS.md
- examples/egocap/AGENTS.mdAGENTS.md
- examples/teleop_ros2/AGENTS.mdAGENTS.md
- src/core/AGENTS.mdAGENTS.md
- src/core/codegen/AGENTS.mdAGENTS.md
- src/core/deviceio_base/AGENTS.mdAGENTS.md
- src/core/deviceio_session/AGENTS.mdAGENTS.md
- src/core/deviceio_trackers/AGENTS.mdAGENTS.md
- src/core/log_bridge/AGENTS.mdAGENTS.md
- src/core/replay_trackers/AGENTS.mdAGENTS.md
- src/core/schema/AGENTS.mdAGENTS.md
- src/plugins/sensing/AGENTS.mdAGENTS.md
- src/plugins/sharpa_avatar/AGENTS.mdAGENTS.md
- src/python/isaaccapture/cts/common/AGENTS.mdAGENTS.md
- src/python/isaaccapture/cts/full_body/checker/AGENTS.mdAGENTS.md
- src/python/isaaccapture/cts/full_body/oracle/AGENTS.mdAGENTS.md
- src/python/isaaccapture/cts/hand/AGENTS.mdAGENTS.md
- src/python/isaaccapture/cts/hand/checker/AGENTS.mdAGENTS.md
- src/python/isaaccapture/logging_config/AGENTS.mdAGENTS.md
- src/viz/AGENTS.mdAGENTS.md
- tests/AGENTS.mdAGENTS.md
- .cursor/rules/cmake-structure.mdcCursor rule
- cmake-structureSkill
- rebot-orin-setupSkill
- rebot-orin-setupSkill
The file
We split this AGENTS.md into the rules it gives an agent
9 rules. About 0 are common, 2 are distinctive, and 7 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 8
CRITICAL (non-optional): Before editing this package, complete the mandatory AGENTS.md preflight in ../../../AGENTS.md (read every …
- Very specific: line 17
Full-body limp mode: if the body tracker handle is null and you return early, do not compute xr_time first—only convert after you know you …
- Very specific: line 32
live_trackers: should PUBLIC link oxr::oxr_utils (OpenXR headers come through that INTERFACE target) because headers/sources use OpenXR / … - Distinctive: line 53
When adding MCAP support to a new hand-written tracker impl, all of the following are required together—missing any one causes a build …
- Very specific: line 55
Add XrTimeConverter time_converter_ and int64_t last_update_time_ = 0 members to the impl header.
- Very specific: line 59
Use DeviceDataTimestamp(last_update_time_, last_update_time_, xr_time) — not (time, time, time).
- Very specific: line 60
Add MessageChannelRecordingTraits (or equivalent) to recording_traits.hpp above its generated_recording_traits.inc include — that fragment …
- Distinctive: line 63
Read AGENTS.md before starting.
- Very specific: line 79
No OpenXR in base API: ../deviceio_base/AGENTS.md
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
<!--
SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0
-->Agent notes — live_trackers
CRITICAL (non-optional): Before editing this package, complete the mandatory AGENTS.md preflight in ../../../AGENTS.md (read every applicable AGENTS.md on your paths, not just this file).
Time and OpenXR
- Cache an XDev topology only after every ID/hand pair reaches a settled outcome. Treat
XR_ERROR_FEATURE_UNSUPPORTEDas settled, but leave transient creation failures retryable even when the IDs do not change. - Store
last_update_time_asint64_t(monotonic ns), notXrTime. - Once per
updatecall:const XrTime xr_time = time_converter_.convert_monotonic_ns_to_xrtime(monotonic_time_ns);then usexr_timefor everyxrLocate*/ hand / body call and for MCAP (see below). Do not callconvert_monotonic_ns_to_xrtimeagain in the MCAP block. - Full-body limp mode: if the body tracker handle is null and you return early, do not compute
xr_timefirst—only convert after you know you will call OpenXR.
DeviceDataTimestamp (MCAP)
- Fields 1–2: monotonic ns (e.g.
last_update_time_,last_update_time_). - Field 3 (
sample_time_raw_device_clock): the samexr_timevariable used for OpenXR this frame (not a second conversion).
Includes
- In headers that need both:
#include <oxr_utils/oxr_funcs.hpp>comes before any bare#include <openxr/openxr.h>.oxr_funcs.hppdefinesXR_NO_PROTOTYPESthen includes OpenXR; includingopenxr.hfirst fights that policy. - In
.cppfiles that constructDeviceDataTimestamp, include#include <schema/timestamp_generated.h>explicitly. .cppfiles should include headers for symbols the TU uses (e.g.oxr_funcs.hppforcreateReferenceSpace), not only what the matching.hpphappens to pull in.
CMake
live_trackersshouldPUBLIClinkoxr::oxr_utils(OpenXR headers come through that INTERFACE target) because headers/sources use OpenXR / oxr types.
Schema-based impls are generated
Live impls for trackers declared in
../deviceio_trackers/trackers.toml are emitted into
${CMAKE_BINARY_DIR}/generated/trackers/live_trackers/; only hand-written trackers have .cpp
files in this directory. live_deviceio_factory.{hpp,cpp} stays hand-written but #includes
generated .inc fragments for the manifest trackers' forward decls, try-create thunks, dispatch
rows, and factory methods — do not add rows for a manifest tracker by hand.
Vendor routing is the reason the generated dispatch rows sit as one block at the end of
k_tracker_dispatch: manifest trackers are single-vendor, so their row order does not matter,
while multi-vendor hand-written types must keep their default vendor first.
New tracker MCAP checklist
Applies to hand-written live tracker impls (head, hand, controller, full_body,
message_channel, …). For manifest trackers the impl, its MCAP
channels, and its recording traits are all generated — skip this checklist entirely.
When adding MCAP support to a new hand-written tracker impl, all of the following are required together—missing any one causes a build failure or wrong timestamps:
- Add
XrTimeConverter time_converter_andint64_t last_update_time_ = 0members to the impl header. - Initialize
time_converter_(handles)in the constructor initializer list. - Declare
update(int64_t monotonic_time_ns) override(notXrTime)—they are the same C++ type (int64_t) but semantically different; the base interface uses monotonic ns. - At the top of
update(): storelast_update_time_ = monotonic_time_nsand computeconst XrTime xr_time = time_converter_.convert_monotonic_ns_to_xrtime(monotonic_time_ns). - Use
DeviceDataTimestamp(last_update_time_, last_update_time_, xr_time)— not(time, time, time). - Add
MessageChannelRecordingTraits(or equivalent) torecording_traits.hppabove itsgenerated_recording_traits.incinclude — that fragment is the manifest trackers' half. - Always build (
cmake --build <build_dir> -- -j$(nproc)) before treating work as done. Pre-commit alone does not catch compile errors or clang-format violations enforced at build time. - Read
AGENTS.mdbefore starting. Not after CI breaks.
Publishing tracker output
- An impl may build a
-Tas assembly scratch (name itnative), but what it publishes is aSerialized<XPayload>encoded once perupdate(). Getters return the published handle; the scratch never escapes. - The scratch is a local of
update(), never a member. It is a temporary of one frame, so give it the lifetime of one frame — pass it to a helper by reference rather than promoting it to state. A member would outlive the encode and become a second copy of the payload that every exit path has to keep in step with the published handle; that is exactly how a tracker ends up publishing last frame's values while its scratch says otherwise. Reusing one across frames buys nothing either: the impls allocate the nestedPose/HandJoints/ControllerPosemembers fresh on every tick regardless. - The same applies to any per-frame working buffer, not just the payload: if a member is cleared at the top of
update()and dead by the end of it, it is a local. - Reset the published handle at the top of
update(), and publish only at the bottom. A tracker that queries the device every frame owes the caller this frame's answer or none, so invalidating on entry makes the encode the sole writer and no exit path — early return, limp mode, locate failure, or something added later by someone who never read this file — can leave last frame's snapshot readable. Prefer it to clearing on each throwing path: that only works while someone remembers to enumerate them, and a two-handed tracker has to drop both handles when the first hand fails, because the second was never queried. - The exception is a tracker that retains by design.
SchemaTrackerleaves the last-known handle in place on a tick with no new samples and empties it only when the collection goes away, so its trackers must not reset on entry. The test is whether the tracker is query-driven (reset) or sample-driven (retain). - Encode into a new buffer each frame rather than over the previous one. Consumers hold snapshots, so a caller that read last frame must keep seeing last frame's values; this is what removed the old "valid until the next
session.update()" caveat. SchemaTrackerdoes this for tensor-sourced trackers, and does it without encoding at all: the wire already carries the payload table, so it adopts the sample's buffer. Do not reintroduce an unpack on that path — the only reason it materialises a native is MCAP recording, which is why that unpack is gated onmcap_channels_.
Related docs
- Manifest and generator rules:
../codegen/AGENTS.md - Session update loop:
../deviceio_session/AGENTS.md - No OpenXR in base API:
../deviceio_base/AGENTS.md - Replay counterpart:
../replay_trackers/AGENTS.md
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

