Skip to content

[feat] Improve Multisensor mode documentation#65

Merged
vikuznetsov-nvidia merged 6 commits into
mainfrom
vikuznetsov/experimental-multisensor
Jul 22, 2026
Merged

[feat] Improve Multisensor mode documentation#65
vikuznetsov-nvidia merged 6 commits into
mainfrom
vikuznetsov/experimental-multisensor

Conversation

@vikuznetsov-nvidia

@vikuznetsov-nvidia vikuznetsov-nvidia commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

Align the depth-or-overlap contract across APIs and tools, document experimental tracking limitations, and add focused configuration and tracking coverage.

Summary by CodeRabbit

  • New Features

    • Added YAML support for odometry_mode: "multisensor" with multisensor_settings (depth camera IDs, scale factor, and depth-stereo tracking flag).
    • Expanded Multisensor documentation and examples, including RealSense “multisensor” run instructions.
  • Bug Fixes

    • Duplicate depth-camera IDs are now rejected with clear errors.
    • Improved validation messaging for missing/insufficient Multisensor camera configuration.
  • Documentation

    • Clarified Multisensor requirements (RGB-D or overlapping camera pairs), pinhole-only limitation, cuNLS availability, and experimental/accuracy caveats.
    • Updated troubleshooting guidance to better distinguish Multicamera vs Multisensor.
  • Tests

    • Added unit tests covering Multisensor variants and configuration validation.

Align the depth-or-overlap contract across APIs and tools, document experimental tracking limitations, and add focused configuration and tracking coverage.
Remove unnecessary standalone artifacts and keep wheel guidance version-independent.
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 13009f49-162d-4aa7-9f1f-a935e9be069b

📥 Commits

Reviewing files that changed from the base of the PR and between 78d4a8d and 3d67fe1.

📒 Files selected for processing (7)
  • TROUBLESHOOTING.md
  • cuvslam-skills/cuvslam-onboard/SKILL.md
  • cuvslam-skills/cuvslam-troubleshoot/SKILL.md
  • examples/multisensor/README.md
  • python/test/test_tracking.py
  • python/tracker.py
  • python/utils.py

📝 Walkthrough

Walkthrough

Multisensor odometry now has expanded rig validation, Python/YAML configuration, tracking tests, API documentation, onboarding guidance, and example coverage. Documentation identifies cuNLS availability, pinhole-camera support, and experimental behavior.

Changes

Multisensor mode support

