Skip to content

Commit efd72a3

Browse files
[feat] Improve Multisensor mode documentation (#65)
* [feat] Complete Multisensor mode integration Align the depth-or-overlap contract across APIs and tools, document experimental tracking limitations, and add focused configuration and tracking coverage. * [clean] Trim Multisensor release documentation Remove unnecessary standalone artifacts and keep wheel guidance version-independent. * [clean] Extract Multisensor tools integration Keep the API and documentation change focused while tool support receives separate validation. * [test] Use distinct Multisensor stereo buffers Match the tracker input contract by giving each camera its own image allocation. * [fix] Address Multisensor review feedback Clarify runtime behavior and make tests and YAML validation enforce the documented input contracts. * [fix] Align timestamp docs with implementation Document non-decreasing cross-sensor ordering while retaining strict camera-frame ordering.
1 parent 4d2c031 commit efd72a3

22 files changed

Lines changed: 219 additions & 53 deletions

File tree

README.md

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ cuVSLAM is the library by NVIDIA, providing various Visual Tracking Camera modes
2929
# Tracking modes
3030

3131
cuVSLAM's tracker supports several odometry modes selected via `Odometry::Config::odometry_mode`
32-
(C++) / `cuvslam.Odometry.OdometryMode` (Python). Modes differ in which sensors they require, which
32+
(C++) / `cuvslam.Tracker.OdometryMode` (Python). Modes differ in which sensors they require, which
3333
ones they can additionally fuse, and how they handle scale. Pick the mode that matches the most
3434
informative sensor set on your rig:
3535

@@ -39,18 +39,23 @@ informative sensor set on your rig:
3939
| `RGBD` | 1 RGB-D camera (aligned RGB + depth) || `RGBDSettings` | Single depth-aligned camera (e.g. RealSense, TUM RGB-D). |
4040
| `Multicamera` | ≥2 cameras with at least one overlapping pair (a stereo pair) | up to 32 cameras total || Stereo or multi-stereo rigs. Most accurate purely-visual mode. |
4141
| `Inertial` | 1 stereo pair + 1 IMU ||| Stereo VIO. Adds robustness to brief visual failures. |
42-
| `Multisensor` | At least one camera pair with overlapping frustums; cuNLS-enabled build | RGB-D cameras (any subset), 0 or 1 IMU | `MultisensorSettings` | Any-mix RGB / RGB-D rigs with optional IMU. Use when the legacy modes don't fit: ≥3 cameras of mixed RGB and RGB-D types; a multi-camera rig where only a subset provides depth; or RGB-D + IMU fusion (note that `Inertial` mode is stereo-only). |
42+
| `Multisensor` | ≥1 RGB-D camera **or** ≥1 overlapping camera pair; cuNLS-enabled build | Additional RGB/RGB-D cameras, 0 or 1 IMU | `MultisensorSettings` | Any-mix RGB / RGB-D rigs with optional IMU, including one RGB-D camera with IMU. |
4343

4444
Notes:
4545
- `Multisensor` is the only mode that requires a cuNLS-enabled build — see
46-
[Optional: cuNLS](#optional-cunls). All other modes work with the default build.
46+
[cuNLS](#cunls). All other modes work with the default build.
4747
- IMU fusion is available in `Inertial` (always on) and `Multisensor` (auto-enabled when
4848
`Rig::imus` is non-empty).
4949
- For a runnable Multisensor walkthrough on a multi-RGB-D + IMU rig, see
50-
[examples/multisensor/](examples/multisensor/README.md). For the full per-field API reference,
51-
see the [C++](https://nvidia-isaac.github.io/cuVSLAM/cpp/) or
50+
[examples/multisensor/](examples/multisensor/README.md). For the full per-field API reference, see the
51+
[C++](https://nvidia-isaac.github.io/cuVSLAM/cpp/) or
5252
[Python](https://nvidia-isaac.github.io/cuVSLAM/python/) docs.
5353

54+
## Multisensor mode
55+
56+
Multisensor tracking is experimental: tracking may be inaccurate or fail for some sensor configurations and scenes.
57+
The current implementation supports pinhole cameras only.
58+
5459
# Using cuVSLAM
5560

5661
The quickest way to get started is to [install PyCuVSLAM from a pre-built wheel](#install-from-wheels)
@@ -109,6 +114,8 @@ for the following configurations:
109114

110115
**Prerequisite**: [CUDA Toolkit 12 or 13](https://developer.nvidia.com/cuda/toolkit) must be installed separately (not included in the wheels).
111116

117+
Official wheels include cuNLS support for `Multisensor` mode; no separate cuNLS installation is required.
118+
112119
To install (virtual environment is recommended):
113120

114121
1. Go to the [releases page](https://github.com/nvidia-isaac/cuVSLAM/releases).
@@ -200,6 +207,10 @@ required. The source is pinned in `cmake/ext/cunls.cmake`; cuNLS downloads its o
200207
network connection and the CUDA Toolkit are the only prerequisites. The resulting static archive
201208
is bundled into `libcuvslam`.
202209

210+
cuNLS source and license information are published in the
211+
[nvidia-isaac/cuNLS repository](https://github.com/nvidia-isaac/cuNLS). Release wheels and C++ packages built with the
212+
default configuration include cuNLS support and do not require a separate runtime package.
213+
203214
`USE_CUDA` must be `ON`. To build without cuNLS (and disable the multisensor odometry mode that
204215
depends on it), configure with `-DUSE_CUNLS=OFF`.
205216

TROUBLESHOOTING.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -448,13 +448,16 @@ See [Isaac ROS cuVSLAM parameters][].
448448

449449
Approximate accuracy ranking, least to most accurate:
450450

451-
Mono → RGBD → Stereo Inertial → Stereo → MulticameraMultisensor
451+
Mono → RGBD → Stereo Inertial → Stereo → Multicamera; Multisensor depends on its sensor set
452452

453453
Multisensor (see [examples/multisensor/](examples/multisensor/README.md)) does not slot at a fixed
454-
position — its accuracy scales with the sensor set it is given. A single RGB-D + IMU rig in
455-
Multisensor is roughly RGBD-class, whereas a multi-stereo + RGB-D + IMU rig in Multisensor matches
456-
or exceeds Multicamera. Use Multisensor when you have a mixed-camera-type rig or want IMU fusion on
457-
a non-stereo configuration; otherwise prefer the mode that exactly matches your rig.
454+
position — its accuracy scales with the sensor set it is given. It requires at least one RGB-D
455+
camera or one overlapping camera pair and currently supports pinhole cameras only. A single
456+
RGB-D + IMU rig is roughly RGBD-class. A multi-stereo + RGB-D + IMU rig may approach or exceed
457+
Multicamera under favorable conditions, but this is an empirical expectation rather than a
458+
guarantee; benchmark the actual rig and environment. Use Multisensor when you have a
459+
mixed-camera-type rig or want IMU fusion on a non-stereo configuration; otherwise prefer the mode
460+
that exactly matches your rig.
458461

459462
### Adjust motion prediction
460463

cuvslam-skills/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Build, install, and run cuVSLAM / PyCuVSLAM. Covers:
1010

1111
- Environment setup and build (source + wheel + Docker)
1212
- Dataset preparation (KITTI, EuRoC, TUM RGB-D, multi-camera)
13-
- Running all tracking modes (stereo, mono, mono-depth, stereo-inertial, multi-camera)
13+
- Running all tracking modes (stereo, mono, mono-depth, stereo-inertial, multi-camera, Multisensor)
1414
- SLAM workflow (mapping, localization, loop closure)
1515
- Live camera setup (RealSense, ZED, OAK-D, Orbbec)
1616
- C++ tools and ROS 2 integration

cuvslam-skills/cuvslam-onboard/SKILL.md

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ name: cuvslam-onboard
33
description: >
44
Build, install, and run NVIDIA cuVSLAM and PyCuVSLAM from source or wheels.
55
Covers environment setup, dataset preparation, and running examples for all
6-
tracking modes (stereo, mono, mono-depth, stereo-inertial, multi-camera) and
7-
SLAM (mapping, localization, loop closure). Use when asked to: build cuVSLAM,
6+
tracking modes (stereo, mono, mono-depth, stereo-inertial, multi-camera, and
7+
Multisensor) and SLAM (mapping, localization, loop closure). Use when asked to: build cuVSLAM,
88
install PyCuVSLAM, set up cuVSLAM environment, run cuVSLAM examples, prepare
99
KITTI/EuRoC/TUM datasets, run visual odometry, set up live camera tracking
1010
(RealSense/ZED/OAK-D/Orbbec), run cuVSLAM in Docker, or use cuVSLAM C++ tools.
@@ -83,6 +83,7 @@ CMake options:
8383
- `-DUSE_RERUN=ON` — enable Rerun visualization for C++ tools
8484
- `-DCUVSLAM_BUILD_SHARED_LIB=TRUE` — build shared library (default)
8585
- `-DUSE_CUDA=ON` — use CUDA (default)
86+
- `-DUSE_CUNLS=ON` — enable Multisensor mode (default; requires CUDA)
8687

8788
### Install PyCuVSLAM from source
8889

@@ -126,7 +127,7 @@ cuVSLAM supports these visual tracking modes:
126127
| Stereo-Inertial | `OdometryMode.Inertial` (1) | Stereo + IMU for robustness |
127128
| Mono-Depth (RGB-D) | `OdometryMode.RGBD` (2) | Monocular + depth image |
128129
| Monocular | `OdometryMode.Mono` (3) | Single camera (no scale) |
129-
| Multisensor | `OdometryMode.Multisensor` (4) | Any-mix RGB / RGB-D cameras with optional IMU. Requires cuNLS-enabled build. Configure via `MultisensorSettings`. See `examples/multisensor/`. |
130+
| Multisensor | `OdometryMode.Multisensor` (4) | At least one RGB-D camera or one overlapping camera pair, with optional IMU. Requires cuNLS and currently supports pinhole cameras only. Configure via `MultisensorSettings`. See `examples/multisensor/`. |
130131

131132
## 5. Run Examples — Public Datasets
132133

@@ -196,16 +197,30 @@ python3 download_tartan.py
196197
python3 track_multicamera_tartan.py
197198
```
198199

200+
### Multisensor (Tartan Ground, RGB-D + optional IMU)
201+
202+
Multisensor tracking is experimental and may be inaccurate or fail for some sensor configurations and scenes.
203+
204+
```bash
205+
cd examples/multisensor
206+
pip install tartanair # x86_64 only
207+
python3 download_tartan.py
208+
python3 track_multisensor_tartan.py
209+
python3 track_multisensor_tartan.py --no-imu
210+
```
211+
199212
## 6. Run Examples — Live Cameras
200213

201214
See `references/live-cameras.md` for detailed setup per camera.
202-
203-
| Camera | Stereo | VIO | RGB-D | Multi-cam |
204-
|--------|--------|-----|-------|-----------|
205-
| RealSense | `run_stereo.py` | `run_vio.py` | `run_rgbd.py` | `run_multicamera.py` |
206-
| ZED | `run_stereo.py` || `run_rgbd.py` ||
207-
| OAK-D | `run_stereo.py` ||||
208-
| Orbbec | `run_stereo.py` || `run_rgbd.py` ||
215+
This table lists ready-made Python examples shipped in the repository. An em dash means no
216+
ready-made example exists; it does not mean the hardware integration is unsupported.
217+
218+
| Camera | Stereo | VIO | RGB-D | Multi-cam | Multisensor |
219+
|--------|--------|-----|-------|-----------|--------------------------|
220+
| RealSense | `run_stereo.py` | `run_vio.py` | `run_rgbd.py` | `run_multicamera.py` | `run_multisensor.py` |
221+
| ZED | `run_stereo.py` || `run_rgbd.py` |||
222+
| OAK-D | `run_stereo.py` |||||
223+
| Orbbec | `run_stereo.py` || `run_rgbd.py` |||
209224

210225
## 7. C++ API
211226

cuvslam-skills/cuvslam-onboard/references/dataset-guides.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Detailed setup for each public dataset supported by cuVSLAM examples.
77
- [EuRoC MAV](#euroc-mav)
88
- [TUM RGB-D](#tum-rgb-d)
99
- [Multi-Camera Datasets](#multi-camera-datasets)
10+
- [Multisensor](#multisensor)
1011
- [Distortion Models](#distortion-models)
1112
- [EDEX File Format](#edex-file-format)
1213
- [Converting ROS Bags](#converting-ros-bags)
@@ -155,6 +156,23 @@ ros2 run isaac_ros_rosbag_utils extract_edex \
155156

156157
---
157158

159+
## Multisensor
160+
161+
The TartanGround example exercises multiple RGB-D cameras with an optional IMU:
162+
163+
```bash
164+
cd examples/multisensor
165+
pip install tartanair # x86_64 only; on Jetson, download on x86 and transfer
166+
python3 download_tartan.py
167+
python3 track_multisensor_tartan.py
168+
python3 track_multisensor_tartan.py --no-imu
169+
```
170+
171+
Multisensor requires `USE_CUNLS=ON`, pinhole cameras, and at least one RGB-D camera or one overlapping camera pair.
172+
Multisensor tracking is experimental and may be inaccurate or fail for some sensor configurations and scenes.
173+
174+
---
175+
158176
## Distortion Models
159177

160178
| Model | Coefficients | Enum |

cuvslam-skills/cuvslam-onboard/references/live-cameras.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Detailed setup for each camera platform supported by PyCuVSLAM.
1212

1313
## RealSense
1414

15-
**Supported modes:** Stereo, Stereo-Inertial (VIO), Mono-Depth (RGB-D), Multi-Camera
15+
**Supported modes:** Stereo, Stereo-Inertial (VIO), Mono-Depth (RGB-D), Multi-Camera, Multisensor
1616

1717
### Install librealsense
1818

@@ -42,6 +42,7 @@ python3 run_stereo.py # Stereo odometry
4242
python3 run_vio.py # Stereo-inertial (requires IMU calibration)
4343
python3 run_rgbd.py # Mono-depth (enable IR emitter, use RGB not IR for tracking)
4444
python3 run_multicamera.py # Multi-camera (needs frame_nano_rig.yaml with your extrinsics)
45+
python3 run_multisensor.py # Multisensor RGB-D + IMU (requires cuNLS; pinhole only)
4546
```
4647

4748
### IMU calibration for VIO

cuvslam-skills/cuvslam-troubleshoot/SKILL.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,11 @@ If the user has not provided a config, say:
8080
> "To root cause this accurately I need the cuVSLAM configuration you were using. Please share the parameters file (for Isaac ROS) or the relevant `OdometryConfig` / `CUVSLAM_Configuration` settings you had set when the issue occurred."
8181
8282
Key parameters to note once you have the config:
83-
- `tracking_mode` (Isaac ROS) / `OdometryMode` (Python) — determines whether IMU is used (`0`/`Multicamera`=VO only, `1`/`Inertial`=VIO). Knowing this up front directs the diagnosis toward vision or IMU root causes.
83+
- `tracking_mode` (Isaac ROS) / `OdometryMode` (Python) — `0`/`Multicamera` is VO-only, while
84+
`1`/`Inertial` requires and uses an IMU. `Multisensor` is different: it automatically enables IMU fusion only when
85+
`Rig.imus` is non-empty, so the mode value alone does not determine IMU use. Verify the rig's IMU list alongside
86+
cuNLS availability, `depth_camera_ids`, and pinhole calibration.
87+
Knowing this up front directs the diagnosis toward vision, depth, or IMU root causes.
8488
- `rectified_images` (Isaac ROS) / `rectified_stereo_camera` (C++ API) — wrong value flips the entire stereo pipeline
8589
- `image_jitter_threshold_ms` — tolerated timestamp jitter between left/right images; too tight a value causes frames to be dropped silently
8690
- `async_sba` / `sync_mode` — affects reproducibility

doc/index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ Tracking modes
99
--------------
1010

1111
The tracker supports several odometry modes — see `cuvslam::Odometry::OdometryMode` for the enum
12-
and per-mode requirements. The unified `Multisensor` mode (any mix of RGB / RGB-D cameras with an
13-
optional IMU; requires a cuNLS-enabled build) is configured through
12+
and per-mode requirements. `Multisensor` accepts at least one RGB-D camera or one overlapping camera
13+
pair, with an optional IMU, and requires a cuNLS-enabled build. It is configured through
1414
`cuvslam::Odometry::MultisensorSettings`. A high-level mode chooser table lives in the top-level
1515
README's "Tracking modes" section.
1616

examples/euroc/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ PyCuVSLAM supports multiple visual tracking modes. You can specify the desired t
1414

1515
* **Monocular**: Visual tracking using a monocular camera. This mode provides accurate camera rotation estimation but does not estimate scale. (set as `OdometryMode(3)` or `OdometryMode.Mono`)
1616

17-
* **Multisensor**: Unified mode that accepts any mix of plain RGB and RGB-D cameras with an optional single IMU (set as `OdometryMode(4)` or `OdometryMode.Multisensor`). Requires a cuNLS-enabled build and is configured via `MultisensorSettings`; see [examples/multisensor/](../multisensor/README.md) for a runnable walkthrough.
17+
* **Multisensor**: Unified mode that accepts at least one RGB-D camera or one overlapping camera pair, with optional additional RGB/RGB-D cameras and one IMU (set as `OdometryMode(4)` or `OdometryMode.Multisensor`). Requires a cuNLS-enabled build, currently supports pinhole cameras only, and is configured via `MultisensorSettings`. See [examples/multisensor/](../multisensor/README.md) for a runnable walkthrough.
1818

1919
PyCuVSLAM exercises three modes on the EuRoC MAV dataset — Stereo (`Multicamera`), Stereo-Inertial (`Inertial`), and Monocular (`Mono`) — because *Mono-Depth* has no aligned depth stream (see the [TUM-RGBD dataset example](../tum/README.md)) and *Multisensor* has its own [example](../multisensor/README.md). You can try different tracking modes by modifying the following line in `track_euroc.py`:
2020

examples/multisensor/README.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,28 @@
1-
# Tutorial: Running PyCuVSLAM Multisensor Odometry (multi RGB-D + IMU)
1+
# Tutorial: PyCuVSLAM Multisensor Odometry (multi RGB-D + IMU)
2+
3+
> **Experimental:** Tracking may be inaccurate or fail for some sensor configurations and scenes.
24
35
This tutorial demonstrates how to run PyCuVSLAM in **Multisensor** odometry
46
mode, which solves a single tightly-coupled cuNLS step over any mix of plain
57
RGB cameras, RGB-D cameras, and one optional IMU. The example uses two
68
RGB-D cameras (`lcam_front`, `lcam_back`) plus a synthetic IMU from the
79
[TartanGround dataset](https://tartanair.org/tartanground/).
810

11+
## Requirements
12+
13+
- Use an official wheel or build with `USE_CUNLS=ON`.
14+
- Configure at least one RGB-D camera in `depth_camera_ids`, or provide at least one camera pair with overlapping
15+
frustums. A single RGB-D camera is valid, with or without an IMU.
16+
- Use pinhole cameras. Other camera models are not supported by the current solver.
17+
- Align each depth image pixel-for-pixel with the RGB image at the same camera index. PyCuVSLAM accepts 2D `uint16`
18+
depth; the C++ API accepts `UINT16` or `FLOAT32`.
19+
- Configure no more than one IMU. Serialize image and IMU calls in non-decreasing timestamp order; camera frame
20+
timestamps must be strictly increasing.
21+
22+
Construction raises `ValueError` when the rig or settings are invalid. A valid tracker may return a
23+
`PoseEstimate` with `world_from_rig=None` while initializing or after tracking loss. Configured depth streams may be
24+
omitted from an individual frame after a sensor drop, but every supplied depth must match a configured camera index.
25+
926
## Set Up the PyCuVSLAM Environment
1027

1128
Refer to the [Installation Guide](../README.md#prerequisites) for detailed

0 commit comments

Comments
 (0)