Highlights
Fourth beta of NCore 20, adding FTheta tangential distortion and faster motion compensation on top of beta.3: APIs are expected to be stable for 20.0. Install with pip install --pre nvidia-ncore or nvidia-ncore==20.0.0b4. Compared to NCore 19.8, see the beta.3 release notes and the earlier pre-releases they link.
Faster motion compensation (since beta.3)
MotionCompensator.Parameters(method, interpolation_tolerance)selects how point clouds are motion (de)compensated, passed asMotionCompensator(pose_graph, parameters),MotionCompensator.from_sensor_rig(..., parameters=...), andSequenceLoaderV4(..., motion_compensator_parameters=...)/SequenceLoaderV4.open_async(...)for the point clouds of a sequence's lidar / radar sensors.MotionCompensator.Parameters.Method.EXACT(default) keeps the results (up to float rounding of the summation order) and is ~1.5x faster: ~59 ms instead of ~89 ms per frame of a spinning lidar (~335k points).MotionCompensator.Parameters.Method.INTERPOLATEDevaluates the poses on an adaptive grid of timestamps and linearly interpolates the transformations of the points in between, withininterpolation_toleranceof the exact ones (default 1e-5 m, in addition to float32 rounding): ~16 ms per frame (~5.5x faster than beta.3).PoseGraphInterpolator.get_path_timestamps_us(source, target): the pose timestamps of the time-dependent edges between two nodes.
FTheta tangential distortion coefficients (since beta.3, also released for NCore 19 in 19.9.0)
FThetaCameraModelParameters.tangential_coeffs([t0, t1], in pixels, default zeros) holds the tangential distortion of FTheta calibrations, which was previously dropped (up to ~12 px in the image corners of wide-angle cameras). Projection evaluates the term as DriveWorks does, and unprojection inverts it with a fixed number of iterations (FThetaCameraModel.tangential_iterations, worst round trip error ~5e-4 px on a 120 deg FOV camera with strong tangential distortion).- Models without tangential coefficients produce bit-identical results.
- Stored data is unchanged: all-zero coefficients (and an identity
linear_cde) are omitted when encoding, and data without the key loads as zeros. Readers older than beta.4 / 19.9 ignore the coefficients and project as if they were zero. - Non-zero coefficients require
max_angle < pi/2.
- Faster camera models without distortion terms: FTheta skips the linear term when
linear_cdeis the identity, and OpenCV pinhole skips tangential / thin-prism terms whose coefficients are all zero (outputs are bit-identical). New parameter propertiesFThetaCameraModelParameters.has_linear_term/has_tangential_distortion,OpenCVPinholeCameraModelParameters.has_tangential_distortion/has_thin_prism_distortion.
Upgrading from beta.3
SequenceLoaderV4.LidarSensor/RadarSensor/RayBundleSensorrequire amotion_compensatorargument when constructed directly (SequenceLoaderV4.get_lidar_sensor/get_radar_sensorpass the loader's). Loader users are not affected.
For upgrading from NCore 19.x, see the beta.3 release notes.
Changes since v20.0.0-beta.3
➕ Added
⚡ Performance
- (geometry) add an interpolated motion compensation method (84d965b) - @janickm
- (sensors) skip zero tangential and thin-prism terms in OpenCV pinhole (2419967) - @janickm
- (sensors) skip identity linear term in FTheta camera model (1c0c1bf) - @janickm
📚 Documentation
- remove retired skill provenance (e0e7609) - @sanchitgarg
🔧 Chore
All changes since v19.8.0
➕ Added
- (sensors) add FTheta tangential distortion coefficients (b7a158d) - @janickm
- public storage and geometry packages, ray validity helpers (bcd3e49) - @janickm
- BREAKING (sensors) return validity flags from structured lidar ray generation (05e6e86) - @janickm
- BREAKING (sensors) return validity flags from camera ray generation (e1b44a8) - @janickm
- (data) open sequences asynchronously (dfe3729) - @janickm
- (data) asynchronous reads of SequenceLoaderV4 (d49ca46) - @janickm
- (data) asynchronous compat protocols (d97b7ce) - @janickm
- (data) range reads of remote archives for synchronous reads (1880cb6) - @janickm
- (data) asynchronous component reader API (f67caa3) - @janickm
- BREAKING (data) zarr format v3 stores (c5fce26) - @janickm
- BREAKING (data) support zarr-python 3 (2cee604) - @janickm
- BREAKING (data) typed node API for component groups (ff2eeb0) - @janickm
🪲 Fixed
- (sensors) keep projection valid indices 1-D for single valid points (b47c5a0) - @nlucas-nvidia
- (sensors) apply the converged Newton step in the bracketed fisheye inverse (16d2f65) - @janickm
- (sensors) bracket the OpenCV fisheye inverse to the monotonic branch (71a0602) - @janickm
- (data) read single poses with their stored dtype (1de0192) - @janickm
- type narrowing in ncore_export_ply and the argoverse2 converter test (348262a) - @janickm
- (kitti) keep lidar point timestamps integer (5bf8f9f) - @janickm
⚡ Performance
- (geometry) add an interpolated motion compensation method (84d965b) - @janickm
- (sensors) skip zero tangential and thin-prism terms in OpenCV pinhole (2419967) - @janickm
- (sensors) skip identity linear term in FTheta camera model (1c0c1bf) - @janickm
- (data) release index tail reads of opened archives (10c2609) - @janickm
- (data) open remote indexed tar archives with a single request (f57784c) - @janickm
- (data) direct chunk reads with zarr-python 3 (979882a) - @janickm
- (data) node cache for component readers (0d6c43d) - @janickm
- (data) cache decoded label types and schemas in CameraLabelDescriptor.from_dict (1813046) - @janickm
- (data) load label and point-cloud reader data on first use (fe6eaf2) - @janickm
🔄 Changed
- (sensors) construct sensor return types through their defining class (e7c26c3) - @janickm
- (data) restructure IndexedTarArchive (fd9a4f0) - @janickm
- BREAKING (data) implement IndexedTarArchive independently of zarr-python (cd3078f) - @janickm
📚 Documentation
- remove retired skill provenance (e0e7609) - @sanchitgarg
⚙️ CI
- release notes tool in Python, commit check in build-and-test (069aee8) - @janickm
- separate the changes since the previous pre-release in release notes (3c48a54) - @janickm
- publish the documentation built by build-and-test (ed2d016) - @janickm
- refresh the Bazel disk cache on every push (09a3665) - @janickm
- remove merge queue triggers (3f52089) - @janickm
- write release notes into the release commit body (ccc650a) - @janickm
- release from main and release branches when the version changes (e8aba41) - @janickm
🏗️ Build
- pinned cocogitto via rules_multitool (e5ca2c9) - @janickm
- don't compress the repacked patched torch wheel (dc91c12) - @janickm
- add python 3.12 / 3.13 test environments (5b5fc02) - @janickm
🎨 Style
🔧 Chore
🧪 Tests
- (sensors) check camera ray valid flags in the unprojection tests (22db77d) - @janickm
- (sensors) share the lidar model between tests of a parameterization (c490c63) - @janickm
- run tests with a single OpenMP thread (2d4263f) - @janickm
- make tests independent of scipy / numpy versions (f2d59b0) - @janickm
Changes since v20.0.0-beta.3: v20.0.0-beta.3...v20.0.0-beta.4
Full diff: v19.8.0...v20.0.0-beta.4