Layer / File(s) Summary
Core contracts and validation
libs/cuvslam/*, libs/odometry/*
Multisensor requirements, duplicate depth-camera rejection, calibration errors, experimental behavior, and IMU-related state documentation are updated.
Python configuration and tests
python/*
Python YAML parsing accepts multisensor and multisensor_settings; API documentation and tests cover supported variants and invalid configurations.
Documentation and examples
README.md, doc/*, cuvslam-skills/*, examples/*, TROUBLESHOOTING.md
Multisensor setup, build requirements, supported cameras, commands, limitations, and example descriptions are expanded across user-facing documentation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

  • nvidia-isaac/cuVSLAM#49: Related multisensor validation, Python configuration, bindings, tests, and documentation updates.

Suggested reviewers: hrabeti-nvidia, slepichev

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 46.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately summarizes the main documentation-focused Multisensor changes.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch vikuznetsov/experimental-multisensor

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cuvslam-skills/cuvslam-onboard/SKILL.md`:
- Around line 216-221: Clarify the camera configuration table’s scope by
labeling entries as ready-made examples if the rows only list available scripts,
and state that em dashes mean no example exists rather than unsupported
hardware. Otherwise, update the ZED, OAK-D, and Orbbec Multisensor entries to
match the supported integrations described in README.md.

In `@cuvslam-skills/cuvslam-troubleshoot/SKILL.md`:
- Around line 83-86: Update the tracking-mode diagnostic guidance around
tracking_mode/OdometryMode to state that Multisensor uses IMU fusion
automatically when Rig.imus is non-empty, rather than inferring IMU usage from
the mode value alone. Explicitly distinguish Multisensor from Inertial mode and
direct diagnosis to verify the rig’s IMU list.

In `@examples/multisensor/README.md`:
- Line 19: Update the multisensor README guidance to require strictly increasing
(or strictly ascending) timestamps instead of non-decreasing timestamps,
matching the validation in the tracker timestamp-handling logic.

In `@libs/launcher/multi_camera_launcher_base.cpp`:
- Around line 122-123: Update the calibration error message in
MultiCameraBaseLauncher to depend on FLAGS_mode: use the
depth-camera-or-overlapping-pair wording only for Multisensor mode, while
preserving the existing stereo-pair requirement message for Multicamera and
Inertial modes.

In `@python/test/test_tracking.py`:
- Around line 129-135: Add the tracker return-type annotation to the
_create_multisensor_tracker helper, using the existing vslam.Tracker type, while
preserving its current exception handling and skip behavior.
- Around line 166-173: Adjust the timestamp generation in the test loop around
tracker.register_imu_measurement and tracker.track so every IMU timestamp is
strictly greater than the preceding tracking timestamp, including frame 1 sample
0. Preserve the existing measurement cadence while adding the necessary offset
between frames.
- Around line 151-157: Update the “stereo without depth” subtest in the tracking
test to pass two distinct image arrays to each tracker.track call instead of
reusing the same image buffer. Preserve the existing timestamps, tracker setup,
and multisensor configuration while ensuring the stereo inputs have separate
underlying NumPy storage.

In `@python/utils.py`:
- Around line 113-123: Validate that multisensor_settings["depth_camera_ids"] is
a list before iterating or converting its elements. In the depth_camera_ids
handling within the multisensor settings branch, raise a clear ValueError for
non-list values, while preserving the existing integer conversion for valid
lists.

In `@tools/cuvslam_app/cuvslam_app.py`:
- Around line 689-691: Update the --enable_depth_stereo_tracking argument
definition in the cuvslam_app argument parser so its default preserves the
intended enabled behavior for multisensor mode instead of argparse supplying
False. Ensure explicit user-provided values still override the default and
multisensor initialization receives True when the option is omitted.

In `@tools/cuvslam_app/edex_reader.py`:
- Around line 71-73: Preserve all configured multisensor depth streams: in
tools/cuvslam_app/edex_reader.py lines 71-73, update the RGB-D parsing,
remapping, and replay flow to retain every depth-camera ID instead of a single
OdometryRGBDSettings; in tools/cuvslam_app/cuvslam_app.py lines 203-207,
populate OdometryMultisensorSettings.depth_camera_ids from the complete parsed
list; and in tools/cuvslam_app/cuvslam_app.py lines 446-456, select a
multisensor-aware reader path rather than the binary rgbd_mode model while
retaining optional-depth behavior for overlapping-only rigs.

In `@TROUBLESHOOTING.md`:
- Around line 453-458: Revise the Multisensor comparison in the troubleshooting
documentation to remove the unconditional “matches or exceeds Multicamera”
ranking. Describe multi-stereo + RGB-D + IMU performance as an empirical
expectation that depends on conditions, or cite specific benchmark conditions
supporting the comparison, while preserving the existing rig-selection guidance.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 4e9936ac-91a4-4f80-84a6-3f5d732ffb56

📥 Commits

Reviewing files that changed from the base of the PR and between b8c4992 and 2e0d115.

📒 Files selected for processing (32)
  • README.md
  • TROUBLESHOOTING.md
  • cuvslam-skills/README.md
  • cuvslam-skills/cuvslam-onboard/SKILL.md
  • cuvslam-skills/cuvslam-onboard/references/dataset-guides.md
  • cuvslam-skills/cuvslam-onboard/references/live-cameras.md
  • cuvslam-skills/cuvslam-troubleshoot/SKILL.md
  • doc/index.md
  • examples/euroc/README.md
  • examples/multisensor/README.md
  • examples/multisensor/track_multisensor_tartan.py
  • examples/realsense/README.md
  • examples/realsense/run_multisensor.py
  • examples/realsense/run_vio.py
  • libs/cuvslam/cuvslam2.cpp
  • libs/cuvslam/cuvslam2.h
  • libs/launcher/launcher_create.cpp
  • libs/launcher/multi_camera_launcher_base.cpp
  • libs/odometry/svo_config.h
  • libs/utils/test/cuvslam_yaml_config_test.cpp
  • python/cuvslam2.cpp
  • python/docs/api.rst
  • python/test/test_tracking.py
  • python/tracker.py
  • python/utils.py
  • tools/cuvslam_api_launcher/README.md
  • tools/cuvslam_api_launcher/api_config.yaml
  • tools/cuvslam_api_launcher/cuvslam_api_launcher.cpp
  • tools/cuvslam_app/README.md
  • tools/cuvslam_app/conversions.py
  • tools/cuvslam_app/cuvslam_app.py
  • tools/cuvslam_app/edex_reader.py

Comment thread cuvslam-skills/cuvslam-onboard/SKILL.md
Comment thread cuvslam-skills/cuvslam-troubleshoot/SKILL.md Outdated
Comment thread examples/multisensor/README.md Outdated
Comment thread libs/launcher/multi_camera_launcher_base.cpp Outdated
Comment thread python/test/test_tracking.py Outdated
Comment thread python/test/test_tracking.py Outdated
Comment thread python/utils.py
Comment thread tools/cuvslam_app/cuvslam_app.py Outdated
Comment thread tools/cuvslam_app/edex_reader.py Outdated
Comment thread TROUBLESHOOTING.md Outdated
Keep the API and documentation change focused while tool support receives separate validation.
@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown

Test Results

Status Platform Language Total Passed Failed Errors Skipped
Orin C++ 16 16 0 0 0
Orin Python 71 70 0 0 1
Thor C++ 16 16 0 0 0
Thor Python 71 70 0 0 1
x86_64 C++ 16 16 0 0 0
x86_64 Python 71 70 0 0 1

cuVSLAM Evaluation KPIs

Config Dataset ATE,% ARE,º/m Kabsch, Losts, diff ATE,% diff ARE,º/m diff Kabsch, diff Losts, FPS,Hz
x86_64-cuda12.6.3-ubuntu24.04 KITTI-STEREO_ODOM 0.8463 0.0024 2.8404 0 NA NA NA NA 307.1
x86_64-cuda12.6.3-ubuntu24.04 KITTI-STEREO_SLAM 0.7549 0.002 1.8891 0 NA NA NA NA 182.7

Artifacts

@vikuznetsov-nvidia vikuznetsov-nvidia changed the title [feat] Improve Multisensor mode integration [feat] Improve Multisensor mode documentation Jul 21, 2026
Match the tracker input contract by giving each camera its own image allocation.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
python/test/test_tracking.py (1)

176-190: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Skip configuration-error tests when Multisensor support is unavailable.

These tests bypass _create_multisensor_tracker. On builds without cuNLS, construction raises the cuNLS-support error before the expected depth/duplicate-camera validation, so both tests fail instead of being skipped. Add a shared capability guard before asserting the configuration-specific errors.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@python/test/test_tracking.py` around lines 176 - 190, Update
test_multisensor_requires_depth_or_overlap and
test_multisensor_rejects_duplicate_depth_camera_ids to share a capability guard
that skips both tests when Multisensor/cuNLS support is unavailable. Place the
guard before constructing the tracker or asserting configuration-specific
ValueErrors, while preserving the existing validation assertions when support is
available.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@python/test/test_tracking.py`:
- Around line 176-190: Update test_multisensor_requires_depth_or_overlap and
test_multisensor_rejects_duplicate_depth_camera_ids to share a capability guard
that skips both tests when Multisensor/cuNLS support is unavailable. Place the
guard before constructing the tracker or asserting configuration-specific
ValueErrors, while preserving the existing validation assertions when support is
available.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 14cb6c45-5a58-4e31-a81a-525f3269fbe0

📥 Commits

Reviewing files that changed from the base of the PR and between 2e0d115 and 78d4a8d.

📒 Files selected for processing (1)
  • python/test/test_tracking.py

Clarify runtime behavior and make tests and YAML validation enforce the documented input contracts.
Document non-decreasing cross-sensor ordering while retaining strict camera-frame ordering.
@vikuznetsov-nvidia
vikuznetsov-nvidia merged commit efd72a3 into main Jul 22, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants