[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-nvidia-ncore":3,"mdc-e1u9v3-key":34,"related-org-nvidia-ncore":8933,"related-repo-nvidia-ncore":9093},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"ncore","convert sensor datasets to NVIDIA NCore format","Use when converting any sensor dataset into NVIDIA NCore V4 format (and feeding it to NuRec or a robotics-to-sim \"r2s\" pipeline). Covers ingesting raw cameras, LiDARs, radars, IMUs, depth or stereo into V4 sequences; authoring a new converter from the template; adapting PAI \u002F Waymo \u002F PandaSet \u002F NuScenes to V4; handling non-AV rigs (mono+depth, mono+lidar, stereo, multi-stereo, RGB-D, COLMAP \u002F SfM, ROS2 bag); and diagnosing a broken converter against `validate.py`. Do NOT use to train reconstructions (use `nre`) or to extract per-object 3D assets (use `asset-harvester`). Trigger keywords: ncore, ncore v4, convert, ingest, zarr, itar, nurec, waymo, pandaset, nuscenes, pai, hyperion, colmap, scannetpp, stereo, multi-stereo, mono+depth, mono+lidar, kitti, sfm, camera, lidar, radar, imu, cuboid, poses, intrinsics, ego mask, ros2, rosbag, mcap, realsense, zed, rgb-d, r2s, robotics, sam2.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"nvidia","NVIDIA","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnvidia.png",[12,16,19,20],{"name":13,"slug":14,"type":15},"Robotics","robotics","tag",{"name":17,"slug":18,"type":15},"Data Engineering","data-engineering",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Simulation","simulation",16,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fnurec-skills","2026-07-14T05:32:35.853952","CC-BY-4.0 AND Apache-2.0",4,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Agent skills for Neural Reconstruction Engine","https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fnurec-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fncore","---\nname: ncore\ndescription: >-\n  Use when converting any sensor dataset into NVIDIA NCore V4 format\n  (and feeding it to NuRec or a robotics-to-sim \"r2s\" pipeline).\n  Covers ingesting raw cameras, LiDARs, radars, IMUs, depth or stereo\n  into V4 sequences; authoring a new converter from the template;\n  adapting PAI \u002F Waymo \u002F PandaSet \u002F NuScenes to V4; handling non-AV\n  rigs (mono+depth, mono+lidar, stereo, multi-stereo, RGB-D, COLMAP \u002F\n  SfM, ROS2 bag); and diagnosing a broken converter against\n  `validate.py`. Do NOT use to train reconstructions (use `nre`) or\n  to extract per-object 3D assets (use `asset-harvester`). Trigger\n  keywords: ncore, ncore v4, convert, ingest, zarr, itar, nurec,\n  waymo, pandaset, nuscenes, pai, hyperion, colmap, scannetpp,\n  stereo, multi-stereo, mono+depth, mono+lidar, kitti, sfm, camera,\n  lidar, radar, imu, cuboid, poses, intrinsics, ego mask, ros2,\n  rosbag, mcap, realsense, zed, rgb-d, r2s, robotics, sam2.\nversion: \"0.1.0\"\ntools:\n  - Shell\n  - Read\n  - Write\nlicense: CC-BY-4.0 AND Apache-2.0\nmetadata:\n  author: NVIDIA NCore\n  tags:\n    - ncore\n    - data-conversion\n    - autonomous-vehicles\n    - robotics\n    - sensors\n  upstream: https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore\n  spec_docs: https:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fdata\u002Fconventions.html\n  release_tag: \"2026.04\"\n---\n\n# NCore V4 Data Conversion\n\n## Purpose\n\nConvert any sensor recording (cameras, LiDAR, radar, IMU, depth,\nstereo, COLMAP\u002FSfM, ROS 2 bag) into a valid NVIDIA **NCore V4** store\nso it can be consumed by NuRec \u002F Asset Harvester \u002F `ncore_vis`, or\nwired into a robotics-to-sim (\"r2s\") pipeline. Drive the existing\nin-tree converters (PAI, Waymo, COLMAP\u002FScanNet++) or author a new\nconverter from `ncore_template\u002F`.\n\n**Use this skill when:** the user has raw sensor data (any rig) that\nNuRec or Asset Harvester needs to ingest, or when an existing\nconverter is failing `validate.py` \u002F producing NuRec data-quality\ncomplaints.\n\n**Do NOT use this skill when:**\n\n- The user is **already on V4** and only wants to train or render\n  (use the `nre` skill).\n- The user wants per-object 3D assets from sparse views (use\n  `asset-harvester`).\n- The user only needs to browse \u002F pick an existing NVIDIA dataset\n  (use `physical-ai-datasets`).\n\nThis skill teaches an agent to take **any** sensor dataset and produce a valid\nNCore V4 store that NuRec \u002F Asset Harvester \u002F `ncore_vis` will accept. It covers\nboth **driving the existing in-tree converters** (PAI, Waymo, COLMAP\u002FScanNet++)\nand **writing a new one** for unsupported formats (PandaSet, NuScenes, KITTI,\nstereo, mono+depth, mono+lidar, custom robotics rigs).\n\n## Table of Contents\n\n1. [When to use which path](#when-to-use-which-path)\n2. [Install & references](#install--references)\n3. [Mental model — the V4 store](#mental-model--the-v4-store)\n4. [Path A — drive an existing in-tree converter](#path-a--drive-an-existing-in-tree-converter)\n5. [Path B — author a new converter from the template](#path-b--author-a-new-converter-from-the-template)\n6. [V4 conventions you must obey](#v4-conventions-you-must-obey)\n7. [Format recipes (AV)](#format-recipes-av)\n   - [PAI (NVIDIA Physical AI Autonomous Vehicles, HuggingFace)](#pai-nvidia-physical-ai-autonomous-vehicles-huggingface)\n   - [Waymo Open](#waymo-open)\n   - [PandaSet](#pandaset)\n   - [NuScenes](#nuscenes)\n8. [Format recipes (non-AV \u002F sensor-only)](#format-recipes-non-av--sensor-only)\n   - [Mono camera (no depth, no LiDAR) → COLMAP track](#mono-camera-no-depth-no-lidar--colmap-track)\n   - [Stereo cameras](#stereo-cameras)\n   - [Multi-stereo rig (surround stereo)](#multi-stereo-rig-surround-stereo)\n   - [Mono + depth (RGB-D \u002F learned depth)](#mono--depth-rgb-d--learned-depth)\n   - [Mono + LiDAR (handheld \u002F robot)](#mono--lidar-handheld--robot)\n   - [Solid-state \u002F non-repetitive LiDAR (Livox)](#solid-state--non-repetitive-lidar-livox)\n   - [IMU + camera (visual-inertial)](#imu--camera-visual-inertial)\n   - [ROS2 bag (MCAP \u002F SQLite3)](#ros2-bag-mcap--sqlite3)\n   - [Aerial \u002F drone](#aerial--drone)\n9. [Robotics pipeline shards (r2s)](#robotics-pipeline-shards-r2s)\n10. [Validation & end-to-end NuRec](#validation--end-to-end-nurec)\n11. [Common failure modes (and the fix file)](#common-failure-modes-and-the-fix-file)\n12. [Additional resources](#additional-resources)\n\n---\n\n## When to use which path\n\n| You have… | Use |\n|-----------|-----|\n| PAI clip on HuggingFace, or a local PAI clip directory | **Path A** — `tools\u002Fdata_converter\u002Fpai:convert` (`pai-stream-v4` \u002F `pai-v4`) |\n| Waymo `.tfrecord` files | **Path A** — `tools\u002Fdata_converter\u002Fwaymo:convert` (`waymo-v4`) |\n| COLMAP scene (or ScanNet++ DSLR) | **Path A** — `tools\u002Fdata_converter\u002Fcolmap:convert` (`colmap-v4` \u002F `scannetpp-v4`) |\n| Mono RGB images, no poses | **Path A.5** — run COLMAP first, then `colmap-v4` |\n| PandaSet, NuScenes, KITTI, Argoverse, custom AV rig | **Path B** — author from `ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py` |\n| Stereo \u002F mono+depth \u002F mono+lidar \u002F robotics | **Path B** |\n| Already have parsed numpy\u002Ftorch arrays in memory | **Path B** but skip Bazel — use `ncore.data.v4` API directly |\n\nIf a candidate path exists in upstream, **prefer it**. Hand-rolling a Waymo or\nPAI converter on top of the template is wasted work and almost certainly wrong\n(rolling-shutter timing, FTheta intrinsics, Waymo camera-frame rotation, etc).\n\n---\n\n## Prerequisites\n\n- Linux host with Python ≥ 3.10 and `pip`.\n- `git` for the upstream converter sources.\n- `bazel` only if you run the in-tree converters (Path A); pure-Python\n  in-process writes (`ncore.data.v4`) need no Bazel.\n- Disk: budget tens of GB per converted clip; pre-zarr scratch can be\n  larger than the final `.zarr.itar`.\n- HuggingFace token (`HF_TOKEN`) only if pulling a gated PAI clip.\n\n### Verifying secrets safely\n\n**Always verify prerequisites with the upstream `validate.py` or by\nrunning the converter against a tiny test slice; never write ad-hoc\nbash that interpolates `HF_TOKEN` values.** The common one-liner\n\n```bash\n# BAD — leaks the secret to the terminal when the variable is set\necho \"HF_TOKEN: ${HF_TOKEN:+yes}${HF_TOKEN:-no}\"\n```\n\nprints `yes\u003Ctoken-value>` whenever `HF_TOKEN` is set, because\n`${VAR:-no}` only falls back to \"no\" when the variable is empty. Use\na length-only check, which never echoes the value:\n\n```bash\n# OK — prints \"set (N chars)\" or \"missing\", never the value\ntest -n \"$HF_TOKEN\" && echo \"HF_TOKEN: set (${#HF_TOKEN} chars)\" || echo \"HF_TOKEN: missing\"\n```\n\nRotate any token you suspect was echoed at\n\u003Chttps:\u002F\u002Fhuggingface.co\u002Fsettings\u002Ftokens>.\n\n## Install & references\n\n```bash\npip install nvidia-ncore        # pure-Python API for in-process writes\ngit clone --depth 1 https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore.git   # for upstream converters (Bazel)\n```\n\n- Source + upstream converters: \u003Chttps:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore>\n- V4 spec \u002F conventions: \u003Chttps:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fdata\u002Fconventions.html>\n- API reference: \u003Chttps:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fapis\u002Fdata.v4.html>\n- Conversion guides: \u003Chttps:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fconversions\u002Findex.html>\n- Sensor models (camera, LiDAR, windshield): \u003Chttps:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fdata\u002Fsensor_models.html>\n- The template scaffold (every method documented inline):\n  [`ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py`](ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py)\n- End-to-end NCore → NRE training and rendering: see the sibling\n  [`nre`](..\u002Fnre\u002FSKILL.md) skill (Workflow A). NVIDIA's reference\n  OSMO recipe that wires PAI → NCore → NuRec → USDZ training lives\n  in the upstream NCore repo at\n  \u003Chttps:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore\u002Ftree\u002Fmain\u002Ftools\u002Fdata_converter\u002Fpai>\n  and the NRE container docs at\n  \u003Chttps:\u002F\u002Fwww.nvidia.com\u002Fen-us\u002Fomniverse\u002Fnurec\u002F>.\n\n---\n\n## Mental model — the V4 store\n\nEvery V4 sequence is one **store** (`itar` archive or plain directory) holding\n**component groups**. The required components for NuRec are:\n\n| Component | What it carries | API class |\n|-----------|-----------------|-----------|\n| `Poses` | Dynamic `T_rig_world` (per timestamp); static `T_sensor_rig` per camera\u002Flidar\u002Fradar; static `T_world_world_global` | `PosesComponent` |\n| `Intrinsics` | Per-camera model (Pinhole \u002F Fisheye \u002F FTheta) + per-LiDAR spinning model | `IntrinsicsComponent` |\n| `CameraSensor` | Encoded image bytes + per-frame `[exposure_start, exposure_end]` µs | `CameraSensorComponent` |\n| `LidarSensor` | Per-ray unit direction + per-ray µs timestamp + distance(s) + intensity + `model_element=(row,col)` | `LidarSensorComponent` |\n| `RadarSensor` *(optional)* | Same shape as LiDAR minus intensity \u002F model_element | `RadarSensorComponent` |\n| `Cuboids` *(optional, recommended)* | `CuboidTrackObservation` list referencing `rig` \u002F `world` \u002F sensor frames | `CuboidsComponent` |\n| `Masks` | Per-camera dict of `{name: PIL.Image}` (NuRec **requires** ego masks) | `MasksComponent` |\n| `PointClouds` *(optional)* | Pre-computed dense or SfM points (e.g. COLMAP `sfm_points`, depth-derived) | `PointCloudsComponent` |\n\nFrames of reference (these are non-negotiable — wrong frames = silent NuRec failure):\n\n- **Rig**: `+X` forward, `+Y` left, `+Z` up. Origin at the middle of the rear axle on nominal ground for AV, or any natural body-fixed point for non-AV. All extrinsics are `T_sensor → rig`.\n- **Camera sensor**: `+X` right, `+Y` down, `+Z` forward (optical axis). NCore's convention. Waymo (X-fwd) and similar must be **rotated** before storing extrinsics.\n- **LiDAR model frame**: azimuth 0° = `+X`, 90° = `+Y`, `+Z` up. Independent of the raw sensor's native azimuth — you choose how `column_azimuths_rad` maps physical columns.\n- **World**: sequence-local. Re-reference all `T_rig_world` to the **first** ego pose so origin is near the vehicle start (raw UTM\u002FECEF at 10+ km loses precision in float32). Carry the original first pose into `T_world_world_global` (float64) if you need a global anchor.\n- **Image pixels**: `u` right, `v` down, origin at the top-left **corner** of the top-left pixel (so pixel centers are at `0.5, 0.5`).\n- **Units**: timestamps in µs everywhere, distances in metres, angles in radians.\n\nThe single source of truth is the spec — when in doubt, open it:\n\u003Chttps:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fdata\u002Fconventions.html>.\n\n### Sequence-level metadata\n\nSome downstream pipelines need metadata beyond the per-component data — carry\nit on the sequence's `generic_meta_data` (passed to\n`SequenceComponentGroupsWriter(...)`):\n\n- **Stereo pairs** — required by stereo-depth modules (Foundation Stereo) and\n  multi-camera training configs to discover left\u002Fright pairings:\n\n  ```json\n  {\"stereo_pairs\": [{\"left\": \"camera_front_left\", \"right\": \"camera_front_right\"}]}\n  ```\n\n  Multiple pairs are allowed for surround-stereo rigs.\n\n- **Source tag** — distinguishes real from synthetic data. Renderer-output\n  shards (NuRec sim) set `{\"source\": \"simulation\", \"model_checkpoint\": \"...\"}`;\n  real-sensor shards omit the key or set `{\"source\": \"real\"}`. Downstream\n  validators key off this to skip \"expected vs measured\" checks on sim data.\n\n- **Calibration \u002F egomotion provenance** — the example template writes\n  `calibration_type` and `egomotion_type` on the `PosesComponent`'s\n  `generic_meta_data`. Use this to track the upstream tool (e.g.\n  `egomotion_type: \"cuvslam-stereo\"` or `\"kiss-icp\"` or `\"vio:orbslam3\"`) so\n  later modules can pick refinement strategies that match the input quality.\n\n---\n\n## Instructions\n\nPick one of the two paths below.\n\n- **Path A** if the user's dataset format is already supported in\n  `ncore\u002Ftools\u002Fdata_converter\u002F` (PAI, Waymo, COLMAP\u002FScanNet++) —\n  bootstrap the upstream repo and drive the existing binary.\n- **Path B** if the format is unsupported (PandaSet, NuScenes, KITTI,\n  custom rig, robotics bag, …) — copy `ncore_template\u002F` next to the\n  dataset and fill in the four hand-written hooks. The V4 conventions\n  in the **Mental model** section above are mandatory; the recipes\n  further down show typical configurations per rig.\n\nAfter conversion, always run the **Validation & end-to-end NuRec**\nsection below before handing the store to NRE.\n\n## Path A — drive an existing in-tree converter\n\nThe upstream `tools\u002Fdata_converter\u002F\u003Cformat>` modules are Bazel targets. Build\nonce, run per dataset.\n\n### Bootstrap\n\n```bash\ngit clone --depth 1 https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore.git\ncd ncore\nbazel build \u002F\u002Ftools\u002Fdata_converter\u002Fpai:convert     # or waymo, or colmap\n```\n\nEach `convert` binary takes shared **base** flags (`--root-dir`, `--output-dir`,\n`--no-cameras`, `--camera-id`, `--no-lidars`, `--lidar-id`, `--verbose`) followed\nby a **subcommand** (`pai-v4`, `pai-stream-v4`, `waymo-v4`, `colmap-v4`,\n`scannetpp-v4`) with format-specific flags.\n\n### Standard sub-flags worth knowing\n\n| Flag | Default | Meaning |\n|------|---------|---------|\n| `--store-type {itar,directory}` | `itar` | `itar` is fastest for NuRec; `directory` is debuggable |\n| `--profile {default,separate-sensors,separate-all}` | varies | NuRec wants `separate-sensors` |\n| `--sequence-meta` \u002F `--no-sequence-meta` | enabled | Writes `\u003Csequence>.json` next to the store — NuRec\u002F`ncore_vis` need it |\n| `--world-global-mode {none,identity,localized}` | varies | For NuRec releases that require the `world→world_global` edge, use `identity` (or `localized` to keep a real global anchor) |\n\n### When to script vs run interactively\n\nFor a **one-off conversion**, the bare `bazel run` form in each format recipe\nbelow is enough. For repeatable cluster runs, wrap the same two steps\n(`bazel build` then `bazel run`) inside an OSMO \u002F Slurm \u002F Kubernetes task that\nclones NCore at a pinned ref, runs the convert step, and chains the result\ninto the [`nre`](..\u002Fnre\u002FSKILL.md) training and aux-data containers (see\n`nre`'s Workflow A). The upstream\n[`NVIDIA\u002Fncore`](https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore) repo ships reference\nconverter targets that you can pin by Git commit for reproducibility.\n\n---\n\n## Path B — author a new converter from the template\n\nThe scaffold is intentionally minimal but writes **every** required component\ntype with placeholder data. Treat it as a checklist: every `# FILL IN` is a\ncorrectness gate — none can be skipped.\n\n### Scaffold\n\n```bash\n# Copy the scaffold next to your dataset (run from this skill's folder)\ncp -r ncore_template \u002Fpath\u002Fto\u002Fncore-myformat\n```\n\nThen rename the package and class (`ExampleConverter` → `MyFormatConverter`) and\nimplement the contract:\n\n| Method | Contract |\n|--------|----------|\n| `get_sequence_ids(config) -> list[str]` | Discover sequence IDs from `config.root_dir` (or wherever your dataset lives — manifest CSV, HF clip index, ROS bag glob) |\n| `from_config(config) -> Converter` | One-time setup (load calibration, open dataset index, init shared interpolators). Heavy lifting that all sequences share goes here |\n| `convert_sequence(sequence_id) -> None` | Per-sequence work: open `SequenceComponentGroupsWriter`, register component writers, write data, `finalize()`, write `\u003Csequence_id>.json` |\n\nInside `convert_sequence` the canonical order is **Poses → Intrinsics → Masks →\nCamera → LiDAR → Radar → Cuboids → finalize**. This order is not required by the\nwriter but it surfaces calibration \u002F pose \u002F timing bugs **before** you've spent\nminutes encoding image bytes.\n\nThe skeleton walks each step explicitly and lists every silent-correctness\ntrap inline — read these before filling them in:\n\n- Spinning-LiDAR pitfalls (`spinning_direction`, non-uniform `row_elevations_rad`,\n  `column_azimuths_rad` ordering, Ouster `row_azimuth_offsets_rad`):\n  [`example_converter.py:61-120`](ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py#L61-L120)\n- Pose trajectory density + float64 → float32 + re-referencing rules:\n  [`example_converter.py:336-492`](ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py#L336-L492)\n- Camera intrinsics for Pinhole \u002F Fisheye \u002F FTheta + shutter type:\n  [`example_converter.py:524-578`](ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py#L524-L578)\n- Per-ray LiDAR timestamps and the three data shapes (range image \u002F sensor-frame\n  XYZ \u002F world-frame XYZ requiring decompensation):\n  [`example_converter.py:746-829`](ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py#L746-L829)\n- Cuboid centroid convention (geometric center, not bottom-center):\n  [`example_converter.py:876-980`](ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py#L876-L980)\n\n### In-process API (no Bazel)\n\nIf you already have parsed arrays in Python and don't need a CLI, skip\n`FileBasedDataConverter` entirely and call the V4 writer directly:\n\n```python\nfrom ncore.data.v4 import SequenceComponentGroupsWriter, PosesComponent, ...\nwriter = SequenceComponentGroupsWriter(\n    output_dir_path=out \u002F seq_id,\n    store_base_name=seq_id,\n    sequence_id=seq_id,\n    sequence_timestamp_interval_us=interval,\n    store_type=\"itar\",\n)\nposes_writer = writer.register_component_writer(PosesComponent.Writer, ...)\n# … write each component …\npaths = writer.finalize()\n```\n\nThe contract (component order, dtype rules, timestamp constraints) is identical.\n\n---\n\n## V4 conventions you must obey\n\nThese are the rules that turn into runtime asserts (or worse: silent NuRec\nartefacts). Cross-reference the spec before relaxing any of them.\n\n### Time\n\n- **Microseconds, uint64, everywhere.** `np.uint64`, not `np.int64`.\n- The sequence interval is half-closed `[start, stop)`. Build it with\n  `HalfClosedInterval.from_start_end(start, end_inclusive)` — do **not**\n  pre-add 1 to `end`.\n- Dynamic poses **must exactly span** the interval: `timestamps[0] == start` and\n  `timestamps[-1] == stop - 1`. Sensors with timestamps slightly outside this\n  range are clamped at write time.\n- Per-sensor frame timestamps are `[exposure_start, exposure_end]` (cameras) or\n  `[sweep_start, sweep_end]` (LiDAR\u002Fradar). They must lie within the sequence\n  interval and the **end** must be unique within that sensor's writer.\n- Rolling-shutter cameras: `start = trigger + half_shutter`,\n  `end = readout_done - half_shutter`. Global shutter: `start == end` is OK.\n- LiDAR `frame_timestamps_us[0]` is the **sweep start** (not midpoint). Per-ray\n  `timestamp_us` must lie in `[sweep_start, sweep_end]`. Treating the dataset's\n  frame timestamp as the midpoint and subtracting half a sweep duration\n  introduces a ~50 ms shift on a 10 Hz LiDAR and produces motion-comp blur.\n\n### Pose graph\n\n- All intermediate pose math is **float64**. Cast to float32 only as the very\n  last step before `store_dynamic_pose` \u002F `store_static_pose`.\n  Exception: `world → world_global` stays float64 (NuRec's\n  `RigTrajectories.T_world_base` is float64).\n- Re-reference dynamic poses to the first ego pose:\n  `poses_f64 = inv(poses_f64[0]) @ poses_f64`. Without this, GPS\u002FUTM\u002FENU at\n  10+ km loses sub-cm precision once cast to float32.\n- The pose trajectory must be **dense** (waypoint spacing \u003C LiDAR sweep\n  duration, e.g. \u003C50 ms for 10 Hz). Combine every available source: per-camera\n  per-frame poses, per-LiDAR per-sweep poses, IMU\u002FGPS\u002Fodometry. Concatenate,\n  `np.unique` by timestamp, sort.\n- `T_camera_rig` and `T_lidar_rig` are float32 (NuRec's `transform_poses` leaks\n  input dtype through an internal matmul; float64 here collides with the\n  float32 trajectory and crashes \"Get Lidar Point Clouds\" with\n  `RuntimeError: double != float`).\n\n### LiDAR\n\n- Direction vectors are **unit-norm**, in **sensor coordinates**, at each ray's\n  **measurement time** (not the sweep-start time). Three input shapes:\n  1. **Polar range image** with beam geometry → derive directly from\n     `column_azimuths_rad[col]`, `row_elevations_rad[row]`,\n     `row_azimuth_offsets_rad[row]`. Direction:\n     `(cos(elev)*cos(azi), cos(elev)*sin(azi), sin(elev))`.\n  2. **Sensor-frame XYZ** → `direction = xyz \u002F |xyz|`.\n  3. **World-frame or ego-compensated XYZ** → **decompensate** with\n     `MotionCompensator.motion_decompensate_points`, then normalise.\n- Spinning LiDAR parameter traps (silent — wrong values pass write but fail\n  NuRec):\n  - `spinning_direction`: nearly all automotive spinning LiDARs (Velodyne,\n    Hesai, Ouster, Robosense) are **`\"cw\"`**. The template defaults to\n    `\"ccw\"` to force the question. Wrong value mirrors Y → Z-flip in NuRec.\n  - `row_elevations_rad`: **non-uniform on every common sensor**. Read real\n    per-beam angles from the sensor calibration. **Strictly descending**\n    (highest beam first); reverse if your source is ascending. NCore asserts\n    `np.diff > 0` after projecting through `relative_angle`.\n  - `column_azimuths_rad`: must reflect the **actual** per-column azimuth at\n    frame start (not a synthetic `linspace`). NCore validates strict ordering\n    via `relative_angle(azim[0], azim, spinning_direction)`. If raw\n    per-column heading is available, use it; otherwise `linspace(0, ±2π, N,\n    endpoint=False)` is acceptable for `\"ccw\"` \u002F `\"cw\"` respectively.\n  - `row_azimuth_offsets_rad`: zero for most sensors; **non-zero on Ouster**\n    (`beam_azimuth_angles` from the HTTP API). Skipping this on Ouster\n    misaligns LiDAR-to-camera projection.\n- Per-ray `timestamp_us` is **required** for motion compensation; supply real\n  per-column firing times (typically column-linear across the sweep).\n\n### Cuboids\n\n- `BBox3.centroid` is the **geometric center**. Many AV datasets use\n  bottom-center → add `dim_z \u002F 2` to z. Verify empirically: `mean(z) - mean(h)\u002F2`\n  near 0 = geometric center; near `mean(h)\u002F2` above ground = bottom-center.\n- `reference_frame_id` ∈ `{\"rig\", \"world\", \u003Csensor_id>}`.\n  `reference_frame_timestamp_us` and `timestamp_us` must lie within the\n  sequence interval.\n- **`LabelSource`**: tag the **origin pipeline**, not quality. Third-party\n  dataset labels (Waymo, NuScenes, PandaSet) → `EXTERNAL`, even if the upstream\n  is human GT. Use `GT_ANNOTATION` only when this converter's team owns the\n  annotation.\n\n### Camera\n\n- Image bytes stored verbatim (JPEG\u002FPNG); NCore does not re-encode.\n- Use the model that matches your sensor: `OpenCVPinholeCameraModelParameters`\n  (most AV cameras), `OpenCVFisheyeCameraModelParameters` (Kannala-Brandt\n  fisheye, e.g. ScanNet++ \u002F GoPro), `FThetaCameraModelParameters` (NVIDIA\n  Hyperion \u002F equidistant-radial). Resolution must match the actual image bytes\n  bit-for-bit.\n- Map shutter direction by **enum name**, not integer cast. The five\n  `ShutterType` values are `ROLLING_TOP_TO_BOTTOM=1`, `ROLLING_LEFT_TO_RIGHT=2`,\n  `ROLLING_BOTTOM_TO_TOP=3`, `ROLLING_RIGHT_TO_LEFT=4`, `GLOBAL=5`. Build a\n  source-enum-to-name dict.\n- Provide ego masks. NuRec's data-quality guide **requires** binary\n  ego-vehicle masks per camera. Without them the hood\u002Froof rack leaks into the\n  reconstruction.\n\n### NuRec data-quality minimums\n\nPer the NuRec \"Ensure Data Quality\" guide, hitting these is the difference\nbetween a clean reconstruction and visible artefacts:\n\n- Camera extrinsics: \u003C 0.5° rotation, \u003C 2 cm translation (relative to rig).\n- Camera intrinsics: \u003C 1 px reprojection error.\n- Egomotion: \u003C 0.5° \u002F \u003C 2.5 cm consecutive-frame error; trajectory must cover\n  every sensor frame's start and end timestamp.\n- Cuboids: \u003C 1° \u002F \u003C 5 cm position \u002F \u003C 5 cm dimension; per-track stable\n  `track_id`s.\n- Original sensor resolution at full FPS, **no undistortion \u002F rectification**.\n\n---\n\n## Format recipes (AV)\n\n### PAI (NVIDIA Physical AI Autonomous Vehicles, HuggingFace)\n\n**Built-in.** Streaming or local. Uses Hyperion 8 \u002F 8.1 sensor IDs.\n\n```bash\n# Streaming (no download — recommended for cloud \u002F OSMO)\nbazel run \u002F\u002Ftools\u002Fdata_converter\u002Fpai:convert -- \\\n    --output-dir \u003COUT> \\\n    --camera-id camera_front_wide_120fov \\\n    --camera-id camera_cross_left_120fov \\\n    --camera-id camera_cross_right_120fov \\\n    --camera-id camera_front_tele_30fov \\\n    pai-stream-v4 \\\n        --clip-id \u003CCLIP_ID> \\\n        --hf-token \"$HF_TOKEN\" \\\n        --store-type itar \\\n        --profile separate-sensors \\\n        --sequence-meta\n```\n\nNotes:\n\n- HF dataset: `nvidia\u002FPhysicalAI-Autonomous-Vehicles`. License must be accepted\n  on HF before `HF_TOKEN` works.\n- 7 cameras (FTheta + Fisheye + Pinhole depending on FOV), 1 top LiDAR\n  (`lidar_top_360fov`, spinning, see datasheet for elevations).\n- Camera intrinsics include `shutter_delay_us` for per-row rolling-shutter\n  timestamping, plus optional `BivariateWindshieldModelParameters` for\n  windshield refraction.\n- Output path: `\u003Coutput-dir>\u002Fpai_\u003Cclip-id>\u002Fpai_\u003Cclip-id>.ncore4.zarr.itar`.\n- Discover clip IDs via the `clip_index.parquet` blob in the HF dataset\n  (`nvidia\u002FPhysicalAI-Autonomous-Vehicles`) — the\n  [`physical-ai-datasets`](..\u002Fphysical-ai-datasets\u002FSKILL.md) skill has the\n  download recipe and toolkit pointers.\n- Subset by time with `--seek-sec` \u002F `--duration-sec`; subset sensors with\n  `--no-lidars` \u002F `--camera-id` (repeatable).\n- **car2sim_6cam** sim configs target CARLA sensor names; PAI exports use real\n  Hyperion IDs — when feeding NRE training, override `dataset.camera_ids` \u002F\n  `dataset.lidar_ids` on the NRE Hydra command line (see\n  [`nre`](..\u002Fnre\u002FSKILL.md) Workflow A and `references\u002Fconfiguration.md`).\n\n### Waymo Open\n\n**Built-in.** Reads `.tfrecord` segment files.\n\n```bash\nbazel run \u002F\u002Ftools\u002Fdata_converter\u002Fwaymo:convert -- \\\n    --root-dir \u003CDIR_OF_TFRECORDS> \\\n    --output-dir \u003COUT> \\\n    waymo-v4 \\\n        --store-type itar \\\n        --profile separate-sensors \\\n        --world-global-mode localized   # or 'identity' \u002F 'none'\n```\n\nNotes:\n\n- 5 cameras (`camera_front_50fov`, `camera_front_left_50fov`,\n  `camera_front_right_50fov`, `camera_side_left_50fov`,\n  `camera_side_right_50fov`) + 1 top LiDAR (`lidar_top`).\n- Camera intrinsics → `OpenCVPinholeCameraModelParameters`. Waymo's local\n  camera frame is **`+X` principal axis**; the converter rotates to NCore's\n  `+Z` principal axis. If you re-derive extrinsics manually, apply the same\n  rotation to `T_camera_rig`.\n- Cuboid classes: `unknown, vehicle, pedestrian, sign, cyclist`. Map → NCore\n  `class_id` strings; tag `LabelSource.EXTERNAL`.\n- Multi-return LiDAR (primary + secondary). Stack into the `[R, N]` distance \u002F\n  intensity arrays.\n\n### PandaSet\n\n**No upstream converter — author with Path B.** PandaSet (Hesai +\nScale-AI-labelled) ships JSON metadata with each sequence.\n\nSensor inventory:\n\n- 6 cameras (`front_camera`, `front_left_camera`, `front_right_camera`,\n  `back_camera`, `left_camera`, `right_camera`) — pinhole, global shutter.\n  Intrinsics in `meta\u002Fintrinsics\u002F\u003Cid>.json`.\n- 2 LiDARs:\n  - `front_lidar`: Hesai PandarGT (mechanical, 60° HFOV, 150° VFOV\n    forward-facing). Treat as a partial spinning sensor (`column_azimuths_rad`\n    spans the 60° wedge).\n  - `top_lidar` (key sensor for AV reconstruction): Hesai Pandar64,\n    **`spinning_direction=\"cw\"`**, 64 beams with **non-uniform** elevations\n    (Pandar64 datasheet table — copy the 64 angles, sort descending),\n    `row_azimuth_offsets_rad = zeros(64)`, 1800 columns.\n\nData layout per sequence (extract):\n\n```text\n\u003Cseq_id>\u002F\n├── meta\u002F\n│   ├── intrinsics\u002F\u003Ccamera_id>.json     # focal, principal point, distortion\n│   ├── timestamps.json                 # per-camera-frame µs\n│   └── poses.json                      # per-frame ego pose (UTM)\n├── camera\u002F\u003Ccamera_id>\u002F\u003Cframe>.jpg\n├── camera\u002F\u003Ccamera_id>\u002Fposes.json       # per-frame camera pose in world\n├── lidar\u002F\u003Cframe>.pkl.gz                # XYZ + intensity + timestamp + ring\n└── cuboids\u002F\u003Cframe>.pkl.gz              # bottom-center xyz + dim + yaw\n```\n\nConversion checklist:\n\n- Pose trajectory: union of **per-camera per-frame** poses (6 × ~80 = ~480\n  waypoints) and per-LiDAR-frame poses, deduped + sorted, re-referenced to\n  the first ego pose.\n- LiDAR points are **world-frame XYZ already ego-compensated** → run\n  `MotionCompensator.motion_decompensate_points` to recover sensor-frame\n  per-ray XYZ, then normalise to direction. Per-ray µs from the `timestamp`\n  column.\n- Map raw Pandar64 `ring` → NCore `model_element[:, 0]` via a\n  `ring_id → row_index` permutation that sorts elevations **descending** (raw\n  ring IDs are firing order, not beam index).\n- Cuboids: **bottom-center → geometric center** (`centroid_z += dim_z\u002F2`).\n  Yaw-only rotation → `rot=(0, 0, yaw_rad)`. `LabelSource.EXTERNAL`.\n- Cameras: global shutter (`ShutterType.GLOBAL`). `frame_timestamps_us = [t, t]`.\n\n### NuScenes\n\n**No upstream converter — author with Path B.** NuScenes ships nested JSON\ntables (`sample`, `sample_data`, `ego_pose`, `calibrated_sensor`, `sensor`,\n`sample_annotation`, `instance`).\n\nSensor inventory:\n\n- 6 cameras (`CAM_FRONT`, `CAM_FRONT_LEFT`, `CAM_FRONT_RIGHT`, `CAM_BACK`,\n  `CAM_BACK_LEFT`, `CAM_BACK_RIGHT`) — pinhole. Rolling shutter; consult the\n  device datasheet for shutter direction (rename to lowercase NCore IDs).\n- 1 LiDAR (`LIDAR_TOP`): Velodyne HDL-32E, **`spinning_direction=\"cw\"`**,\n  32 beams, 1800 columns at 0.2°. Use VLP\u002FHDL-32 datasheet elevations\n  (descending). `row_azimuth_offsets_rad = zeros(32)`.\n- 5 radars (`RADAR_FRONT`, `RADAR_FRONT_LEFT`, `RADAR_FRONT_RIGHT`,\n  `RADAR_BACK_LEFT`, `RADAR_BACK_RIGHT`). Continental ARS 408. Optional —\n  NuRec ignores radar.\n\nConversion checklist:\n\n- A NuScenes \"scene\" → one V4 sequence. Iterate `sample`s in the scene to\n  enumerate `sample_data` per sensor.\n- Timestamps in `sample_data.timestamp` are **µs** already.\n- `ego_pose` is rig→world (translation + quaternion). Build the dense\n  trajectory from the union of ego_pose entries across all sample_data\n  (cameras at 12 Hz, LiDAR at 20 Hz, radars at 13 Hz → ~50 ms spacing).\n- `calibrated_sensor.translation` + `.rotation` is `T_sensor_rig` (named\n  `T_calib` in their docs — verify direction by transforming a sensor-frame\n  test point and checking it lands in the expected rig position).\n- LiDAR `.pcd.bin` files are already-ego-compensated sensor-frame XYZ + ring\n  index + intensity. Per-ray timestamps are not stored — synthesise from\n  `column_index` (azimuth bin) and the sweep duration (50 ms at 20 Hz):\n  `t_ray = sweep_start + (azim_bin \u002F 1800) * sweep_duration`.\n- `sample_annotation`: bottom-of-box origin → **add `size[2]\u002F2` to z**.\n  `rotation` quaternion → XYZ-Euler radians. `instance_token` → `track_id`,\n  `category_name` → `class_id`. `LabelSource.EXTERNAL`.\n- Ego masks: NuScenes does not ship them. Generate via SAM2 \u002F off-the-shelf\n  ego segmentation per camera — strongly recommended for NuRec quality.\n\n---\n\n## Format recipes (non-AV \u002F sensor-only)\n\nThese do not have a vehicle rig; pick a body-fixed origin and apply the same\nrig conventions (`+X` forward, `+Y` left, `+Z` up).\n\n### Mono camera (no depth, no LiDAR) → COLMAP track\n\nYou only have RGB images. Run COLMAP first to produce poses + sparse points,\nthen feed COLMAP into the upstream converter:\n\n```bash\ncolmap automatic_reconstructor \\\n    --workspace_path \u003CSCENE> --image_path \u003CSCENE>\u002Fimages \\\n    --camera_model OPENCV --single_camera 1\nbazel run \u002F\u002Ftools\u002Fdata_converter\u002Fcolmap:convert -- \\\n    --root-dir \u003CSCENE> --output-dir \u003COUT> \\\n    colmap-v4 --include-3d-points --start-time-sec 0\n```\n\nNotes:\n\n- COLMAP timestamps are synthetic (1 FPS by default; tune with\n  `--start-time-sec` and the FPS embedded in your image filenames).\n- The COLMAP camera frame already matches NCore (`+Z` optical) — no rotation\n  required.\n- SfM points become a `PointCloudsComponent` named `sfm_points`. Use this when\n  no LiDAR is available so NuRec has a sparse geometric prior.\n- Ego masks (`\u003Cimage_basename>_mask.png` next to images, or `--masks-dir`).\n\n### Stereo cameras\n\nTwo synchronised cameras at known baseline. No LiDAR.\n\n- **Rig origin**: midpoint between the two camera optical centres (or the left\n  camera — pick one and stay consistent).\n- **Static extrinsics**: `T_left_rig`, `T_right_rig` from your stereo calibration\n  (OpenCV `stereoCalibrate` outputs `R, T` from right-to-left → invert\u002Fcompose\n  to get rig-relative).\n- **Trajectory**: stereo-VIO (ORB-SLAM3, OpenVSLAM) or COLMAP run on left\n  images → propagate to rig with `T_left_rig`.\n- **No LiDAR component.** Two options:\n  1. Skip LiDAR entirely (set `lidar_ids = []`). NuRec falls back to\n     image-only reconstruction (lower quality, more views needed).\n  2. Compute disparity per stereo pair → 3-D point cloud per frame in the\n     left-camera frame → write as a `PointCloudsComponent` per frame\n     (analogous to COLMAP `sfm_points` but dense). This gives NuRec a\n     geometric prior without faking a spinning LiDAR.\n- Ego masks: render or hand-paint a static mask of the rig body if visible in\n  the FOV.\n\n### Multi-stereo rig (surround stereo)\n\nMultiple synchronised stereo pairs on one rig (e.g. NVIDIA Hyperion 8.1\nsurround stereo, AV1, custom inspection robots). Each pair feeds Foundation\nStereo independently to produce dense depth around the platform.\n\n- Encode **each camera as its own** `CameraSensorComponent` with a standard\n  `T_camera_rig` extrinsic — do **not** pre-rectify or fuse a pair into a\n  single virtual sensor. NCore does not have a \"stereo pair\" component\n  type; pairing is metadata, not structure.\n- Declare the pairings on the **sequence-level** `generic_meta_data` so\n  downstream tools (Foundation Stereo, NuRec aux-data) can discover them:\n\n  ```json\n  {\"stereo_pairs\": [\n      {\"left\": \"camera_front_left\",  \"right\": \"camera_front_right\"},\n      {\"left\": \"camera_rear_left\",   \"right\": \"camera_rear_right\"},\n      {\"left\": \"camera_side_left_a\", \"right\": \"camera_side_left_b\"}\n  ]}\n  ```\n\n- Pose trajectory must include every **(camera × frame timestamp)** sample —\n  surround stereo at 8 cameras × 100 frames yields 800 trajectory waypoints,\n  more than dense enough for per-ray motion compensation. Do not subsample.\n- Calibration: stereo intrinsics + extrinsics from `cv2.stereoCalibrate` give\n  you `R, T` from right-to-left. Compose with your chosen rig origin to get\n  `T_left_rig` and `T_right_rig` separately; do **not** store only the\n  baseline.\n- Scale is metric by construction (calibrated baseline). Skip scale refinement\n  (or run it as a sanity check only).\n\n### Mono + depth (RGB-D \u002F learned depth)\n\nSingle RGB camera + per-frame depth (sensor: RealSense, Kinect, ZED depth, or\nlearned mono-depth like Marigold \u002F DepthAnythingV2 \u002F MoGe-2).\n\n**RGB-D specifics:**\n\n- **RealSense D4xx \u002F L515**: active IR stereo (D4xx) or LiDAR-class TOF (L515).\n  Depth and RGB are co-triggered but **not** pixel-aligned out of the box —\n  use the `rs2_align` filter (or pre-aligned topics) before treating depth\n  as RGB-frame metric. Intrinsics: read the colour stream's intrinsics for\n  the RGB component; ignore the depth-stream intrinsics (depth is aligned\n  into the colour frame).\n- **Microsoft Kinect Azure \u002F Kinect v2**: TOF depth with non-trivial\n  invalidation near object edges. Mask invalidated pixels (depth == 0) before\n  encoding as a point cloud.\n- **Stereolabs ZED 2 \u002F X**: stereo with a built-in disparity engine. Either\n  store both raw left\u002Fright images and treat as a stereo rig (preferred —\n  Foundation Stereo can re-derive depth at higher quality), or store the\n  ZED-native depth as a per-frame `PointCloudsComponent`.\n- **Learned mono-depth** (Marigold, DepthAnythingV2, MoGe-2) is **scale\n  ambiguous**. Either anchor with one absolute reference (a known object\n  size, ground-plane height, IMU + visual-inertial scale) before storing,\n  or accept that scale refinement (r2s module 6) will run downstream.\n\n- **Rig origin**: camera optical centre (or device body if you have a static\n  IMU offset).\n- **Trajectory**: ARKit\u002FARCore pose stream, IMU+camera VIO, or depth-aided\n  RGB-D SLAM (Open3D, Spectacular AI).\n- **No LiDAR** — depth is *not* a LiDAR. Two valid encodings:\n  1. **Per-frame `PointCloudsComponent`** (preferred for learned\u002Fstereo-quality\n     depth, where reliability is uneven). Convert depth + intrinsics →\n     camera-frame XYZ, transform to world via `T_camera_world(t)`, store as\n     a point cloud per frame. Carry the dense depth into `generic_data` if\n     downstream consumers want it.\n  2. **Synthetic spinning LiDAR** (only if your depth is dense and reliable).\n     Sample a fixed grid of azimuths\u002Felevations, ray-cast against the depth\n     map at each frame, and write a `LidarSensorComponent`. This is more\n     work and less honest than option 1 — prefer point clouds unless NuRec\n     specifically needs a LiDAR component.\n- Camera intrinsics: pinhole or fisheye depending on the lens. Depth-camera\n  manufacturers ship calibration JSON — copy `fx, fy, cx, cy` and distortion\n  coefficients verbatim.\n- Frame timestamps: depth and RGB are usually co-triggered. Use the RGB\n  exposure timestamp; depth has no separate component.\n\n### Mono + LiDAR (handheld \u002F robot)\n\nSingle camera + spinning or solid-state LiDAR, e.g. handheld scanner, ground\nrobot, drone.\n\n- **Rig origin**: choice driven by mechanical mounting. If the LiDAR is the\n  reference for ego-motion (LiDAR-inertial SLAM), set rig = LiDAR (so\n  `T_lidar_rig = I`). Otherwise pick the IMU body frame or camera centre.\n- **Trajectory**: LIO-SAM, FAST-LIO, or any LiDAR-inertial pipeline.\n  Re-reference to the first frame; cast last (float64 → float32).\n- **Static extrinsics**: `T_camera_rig` from camera-LiDAR calibration\n  (kalibr, lidar_align). Apply the NCore camera-frame rotation if your\n  calibration target uses a different convention.\n- **LiDAR**:\n  - Spinning (Velodyne \u002F Ouster \u002F Hesai \u002F Robosense \u002F Livox Mid-360 in\n    repetitive mode): use `RowOffsetStructuredSpinningLidarModelParameters`\n    with the sensor's real elevations (datasheet) and `\"cw\"`. For Ouster\n    populate `row_azimuth_offsets_rad` from `beam_azimuth_angles`.\n  - Solid-state non-repetitive (Livox Avia, Mid-40, Mid-70 in\n    non-repetitive mode): the spinning model does not fit. Either replay\n    each scan as a fake \"spinning\" sweep (stash directions in\n    `column_azimuths_rad` per-scan — fragile) or, **preferred**, write the\n    points as a `PointCloudsComponent` per frame in the sensor frame and\n    skip `LidarSensorComponent`. NuRec can consume point clouds.\n- Cuboids: usually unavailable for non-AV — leave the component empty or\n  unregistered.\n- Ego masks: render the rig body if it intrudes on the FOV (drone arm,\n  robot chassis); empty `{}` if not.\n\n### Solid-state \u002F non-repetitive LiDAR (Livox)\n\nLivox Avia \u002F Mid-40 \u002F Mid-70 — and Mid-360 in non-repetitive mode — produce\na point cloud per scan that does **not** lay out on a row-major spinning\ngrid. The `RowOffsetStructuredSpinningLidarModel` does not fit; forcing it\n(synthetic columns, fake row bins) breaks NCore validation and\nmotion-compensation alignment.\n\nEncoding rules:\n\n- **Preferred** — write each scan as a per-frame `PointCloudsComponent`\n  instance in the **sensor frame**, with per-point µs timestamps. Skip\n  `LidarSensorComponent` entirely. NuRec consumes point clouds and r2s depth\n  refinement (module 7) treats them as it would LiDAR sweeps.\n- **Fallback for repetitive Mid-360** — the Mid-360 in repetitive mode does\n  produce a structured grid; treat it as a spinning LiDAR with the\n  datasheet's beam table and `spinning_direction=\"cw\"`. This is the only\n  Livox variant the spinning model fits.\n\nPer-point timestamps: Livox custom messages carry `offset_time` (ns from\nsweep start). Convert to absolute µs:\n`timestamp_us = sweep_start_us + offset_time_ns \u002F\u002F 1000`.\n\n### IMU + camera (visual-inertial)\n\nIMU is **not** stored as its own NCore component — it densifies the pose\ntrajectory (and, optionally, anchors metric scale on monocular setups). Two\npaths:\n\n1. **VIO trajectory (preferred)**: run a visual-inertial pipeline (cuVSLAM\n   stereo-inertial, ORB-SLAM3, OpenVSLAM, OpenVINS, Spectacular AI) →\n   IMU-rate (100–200 Hz) `T_world_rig` poses → store as the dynamic pose.\n   The trajectory is already dense enough that per-ray motion compensation\n   works without further densification.\n2. **IMU integration only (bootstrap \u002F fallback)**: pre-integrate IMU\n   (linear accel + angular vel) over short windows, anchor each window with\n   the next available camera- or LiDAR-rate pose. Useful for filling gaps or\n   extrapolating to per-LiDAR sweep timestamps when the SLAM stack only\n   emits poses at frame rate.\n\nEither way, IMU sample timestamps go into the pose trajectory, **not** into\na separate component. If a downstream consumer wants raw IMU, stash the\nsamples in the sequence-level `generic_meta_data[\"imu_samples\"]` (compact)\nor in a sidecar file referenced from there.\n\nCalibration: IMU-to-camera and IMU-to-LiDAR extrinsics live in the static\npose graph as `T_imu_rig = I` if you take the IMU body frame as the rig\n(common for legged robots and drones), with `T_camera_rig` \u002F\n`T_lidar_rig` from kalibr \u002F `lidar_align` outputs. Pick **rig = IMU** when\nthe IMU is the trajectory reference; otherwise pick the mechanical body\nframe and store `T_imu_rig` for downstream tools that want IMU-frame data.\n\n### ROS2 bag (MCAP \u002F SQLite3)\n\nMost robotics datasets ship as ROS2 bags. The standard path is the\n**rosbags** Python library — no `rclpy` and no native ROS install required:\n\n```bash\npip install rosbags pyav   # pyav decodes H.264 video chunks; rosbags handles .mcap and .db3\n```\n\nConvert in **two passes**: first enumerate sensors and collect calibration \u002F\nthe static TF tree, then stream frames into the V4 writer. Common topic →\ncomponent mapping:\n\n| ROS2 message type | NCore mapping |\n|-------------------|---------------|\n| `sensor_msgs\u002FImage` (raw) | `CameraSensorComponent.store_frame` — re-encode to JPEG with PIL before storing (NCore stores bytes verbatim; raw bitmaps balloon the store) |\n| `sensor_msgs\u002FCompressedImage` | `CameraSensorComponent.store_frame` — pass `data` directly with `image_format=\"jpeg\"` or `\"png\"` |\n| `foxglove_msgs\u002FCompressedVideo` (H.264 chunks) | Decode with PyAV (`av.open(BytesIO(...))`) → re-encode each frame to JPEG → store |\n| `sensor_msgs\u002FCameraInfo` | Source for `OpenCVPinholeCameraModelParameters` (or fisheye) — `K`, `D`, `width\u002Fheight` |\n| `tf2_msgs\u002FTFMessage` | Read once, build the static TF tree (rosbags' built-in TF helper), derive `T_sensor_rig` per camera\u002Flidar |\n| `nav_msgs\u002FOdometry`, `geometry_msgs\u002FPoseStamped` | Dynamic `T_world_rig` waypoints — dense (IMU rate) if available, sparse otherwise |\n| `sensor_msgs\u002FImu` | Trajectory densifier only — integrate or feed into VIO; never stored as its own NCore component |\n| `sensor_msgs\u002FPointCloud2` | LiDAR sweep — per-point fields `(x, y, z, intensity, ring, t)` map to `direction = xyz \u002F norm`, `intensity`, `model_element[:, 0] = ring`. If `t` is absent, synthesise from sweep duration and azimuth bin (see Mono + LiDAR notes). |\n| `livox_ros_driver2\u002FCustomMsg` | Livox custom format — same as PointCloud2 plus per-point `offset_time` (ns from sweep start). Solid-state non-repetitive scans go into `PointCloudsComponent`, **not** `LidarSensorComponent` (see solid-state recipe). |\n\nNotes:\n\n- Rolling-shutter ROS2 cameras: `Image.header.stamp` is the **frame trigger**.\n  Compute `[exposure_start, exposure_end]` from `CameraInfo` exposure metadata\n  if present, otherwise read the device datasheet. Setting\n  `frame_timestamps_us = [trigger, trigger]` is acceptable for\n  well-synchronised global-shutter rigs, **wrong** for rolling-shutter\n  unless the readout time is small enough to ignore.\n- TF tree → rig frame: pick `base_link` (or whichever frame is configured\n  as the robot body) as **rig**. ROS REP 105 (`x` forward, `y` left,\n  `z` up) matches NCore's rig convention exactly — no rotation needed.\n- The `rosbags` API opens both MCAP and SQLite3 with the same code path;\n  only the file extension differs.\n- For multi-bag datasets (one bag per take), one bag = one V4 sequence.\n- Keep the bag's recording timestamps (not wall-clock playback) — bag\n  timestamps are µs-quantised already, perfect for NCore.\n\n### Aerial \u002F drone\n\nDrones add three failure modes on top of the standard mono+lidar \u002F stereo\nrecipes:\n\n- **Fast rotation**: pose trajectory must densify enough to keep angular\n  drift per waypoint below ~0.5°. At 100 °\u002Fs yaw rate, that means\n  waypoints every 5 ms — much tighter than a typical 10 Hz LiDAR. Use IMU\n  samples (200 Hz+) as the trajectory backbone; do not rely on per-LiDAR\n  poses alone.\n- **Rolling-shutter cameras** are common on consumer drones. Set\n  `ShutterType.ROLLING_TOP_TO_BOTTOM`, supply real `[exposure_start,\n  exposure_end]` per frame, and carry the per-row shutter delay into the\n  intrinsics if your model supports it (`shutter_delay_us` on\n  `OpenCVPinholeCameraModelParameters` for FTheta-like models).\n- **Wide altitude \u002F range**: a 5+ km loop in raw UTM at the end of the\n  flight loses the same precision that the AV first-pose re-referencing\n  fixes. For continuous takes under ~2 km, re-reference once to the\n  takeoff pose; for longer flights, segment the bag and emit one V4\n  sequence per segment.\n\nRig origin on a drone: **IMU body frame** is the canonical choice. All\nextrinsics are then `T_sensor_imu`. Rotor masks are usually unnecessary —\nrotors blur out of the FOV at flight RPM — but include a static mask of any\nfixed gimbal arm visible in the FOV.\n\n---\n\n## Robotics pipeline shards (r2s)\n\nThe r2s (\"robotics-to-sim\") pipeline chains NCore through pose, depth, mask,\nand refinement steps before NuRec. Each step writes its **own** NCore shard\nso that any module can be swapped, re-run, or skipped without rebuilding the\npreceding stages. If you're authoring a converter that feeds r2s — or a\ndownstream module that reads\u002Fwrites intermediate shards — follow this\nnaming + content contract.\n\n### Shard naming and contents\n\n| Shard | Producer | Components carried | Notes |\n|-------|----------|--------------------|-------|\n| `{name}.zarr.itar` | Ingestion (this skill) | `CameraSensor`, `Intrinsics`, `Poses` (static `T_sensor_rig` + identity-or-GPS `T_world_rig`), optional `LidarSensor`, sequence `generic_meta_data.stereo_pairs` | Base shard. All-frame images, no derived data. |\n| `{name}.poses.zarr.itar` | Pose Estimation (cuVSLAM \u002F KISS-ICP) | `Poses` (per-frame dynamic `T_world_rig`) | Full trajectory at every input-frame timestamp; **not** subsampled. |\n| `{name}.kf.zarr.itar` | Pose Refinement (cuSFM \u002F COLMAP) | `CameraSensor` (keyframe subset), `Intrinsics` (refined), `Poses` (BA-optimised), `PointClouds` (sparse SfM map, instance `sfm_points`) | Keyframe timestamps must be a strict subset of the base shard's frame timestamps. |\n| `{name}.depth.zarr.itar` | Depth Generation (Foundation Stereo \u002F MoGe-2 \u002F LiDAR projection) | per-frame `PointClouds` named `depth_\u003Ccamera_id>` (one entry per keyframe) | Until a first-class `DepthComponent` lands in V4, encode dense depth as a per-frame point cloud (camera-frame XYZ from depth + intrinsics). Stash uint16 mm depth in `generic_data[\"depth_mm\"]` for tools that want pixel-aligned access. |\n| `{name}.masks.zarr.itar` | Semantic Mask Generation (SAM2 \u002F Grounded-SAM) | `Masks` (per-camera, per-keyframe) | Masks here are **semantic** (sky, ground, dynamic-object), not just ego-vehicle. Ego masks may live alongside in the same component instance. |\n| `{name}.poses.scaled.zarr.itar` | Scale Refinement | `Poses` with `generic_meta_data.scale_factor` and per-frame bias | Same trajectory schema as `{name}.poses.zarr.itar`; recovered scale + per-frame bias recorded in metadata. |\n| `{name}.depth.refined.zarr.itar` | Depth Refinement | per-frame `PointClouds` (refined) | Same component layout as `{name}.depth.zarr.itar`, with cross-frame scale\u002Fbias and occlusion removal applied. |\n| `{name}.sim.zarr.itar` | Sensor-Data Simulation (NuRec renderer) | `CameraSensor`, `Poses`, `Intrinsics` matching the **target** trajectory | Same schema as a real base shard — directly consumable by any module. **Always** tag `generic_meta_data.source = \"simulation\"`. |\n\n### Component encoding until V4 ships first-class depth \u002F mappoints\n\nThe r2s spec references two components that are not yet in upstream V4:\n\n- `DepthComponent` (per-pixel uint16 depth, mm, per camera per keyframe).\n- `MapPointsComponent` (sparse SfM points + per-frame observations).\n\nUntil they ship, the safe encodings are:\n\n- **Dense depth** → per-frame `PointCloudsComponent`, instance name\n  `depth_\u003Ccamera_id>`, points in the camera frame at the keyframe\n  timestamp. Carry the raw uint16 depth array in\n  `generic_data[\"depth_mm\"]` if downstream tools need pixel-aligned access.\n- **SfM map** → a single `PointCloudsComponent` instance named\n  `sfm_points` (already produced by the upstream COLMAP converter).\n  Per-frame observation tracks, when needed, go in\n  `generic_meta_data[\"track_observations\"]`.\n\nTreat these as forward-compatible encodings: when V4 adds the first-class\ncomponents, the migration path is mechanical (copy the same arrays into\nthe new writer) and the data shape is already correct.\n\n### Validator hooks\n\nEach module's validator runs after its shard is written. The spec\nassertions that map onto NCore writer-time checks are already enforced\n(timestamp ordering, valid intrinsics, pose-trajectory completeness,\nstrict-increasing LiDAR azimuths). The remaining checks (depth value range,\nmask temporal consistency, scale factor bounds, etc.) are the **module's**\nresponsibility — see the r2s `modules.md` for the canonical list of per-step\nvalidations.\n\n---\n\n## Validation & end-to-end NuRec\n\nAfter every conversion, before assuming success:\n\n1. **`ncore_vis`** — visualise the store. Wrong sensor extrinsics, mirrored\n   LiDAR (`spinning_direction` flip), or rotated cameras are obvious here.\n2. **`ncore_project_pc_to_img`** — projects LiDAR onto camera frames. Crisp\n   alignment confirms `T_lidar_rig`, `T_camera_rig`, intrinsics, per-ray\n   timestamps, and pose-trajectory density are all correct simultaneously.\n   Smearing or doubling = motion-comp error (per-ray timestamps wrong, or\n   pose trajectory too sparse).\n3. **NuRec end-to-end**. Hand the converted store to the\n   [`nre`](..\u002Fnre\u002FSKILL.md) sibling skill — Workflow A wires together\n   aux-data generation (via `nre-tools`), 3DGUT training, USDZ export,\n   and novel-view rendering, and `references\u002Fconfiguration.md` documents\n   how to override `dataset.camera_ids` \u002F `dataset.lidar_ids` so the\n   training Hydra recipe matches your sensor IDs. For repeatable cluster\n   runs, wrap the convert + train + export sequence in an OSMO \u002F Slurm \u002F\n   Kubernetes pipeline that pins both the\n   [`NVIDIA\u002Fncore`](https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore) and NRE container\n   versions.\n\nNuRec's \"Ensure Data Quality\" doc (in the NuRec image) also lists\n`check_lidar_camera_sweep_alignment` and other validators you can run\npost-conversion.\n\n---\n\n## Troubleshooting (common failure modes and the fix file)\n\nThe canonical fixes live in code (`example_converter.py` inline comments) and\nin the spec; most \"NuRec produced garbage\" complaints reduce to one of:\n\n| Symptom (NuRec \u002F `ncore_vis`) | Almost-always cause | Fix |\n|--------|----------------|-----|\n| Z-flipped surfaces | `spinning_direction` wrong | Set `\"cw\"` for all common automotive spinning LiDARs |\n| Whole point cloud rotated horizontally | `column_azimuths_rad` starting at 0 instead of real heading | Derive azimuths from per-column pose data, or rotate `T_lidar_rig` to compensate (consistently) |\n| Strict-increasing assert in NCore writer | LiDAR elevations ascending or contain duplicates | Sort descending, nudge duplicates by 1e-6 rad |\n| `\"Dynamic poses must cover the full sequence time range\"` | Sequence interval built with `from_start_end(start, end + 1)` | Pass real inclusive end; the helper internally adds 1 |\n| `RuntimeError: double != float` at \"Get Lidar Point Clouds\" | `T_camera_rig` \u002F `T_lidar_rig` written as float64 | Cast extrinsics to float32 (only `world_world_global` stays float64) |\n| Reconstruction loses sub-cm detail at scene scale | Poses not re-referenced; raw UTM\u002FECEF cast to float32 | `poses = inv(poses[0]) @ poses` in float64, then cast |\n| Motion-comp blur \u002F rowing artefacts | Pose trajectory too sparse | Combine all available pose sources (every camera × every frame, plus IMU\u002FGPS), unique + sort |\n| Ghosting \u002F motion blur on rolling-shutter cameras | Single global timestamp used for all cameras, or `ShutterType.GLOBAL` set on rolling sensor | Per-camera per-frame `[exposure_start, exposure_end]`; map shutter direction by enum **name** |\n| Cuboids floating above ground | Bottom-center origin not converted | `centroid_z += dim_z \u002F 2`; verify with `mean(z) - mean(h)\u002F2 ≈ 0` |\n| Hood \u002F roof rack baked into reconstruction | Missing ego mask | Generate per-camera binary ego mask; pass via `MasksComponent.store_camera_masks` |\n| LiDAR projects 50 ms ahead of camera | Frame-start used as sweep midpoint (or vice versa) | `frame_timestamps_us[0]` = real sweep start; per-ray `timestamp_us` linear in column |\n| Foundation Stereo (or aux-data) cannot find its pair | Missing `stereo_pairs` on sequence `generic_meta_data` | Set `generic_meta_data={\"stereo_pairs\": [{\"left\": ..., \"right\": ...}]}` on `SequenceComponentGroupsWriter` |\n| Livox scan stored as a `LidarSensorComponent` but most rays read range 0 | Solid-state non-repetitive doesn't have a column grid | Use per-frame `PointCloudsComponent` (sensor-frame XYZ + per-point µs); skip `LidarSensorComponent` |\n| Drone reconstruction shows streaks \u002F motion smear | Trajectory densified at LiDAR rate (10 Hz) on a 200 °\u002Fs yaw motion | Use IMU samples (200 Hz+) as trajectory backbone; merge per-frame poses on top |\n| ROS2 raw-Image topic blows up store size 30× | Stored bitmap bytes verbatim instead of re-encoding to JPEG | PIL-encode each `sensor_msgs\u002FImage` to JPEG before `store_frame`; use `image_format=\"jpeg\"` |\n| Pipeline downstream module sees real data instead of sim | Renderer-output shard missing `source` tag | Set `generic_meta_data[\"source\"] = \"simulation\"` (and `\"model_checkpoint\"`) on the simulated sequence shard |\n| IMU samples written into a \"sensor\" component and rejected by NuRec | IMU is not a first-class V4 component | Drop IMU samples into the pose trajectory (or `generic_meta_data[\"imu_samples\"]`); never register an IMU writer |\n\n---\n\n## Limitations\n\n- **No first-class IMU component.** V4 has no IMU sensor type — IMU\n  samples must ride in the pose trajectory or in `generic_meta_data`\n  (never as a sensor writer).\n- **Per-ray LiDAR is the only motion-comp-safe option** for spinning\n  LiDARs. If the dataset only gives frame-level timestamps, expect\n  motion-blur smearing in NuRec; reconstruct per-ray timestamps from\n  azimuth or accept the artefact.\n- **Sub-cm scene detail at world scale** requires float64 pose math\n  followed by re-referencing (`poses = inv(poses[0]) @ poses`)\n  *before* writing as float32. Raw UTM\u002FECEF casts to float32 will\n  silently lose centimetre-scale geometry.\n- **Rolling-shutter cameras** need per-camera per-frame\n  `[exposure_start, exposure_end]` *and* the correct `ShutterType`\n  by enum **name** — a single global timestamp will produce ghosting.\n- **Solid-state non-repetitive LiDAR (Livox-style)** must use\n  `PointCloudsComponent`, not `LidarSensorComponent` (the latter\n  assumes a column grid).\n- **The converter is one-way.** There is no `v4 → original` tool;\n  always keep the source dataset alongside.\n- This skill is **convert + validate only**. Training, rendering, or\n  USDZ packaging is the `nre` skill's job.\n\n## Additional resources\n\n- Install: `pip install nvidia-ncore`\n- Source, docs, examples: \u003Chttps:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore>\n- V4 spec: \u003Chttps:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fdata\u002Fconventions.html>\n- Sensor models: \u003Chttps:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fdata\u002Fsensor_models.html>\n- API reference: \u003Chttps:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fapis\u002Fdata.v4.html>\n- Conversion guides (PAI, Waymo, COLMAP, ScanNet++):\n  \u003Chttps:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fconversions\u002Findex.html>\n- Skeleton converter (FILL IN walkthrough):\n  [`ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py`](ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py)\n- NRE training \u002F rendering \u002F USDZ export from a converted store:\n  [`..\u002Fnre\u002FSKILL.md`](..\u002Fnre\u002FSKILL.md)\n- HuggingFace dataset catalog and download recipes:\n  [`..\u002Fphysical-ai-datasets\u002FSKILL.md`](..\u002Fphysical-ai-datasets\u002FSKILL.md)\n- Upstream NCore PAI \u002F Waymo \u002F COLMAP converter targets:\n  \u003Chttps:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore\u002Ftree\u002Fmain\u002Ftools\u002Fdata_converter>\n",{"data":35,"body":50},{"name":4,"description":6,"version":36,"tools":37,"license":26,"metadata":41},"0.1.0",[38,39,40],"Shell","Read","Write",{"author":42,"tags":43,"upstream":47,"spec_docs":48,"release_tag":49},"NVIDIA NCore",[4,44,45,14,46],"data-conversion","autonomous-vehicles","sensors","https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore","https:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fdata\u002Fconventions.html","2026.04",{"type":51,"children":52},"root",[53,62,69,100,118,126,176,209,215,451,455,460,692,704,707,713,782,789,813,907,935,1042,1055,1060,1123,1223,1226,1231,1257,1591,1596,1795,1806,1812,1833,2051,2054,2060,2065,2108,2119,2124,2137,2143,2210,2318,2324,2506,2512,2576,2579,2584,2604,2610,2648,2669,2772,2799,2804,2912,2918,2931,3035,3040,3043,3048,3053,3059,3238,3244,3356,3362,3646,3651,3765,3771,3875,3881,3886,3928,3931,3936,3941,3951,4199,4204,4380,4385,4401,4549,4553,4682,4687,4697,4702,4823,4828,4838,4843,4974,4979,5037,5041,5162,5166,5347,5350,5355,5379,5384,5389,5587,5591,5658,5663,5668,5787,5792,5797,6170,6175,6180,6188,6361,6366,6371,6511,6516,6535,6540,6591,6611,6616,6627,6658,6677,6726,6731,6751,6784,6796,7124,7128,7243,7248,7253,7315,7335,7338,7343,7355,7361,7815,7821,7826,7850,7855,7920,7925,7931,7951,7954,7959,7964,8073,8086,8089,8095,8108,8653,8656,8662,8809,8814,8927],{"type":54,"tag":55,"props":56,"children":58},"element","h1",{"id":57},"ncore-v4-data-conversion",[59],{"type":60,"value":61},"text","NCore V4 Data Conversion",{"type":54,"tag":63,"props":64,"children":66},"h2",{"id":65},"purpose",[67],{"type":60,"value":68},"Purpose",{"type":54,"tag":70,"props":71,"children":72},"p",{},[73,75,81,83,90,92,98],{"type":60,"value":74},"Convert any sensor recording (cameras, LiDAR, radar, IMU, depth,\nstereo, COLMAP\u002FSfM, ROS 2 bag) into a valid NVIDIA ",{"type":54,"tag":76,"props":77,"children":78},"strong",{},[79],{"type":60,"value":80},"NCore V4",{"type":60,"value":82}," store\nso it can be consumed by NuRec \u002F Asset Harvester \u002F ",{"type":54,"tag":84,"props":85,"children":87},"code",{"className":86},[],[88],{"type":60,"value":89},"ncore_vis",{"type":60,"value":91},", or\nwired into a robotics-to-sim (\"r2s\") pipeline. Drive the existing\nin-tree converters (PAI, Waymo, COLMAP\u002FScanNet++) or author a new\nconverter from ",{"type":54,"tag":84,"props":93,"children":95},{"className":94},[],[96],{"type":60,"value":97},"ncore_template\u002F",{"type":60,"value":99},".",{"type":54,"tag":70,"props":101,"children":102},{},[103,108,110,116],{"type":54,"tag":76,"props":104,"children":105},{},[106],{"type":60,"value":107},"Use this skill when:",{"type":60,"value":109}," the user has raw sensor data (any rig) that\nNuRec or Asset Harvester needs to ingest, or when an existing\nconverter is failing ",{"type":54,"tag":84,"props":111,"children":113},{"className":112},[],[114],{"type":60,"value":115},"validate.py",{"type":60,"value":117}," \u002F producing NuRec data-quality\ncomplaints.",{"type":54,"tag":70,"props":119,"children":120},{},[121],{"type":54,"tag":76,"props":122,"children":123},{},[124],{"type":60,"value":125},"Do NOT use this skill when:",{"type":54,"tag":127,"props":128,"children":129},"ul",{},[130,151,164],{"type":54,"tag":131,"props":132,"children":133},"li",{},[134,136,141,143,149],{"type":60,"value":135},"The user is ",{"type":54,"tag":76,"props":137,"children":138},{},[139],{"type":60,"value":140},"already on V4",{"type":60,"value":142}," and only wants to train or render\n(use the ",{"type":54,"tag":84,"props":144,"children":146},{"className":145},[],[147],{"type":60,"value":148},"nre",{"type":60,"value":150}," skill).",{"type":54,"tag":131,"props":152,"children":153},{},[154,156,162],{"type":60,"value":155},"The user wants per-object 3D assets from sparse views (use\n",{"type":54,"tag":84,"props":157,"children":159},{"className":158},[],[160],{"type":60,"value":161},"asset-harvester",{"type":60,"value":163},").",{"type":54,"tag":131,"props":165,"children":166},{},[167,169,175],{"type":60,"value":168},"The user only needs to browse \u002F pick an existing NVIDIA dataset\n(use ",{"type":54,"tag":84,"props":170,"children":172},{"className":171},[],[173],{"type":60,"value":174},"physical-ai-datasets",{"type":60,"value":163},{"type":54,"tag":70,"props":177,"children":178},{},[179,181,186,188,193,195,200,202,207],{"type":60,"value":180},"This skill teaches an agent to take ",{"type":54,"tag":76,"props":182,"children":183},{},[184],{"type":60,"value":185},"any",{"type":60,"value":187}," sensor dataset and produce a valid\nNCore V4 store that NuRec \u002F Asset Harvester \u002F ",{"type":54,"tag":84,"props":189,"children":191},{"className":190},[],[192],{"type":60,"value":89},{"type":60,"value":194}," will accept. It covers\nboth ",{"type":54,"tag":76,"props":196,"children":197},{},[198],{"type":60,"value":199},"driving the existing in-tree converters",{"type":60,"value":201}," (PAI, Waymo, COLMAP\u002FScanNet++)\nand ",{"type":54,"tag":76,"props":203,"children":204},{},[205],{"type":60,"value":206},"writing a new one",{"type":60,"value":208}," for unsupported formats (PandaSet, NuScenes, KITTI,\nstereo, mono+depth, mono+lidar, custom robotics rigs).",{"type":54,"tag":63,"props":210,"children":212},{"id":211},"table-of-contents",[213],{"type":60,"value":214},"Table of Contents",{"type":54,"tag":216,"props":217,"children":218},"ol",{},[219,229,238,247,256,265,274,322,415,424,433,442],{"type":54,"tag":131,"props":220,"children":221},{},[222],{"type":54,"tag":223,"props":224,"children":226},"a",{"href":225},"#when-to-use-which-path",[227],{"type":60,"value":228},"When to use which path",{"type":54,"tag":131,"props":230,"children":231},{},[232],{"type":54,"tag":223,"props":233,"children":235},{"href":234},"#install--references",[236],{"type":60,"value":237},"Install & references",{"type":54,"tag":131,"props":239,"children":240},{},[241],{"type":54,"tag":223,"props":242,"children":244},{"href":243},"#mental-model--the-v4-store",[245],{"type":60,"value":246},"Mental model — the V4 store",{"type":54,"tag":131,"props":248,"children":249},{},[250],{"type":54,"tag":223,"props":251,"children":253},{"href":252},"#path-a--drive-an-existing-in-tree-converter",[254],{"type":60,"value":255},"Path A — drive an existing in-tree converter",{"type":54,"tag":131,"props":257,"children":258},{},[259],{"type":54,"tag":223,"props":260,"children":262},{"href":261},"#path-b--author-a-new-converter-from-the-template",[263],{"type":60,"value":264},"Path B — author a new converter from the template",{"type":54,"tag":131,"props":266,"children":267},{},[268],{"type":54,"tag":223,"props":269,"children":271},{"href":270},"#v4-conventions-you-must-obey",[272],{"type":60,"value":273},"V4 conventions you must obey",{"type":54,"tag":131,"props":275,"children":276},{},[277,283],{"type":54,"tag":223,"props":278,"children":280},{"href":279},"#format-recipes-av",[281],{"type":60,"value":282},"Format recipes (AV)",{"type":54,"tag":127,"props":284,"children":285},{},[286,295,304,313],{"type":54,"tag":131,"props":287,"children":288},{},[289],{"type":54,"tag":223,"props":290,"children":292},{"href":291},"#pai-nvidia-physical-ai-autonomous-vehicles-huggingface",[293],{"type":60,"value":294},"PAI (NVIDIA Physical AI Autonomous Vehicles, HuggingFace)",{"type":54,"tag":131,"props":296,"children":297},{},[298],{"type":54,"tag":223,"props":299,"children":301},{"href":300},"#waymo-open",[302],{"type":60,"value":303},"Waymo Open",{"type":54,"tag":131,"props":305,"children":306},{},[307],{"type":54,"tag":223,"props":308,"children":310},{"href":309},"#pandaset",[311],{"type":60,"value":312},"PandaSet",{"type":54,"tag":131,"props":314,"children":315},{},[316],{"type":54,"tag":223,"props":317,"children":319},{"href":318},"#nuscenes",[320],{"type":60,"value":321},"NuScenes",{"type":54,"tag":131,"props":323,"children":324},{},[325,331],{"type":54,"tag":223,"props":326,"children":328},{"href":327},"#format-recipes-non-av--sensor-only",[329],{"type":60,"value":330},"Format recipes (non-AV \u002F sensor-only)",{"type":54,"tag":127,"props":332,"children":333},{},[334,343,352,361,370,379,388,397,406],{"type":54,"tag":131,"props":335,"children":336},{},[337],{"type":54,"tag":223,"props":338,"children":340},{"href":339},"#mono-camera-no-depth-no-lidar--colmap-track",[341],{"type":60,"value":342},"Mono camera (no depth, no LiDAR) → COLMAP track",{"type":54,"tag":131,"props":344,"children":345},{},[346],{"type":54,"tag":223,"props":347,"children":349},{"href":348},"#stereo-cameras",[350],{"type":60,"value":351},"Stereo cameras",{"type":54,"tag":131,"props":353,"children":354},{},[355],{"type":54,"tag":223,"props":356,"children":358},{"href":357},"#multi-stereo-rig-surround-stereo",[359],{"type":60,"value":360},"Multi-stereo rig (surround stereo)",{"type":54,"tag":131,"props":362,"children":363},{},[364],{"type":54,"tag":223,"props":365,"children":367},{"href":366},"#mono--depth-rgb-d--learned-depth",[368],{"type":60,"value":369},"Mono + depth (RGB-D \u002F learned depth)",{"type":54,"tag":131,"props":371,"children":372},{},[373],{"type":54,"tag":223,"props":374,"children":376},{"href":375},"#mono--lidar-handheld--robot",[377],{"type":60,"value":378},"Mono + LiDAR (handheld \u002F robot)",{"type":54,"tag":131,"props":380,"children":381},{},[382],{"type":54,"tag":223,"props":383,"children":385},{"href":384},"#solid-state--non-repetitive-lidar-livox",[386],{"type":60,"value":387},"Solid-state \u002F non-repetitive LiDAR (Livox)",{"type":54,"tag":131,"props":389,"children":390},{},[391],{"type":54,"tag":223,"props":392,"children":394},{"href":393},"#imu--camera-visual-inertial",[395],{"type":60,"value":396},"IMU + camera (visual-inertial)",{"type":54,"tag":131,"props":398,"children":399},{},[400],{"type":54,"tag":223,"props":401,"children":403},{"href":402},"#ros2-bag-mcap--sqlite3",[404],{"type":60,"value":405},"ROS2 bag (MCAP \u002F SQLite3)",{"type":54,"tag":131,"props":407,"children":408},{},[409],{"type":54,"tag":223,"props":410,"children":412},{"href":411},"#aerial--drone",[413],{"type":60,"value":414},"Aerial \u002F drone",{"type":54,"tag":131,"props":416,"children":417},{},[418],{"type":54,"tag":223,"props":419,"children":421},{"href":420},"#robotics-pipeline-shards-r2s",[422],{"type":60,"value":423},"Robotics pipeline shards (r2s)",{"type":54,"tag":131,"props":425,"children":426},{},[427],{"type":54,"tag":223,"props":428,"children":430},{"href":429},"#validation--end-to-end-nurec",[431],{"type":60,"value":432},"Validation & end-to-end NuRec",{"type":54,"tag":131,"props":434,"children":435},{},[436],{"type":54,"tag":223,"props":437,"children":439},{"href":438},"#common-failure-modes-and-the-fix-file",[440],{"type":60,"value":441},"Common failure modes (and the fix file)",{"type":54,"tag":131,"props":443,"children":444},{},[445],{"type":54,"tag":223,"props":446,"children":448},{"href":447},"#additional-resources",[449],{"type":60,"value":450},"Additional resources",{"type":54,"tag":452,"props":453,"children":454},"hr",{},[],{"type":54,"tag":63,"props":456,"children":458},{"id":457},"when-to-use-which-path",[459],{"type":60,"value":228},{"type":54,"tag":461,"props":462,"children":463},"table",{},[464,483],{"type":54,"tag":465,"props":466,"children":467},"thead",{},[468],{"type":54,"tag":469,"props":470,"children":471},"tr",{},[472,478],{"type":54,"tag":473,"props":474,"children":475},"th",{},[476],{"type":60,"value":477},"You have…",{"type":54,"tag":473,"props":479,"children":480},{},[481],{"type":60,"value":482},"Use",{"type":54,"tag":484,"props":485,"children":486},"tbody",{},[487,530,568,605,628,652,667],{"type":54,"tag":469,"props":488,"children":489},{},[490,496],{"type":54,"tag":491,"props":492,"children":493},"td",{},[494],{"type":60,"value":495},"PAI clip on HuggingFace, or a local PAI clip directory",{"type":54,"tag":491,"props":497,"children":498},{},[499,504,506,512,514,520,522,528],{"type":54,"tag":76,"props":500,"children":501},{},[502],{"type":60,"value":503},"Path A",{"type":60,"value":505}," — ",{"type":54,"tag":84,"props":507,"children":509},{"className":508},[],[510],{"type":60,"value":511},"tools\u002Fdata_converter\u002Fpai:convert",{"type":60,"value":513}," (",{"type":54,"tag":84,"props":515,"children":517},{"className":516},[],[518],{"type":60,"value":519},"pai-stream-v4",{"type":60,"value":521}," \u002F ",{"type":54,"tag":84,"props":523,"children":525},{"className":524},[],[526],{"type":60,"value":527},"pai-v4",{"type":60,"value":529},")",{"type":54,"tag":469,"props":531,"children":532},{},[533,546],{"type":54,"tag":491,"props":534,"children":535},{},[536,538,544],{"type":60,"value":537},"Waymo ",{"type":54,"tag":84,"props":539,"children":541},{"className":540},[],[542],{"type":60,"value":543},".tfrecord",{"type":60,"value":545}," files",{"type":54,"tag":491,"props":547,"children":548},{},[549,553,554,560,561,567],{"type":54,"tag":76,"props":550,"children":551},{},[552],{"type":60,"value":503},{"type":60,"value":505},{"type":54,"tag":84,"props":555,"children":557},{"className":556},[],[558],{"type":60,"value":559},"tools\u002Fdata_converter\u002Fwaymo:convert",{"type":60,"value":513},{"type":54,"tag":84,"props":562,"children":564},{"className":563},[],[565],{"type":60,"value":566},"waymo-v4",{"type":60,"value":529},{"type":54,"tag":469,"props":569,"children":570},{},[571,576],{"type":54,"tag":491,"props":572,"children":573},{},[574],{"type":60,"value":575},"COLMAP scene (or ScanNet++ DSLR)",{"type":54,"tag":491,"props":577,"children":578},{},[579,583,584,590,591,597,598,604],{"type":54,"tag":76,"props":580,"children":581},{},[582],{"type":60,"value":503},{"type":60,"value":505},{"type":54,"tag":84,"props":585,"children":587},{"className":586},[],[588],{"type":60,"value":589},"tools\u002Fdata_converter\u002Fcolmap:convert",{"type":60,"value":513},{"type":54,"tag":84,"props":592,"children":594},{"className":593},[],[595],{"type":60,"value":596},"colmap-v4",{"type":60,"value":521},{"type":54,"tag":84,"props":599,"children":601},{"className":600},[],[602],{"type":60,"value":603},"scannetpp-v4",{"type":60,"value":529},{"type":54,"tag":469,"props":606,"children":607},{},[608,613],{"type":54,"tag":491,"props":609,"children":610},{},[611],{"type":60,"value":612},"Mono RGB images, no poses",{"type":54,"tag":491,"props":614,"children":615},{},[616,621,623],{"type":54,"tag":76,"props":617,"children":618},{},[619],{"type":60,"value":620},"Path A.5",{"type":60,"value":622}," — run COLMAP first, then ",{"type":54,"tag":84,"props":624,"children":626},{"className":625},[],[627],{"type":60,"value":596},{"type":54,"tag":469,"props":629,"children":630},{},[631,636],{"type":54,"tag":491,"props":632,"children":633},{},[634],{"type":60,"value":635},"PandaSet, NuScenes, KITTI, Argoverse, custom AV rig",{"type":54,"tag":491,"props":637,"children":638},{},[639,644,646],{"type":54,"tag":76,"props":640,"children":641},{},[642],{"type":60,"value":643},"Path B",{"type":60,"value":645}," — author from ",{"type":54,"tag":84,"props":647,"children":649},{"className":648},[],[650],{"type":60,"value":651},"ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py",{"type":54,"tag":469,"props":653,"children":654},{},[655,660],{"type":54,"tag":491,"props":656,"children":657},{},[658],{"type":60,"value":659},"Stereo \u002F mono+depth \u002F mono+lidar \u002F robotics",{"type":54,"tag":491,"props":661,"children":662},{},[663],{"type":54,"tag":76,"props":664,"children":665},{},[666],{"type":60,"value":643},{"type":54,"tag":469,"props":668,"children":669},{},[670,675],{"type":54,"tag":491,"props":671,"children":672},{},[673],{"type":60,"value":674},"Already have parsed numpy\u002Ftorch arrays in memory",{"type":54,"tag":491,"props":676,"children":677},{},[678,682,684,690],{"type":54,"tag":76,"props":679,"children":680},{},[681],{"type":60,"value":643},{"type":60,"value":683}," but skip Bazel — use ",{"type":54,"tag":84,"props":685,"children":687},{"className":686},[],[688],{"type":60,"value":689},"ncore.data.v4",{"type":60,"value":691}," API directly",{"type":54,"tag":70,"props":693,"children":694},{},[695,697,702],{"type":60,"value":696},"If a candidate path exists in upstream, ",{"type":54,"tag":76,"props":698,"children":699},{},[700],{"type":60,"value":701},"prefer it",{"type":60,"value":703},". Hand-rolling a Waymo or\nPAI converter on top of the template is wasted work and almost certainly wrong\n(rolling-shutter timing, FTheta intrinsics, Waymo camera-frame rotation, etc).",{"type":54,"tag":452,"props":705,"children":706},{},[],{"type":54,"tag":63,"props":708,"children":710},{"id":709},"prerequisites",[711],{"type":60,"value":712},"Prerequisites",{"type":54,"tag":127,"props":714,"children":715},{},[716,728,739,757,769],{"type":54,"tag":131,"props":717,"children":718},{},[719,721,727],{"type":60,"value":720},"Linux host with Python ≥ 3.10 and ",{"type":54,"tag":84,"props":722,"children":724},{"className":723},[],[725],{"type":60,"value":726},"pip",{"type":60,"value":99},{"type":54,"tag":131,"props":729,"children":730},{},[731,737],{"type":54,"tag":84,"props":732,"children":734},{"className":733},[],[735],{"type":60,"value":736},"git",{"type":60,"value":738}," for the upstream converter sources.",{"type":54,"tag":131,"props":740,"children":741},{},[742,748,750,755],{"type":54,"tag":84,"props":743,"children":745},{"className":744},[],[746],{"type":60,"value":747},"bazel",{"type":60,"value":749}," only if you run the in-tree converters (Path A); pure-Python\nin-process writes (",{"type":54,"tag":84,"props":751,"children":753},{"className":752},[],[754],{"type":60,"value":689},{"type":60,"value":756},") need no Bazel.",{"type":54,"tag":131,"props":758,"children":759},{},[760,762,768],{"type":60,"value":761},"Disk: budget tens of GB per converted clip; pre-zarr scratch can be\nlarger than the final ",{"type":54,"tag":84,"props":763,"children":765},{"className":764},[],[766],{"type":60,"value":767},".zarr.itar",{"type":60,"value":99},{"type":54,"tag":131,"props":770,"children":771},{},[772,774,780],{"type":60,"value":773},"HuggingFace token (",{"type":54,"tag":84,"props":775,"children":777},{"className":776},[],[778],{"type":60,"value":779},"HF_TOKEN",{"type":60,"value":781},") only if pulling a gated PAI clip.",{"type":54,"tag":783,"props":784,"children":786},"h3",{"id":785},"verifying-secrets-safely",[787],{"type":60,"value":788},"Verifying secrets safely",{"type":54,"tag":70,"props":790,"children":791},{},[792,811],{"type":54,"tag":76,"props":793,"children":794},{},[795,797,802,804,809],{"type":60,"value":796},"Always verify prerequisites with the upstream ",{"type":54,"tag":84,"props":798,"children":800},{"className":799},[],[801],{"type":60,"value":115},{"type":60,"value":803}," or by\nrunning the converter against a tiny test slice; never write ad-hoc\nbash that interpolates ",{"type":54,"tag":84,"props":805,"children":807},{"className":806},[],[808],{"type":60,"value":779},{"type":60,"value":810}," values.",{"type":60,"value":812}," The common one-liner",{"type":54,"tag":814,"props":815,"children":820},"pre",{"className":816,"code":817,"language":818,"meta":819,"style":819},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# BAD — leaks the secret to the terminal when the variable is set\necho \"HF_TOKEN: ${HF_TOKEN:+yes}${HF_TOKEN:-no}\"\n","bash","",[821],{"type":54,"tag":84,"props":822,"children":823},{"__ignoreMap":819},[824,836],{"type":54,"tag":825,"props":826,"children":829},"span",{"class":827,"line":828},"line",1,[830],{"type":54,"tag":825,"props":831,"children":833},{"style":832},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[834],{"type":60,"value":835},"# BAD — leaks the secret to the terminal when the variable is set\n",{"type":54,"tag":825,"props":837,"children":839},{"class":827,"line":838},2,[840,846,852,858,863,868,873,878,883,888,892,897,902],{"type":54,"tag":825,"props":841,"children":843},{"style":842},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[844],{"type":60,"value":845},"echo",{"type":54,"tag":825,"props":847,"children":849},{"style":848},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[850],{"type":60,"value":851}," \"",{"type":54,"tag":825,"props":853,"children":855},{"style":854},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[856],{"type":60,"value":857},"HF_TOKEN: ",{"type":54,"tag":825,"props":859,"children":860},{"style":848},[861],{"type":60,"value":862},"${",{"type":54,"tag":825,"props":864,"children":866},{"style":865},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[867],{"type":60,"value":779},{"type":54,"tag":825,"props":869,"children":870},{"style":848},[871],{"type":60,"value":872},":",{"type":54,"tag":825,"props":874,"children":875},{"style":854},[876],{"type":60,"value":877},"+",{"type":54,"tag":825,"props":879,"children":880},{"style":865},[881],{"type":60,"value":882},"yes",{"type":54,"tag":825,"props":884,"children":885},{"style":848},[886],{"type":60,"value":887},"}${",{"type":54,"tag":825,"props":889,"children":890},{"style":865},[891],{"type":60,"value":779},{"type":54,"tag":825,"props":893,"children":894},{"style":848},[895],{"type":60,"value":896},":-",{"type":54,"tag":825,"props":898,"children":899},{"style":865},[900],{"type":60,"value":901},"no",{"type":54,"tag":825,"props":903,"children":904},{"style":848},[905],{"type":60,"value":906},"}\"\n",{"type":54,"tag":70,"props":908,"children":909},{},[910,912,918,920,925,927,933],{"type":60,"value":911},"prints ",{"type":54,"tag":84,"props":913,"children":915},{"className":914},[],[916],{"type":60,"value":917},"yes\u003Ctoken-value>",{"type":60,"value":919}," whenever ",{"type":54,"tag":84,"props":921,"children":923},{"className":922},[],[924],{"type":60,"value":779},{"type":60,"value":926}," is set, because\n",{"type":54,"tag":84,"props":928,"children":930},{"className":929},[],[931],{"type":60,"value":932},"${VAR:-no}",{"type":60,"value":934}," only falls back to \"no\" when the variable is empty. Use\na length-only check, which never echoes the value:",{"type":54,"tag":814,"props":936,"children":938},{"className":816,"code":937,"language":818,"meta":819,"style":819},"# OK — prints \"set (N chars)\" or \"missing\", never the value\ntest -n \"$HF_TOKEN\" && echo \"HF_TOKEN: set (${#HF_TOKEN} chars)\" || echo \"HF_TOKEN: missing\"\n",[939],{"type":54,"tag":84,"props":940,"children":941},{"__ignoreMap":819},[942,950],{"type":54,"tag":825,"props":943,"children":944},{"class":827,"line":828},[945],{"type":54,"tag":825,"props":946,"children":947},{"style":832},[948],{"type":60,"value":949},"# OK — prints \"set (N chars)\" or \"missing\", never the value\n",{"type":54,"tag":825,"props":951,"children":952},{"class":827,"line":838},[953,958,963,967,972,977,982,987,991,996,1001,1005,1010,1015,1019,1024,1028,1032,1037],{"type":54,"tag":825,"props":954,"children":955},{"style":842},[956],{"type":60,"value":957},"test",{"type":54,"tag":825,"props":959,"children":960},{"style":854},[961],{"type":60,"value":962}," -n",{"type":54,"tag":825,"props":964,"children":965},{"style":848},[966],{"type":60,"value":851},{"type":54,"tag":825,"props":968,"children":969},{"style":865},[970],{"type":60,"value":971},"$HF_TOKEN",{"type":54,"tag":825,"props":973,"children":974},{"style":848},[975],{"type":60,"value":976},"\"",{"type":54,"tag":825,"props":978,"children":979},{"style":848},[980],{"type":60,"value":981}," &&",{"type":54,"tag":825,"props":983,"children":984},{"style":842},[985],{"type":60,"value":986}," echo",{"type":54,"tag":825,"props":988,"children":989},{"style":848},[990],{"type":60,"value":851},{"type":54,"tag":825,"props":992,"children":993},{"style":854},[994],{"type":60,"value":995},"HF_TOKEN: set (",{"type":54,"tag":825,"props":997,"children":998},{"style":848},[999],{"type":60,"value":1000},"${#",{"type":54,"tag":825,"props":1002,"children":1003},{"style":865},[1004],{"type":60,"value":779},{"type":54,"tag":825,"props":1006,"children":1007},{"style":848},[1008],{"type":60,"value":1009},"}",{"type":54,"tag":825,"props":1011,"children":1012},{"style":854},[1013],{"type":60,"value":1014}," chars)",{"type":54,"tag":825,"props":1016,"children":1017},{"style":848},[1018],{"type":60,"value":976},{"type":54,"tag":825,"props":1020,"children":1021},{"style":848},[1022],{"type":60,"value":1023}," ||",{"type":54,"tag":825,"props":1025,"children":1026},{"style":842},[1027],{"type":60,"value":986},{"type":54,"tag":825,"props":1029,"children":1030},{"style":848},[1031],{"type":60,"value":851},{"type":54,"tag":825,"props":1033,"children":1034},{"style":854},[1035],{"type":60,"value":1036},"HF_TOKEN: missing",{"type":54,"tag":825,"props":1038,"children":1039},{"style":848},[1040],{"type":60,"value":1041},"\"\n",{"type":54,"tag":70,"props":1043,"children":1044},{},[1045,1047,1054],{"type":60,"value":1046},"Rotate any token you suspect was echoed at\n",{"type":54,"tag":223,"props":1048,"children":1052},{"href":1049,"rel":1050},"https:\u002F\u002Fhuggingface.co\u002Fsettings\u002Ftokens",[1051],"nofollow",[1053],{"type":60,"value":1049},{"type":60,"value":99},{"type":54,"tag":63,"props":1056,"children":1058},{"id":1057},"install-references",[1059],{"type":60,"value":237},{"type":54,"tag":814,"props":1061,"children":1063},{"className":816,"code":1062,"language":818,"meta":819,"style":819},"pip install nvidia-ncore        # pure-Python API for in-process writes\ngit clone --depth 1 https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore.git   # for upstream converters (Bazel)\n",[1064],{"type":54,"tag":84,"props":1065,"children":1066},{"__ignoreMap":819},[1067,1090],{"type":54,"tag":825,"props":1068,"children":1069},{"class":827,"line":828},[1070,1075,1080,1085],{"type":54,"tag":825,"props":1071,"children":1073},{"style":1072},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1074],{"type":60,"value":726},{"type":54,"tag":825,"props":1076,"children":1077},{"style":854},[1078],{"type":60,"value":1079}," install",{"type":54,"tag":825,"props":1081,"children":1082},{"style":854},[1083],{"type":60,"value":1084}," nvidia-ncore",{"type":54,"tag":825,"props":1086,"children":1087},{"style":832},[1088],{"type":60,"value":1089},"        # pure-Python API for in-process writes\n",{"type":54,"tag":825,"props":1091,"children":1092},{"class":827,"line":838},[1093,1097,1102,1107,1113,1118],{"type":54,"tag":825,"props":1094,"children":1095},{"style":1072},[1096],{"type":60,"value":736},{"type":54,"tag":825,"props":1098,"children":1099},{"style":854},[1100],{"type":60,"value":1101}," clone",{"type":54,"tag":825,"props":1103,"children":1104},{"style":854},[1105],{"type":60,"value":1106}," --depth",{"type":54,"tag":825,"props":1108,"children":1110},{"style":1109},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1111],{"type":60,"value":1112}," 1",{"type":54,"tag":825,"props":1114,"children":1115},{"style":854},[1116],{"type":60,"value":1117}," https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore.git",{"type":54,"tag":825,"props":1119,"children":1120},{"style":832},[1121],{"type":60,"value":1122},"   # for upstream converters (Bazel)\n",{"type":54,"tag":127,"props":1124,"children":1125},{},[1126,1136,1146,1157,1168,1179,1192],{"type":54,"tag":131,"props":1127,"children":1128},{},[1129,1131],{"type":60,"value":1130},"Source + upstream converters: ",{"type":54,"tag":223,"props":1132,"children":1134},{"href":47,"rel":1133},[1051],[1135],{"type":60,"value":47},{"type":54,"tag":131,"props":1137,"children":1138},{},[1139,1141],{"type":60,"value":1140},"V4 spec \u002F conventions: ",{"type":54,"tag":223,"props":1142,"children":1144},{"href":48,"rel":1143},[1051],[1145],{"type":60,"value":48},{"type":54,"tag":131,"props":1147,"children":1148},{},[1149,1151],{"type":60,"value":1150},"API reference: ",{"type":54,"tag":223,"props":1152,"children":1155},{"href":1153,"rel":1154},"https:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fapis\u002Fdata.v4.html",[1051],[1156],{"type":60,"value":1153},{"type":54,"tag":131,"props":1158,"children":1159},{},[1160,1162],{"type":60,"value":1161},"Conversion guides: ",{"type":54,"tag":223,"props":1163,"children":1166},{"href":1164,"rel":1165},"https:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fconversions\u002Findex.html",[1051],[1167],{"type":60,"value":1164},{"type":54,"tag":131,"props":1169,"children":1170},{},[1171,1173],{"type":60,"value":1172},"Sensor models (camera, LiDAR, windshield): ",{"type":54,"tag":223,"props":1174,"children":1177},{"href":1175,"rel":1176},"https:\u002F\u002Fnvidia.github.io\u002Fncore\u002Fdata\u002Fsensor_models.html",[1051],[1178],{"type":60,"value":1175},{"type":54,"tag":131,"props":1180,"children":1181},{},[1182,1184],{"type":60,"value":1183},"The template scaffold (every method documented inline):\n",{"type":54,"tag":223,"props":1185,"children":1186},{"href":651},[1187],{"type":54,"tag":84,"props":1188,"children":1190},{"className":1189},[],[1191],{"type":60,"value":651},{"type":54,"tag":131,"props":1193,"children":1194},{},[1195,1197,1206,1208,1214,1216,1222],{"type":60,"value":1196},"End-to-end NCore → NRE training and rendering: see the sibling\n",{"type":54,"tag":223,"props":1198,"children":1200},{"href":1199},"..\u002Fnre\u002FSKILL.md",[1201],{"type":54,"tag":84,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":60,"value":148},{"type":60,"value":1207}," skill (Workflow A). NVIDIA's reference\nOSMO recipe that wires PAI → NCore → NuRec → USDZ training lives\nin the upstream NCore repo at\n",{"type":54,"tag":223,"props":1209,"children":1212},{"href":1210,"rel":1211},"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore\u002Ftree\u002Fmain\u002Ftools\u002Fdata_converter\u002Fpai",[1051],[1213],{"type":60,"value":1210},{"type":60,"value":1215},"\nand the NRE container docs at\n",{"type":54,"tag":223,"props":1217,"children":1220},{"href":1218,"rel":1219},"https:\u002F\u002Fwww.nvidia.com\u002Fen-us\u002Fomniverse\u002Fnurec\u002F",[1051],[1221],{"type":60,"value":1218},{"type":60,"value":99},{"type":54,"tag":452,"props":1224,"children":1225},{},[],{"type":54,"tag":63,"props":1227,"children":1229},{"id":1228},"mental-model-the-v4-store",[1230],{"type":60,"value":246},{"type":54,"tag":70,"props":1232,"children":1233},{},[1234,1236,1241,1242,1248,1250,1255],{"type":60,"value":1235},"Every V4 sequence is one ",{"type":54,"tag":76,"props":1237,"children":1238},{},[1239],{"type":60,"value":1240},"store",{"type":60,"value":513},{"type":54,"tag":84,"props":1243,"children":1245},{"className":1244},[],[1246],{"type":60,"value":1247},"itar",{"type":60,"value":1249}," archive or plain directory) holding\n",{"type":54,"tag":76,"props":1251,"children":1252},{},[1253],{"type":60,"value":1254},"component groups",{"type":60,"value":1256},". The required components for NuRec are:",{"type":54,"tag":461,"props":1258,"children":1259},{},[1260,1281],{"type":54,"tag":465,"props":1261,"children":1262},{},[1263],{"type":54,"tag":469,"props":1264,"children":1265},{},[1266,1271,1276],{"type":54,"tag":473,"props":1267,"children":1268},{},[1269],{"type":60,"value":1270},"Component",{"type":54,"tag":473,"props":1272,"children":1273},{},[1274],{"type":60,"value":1275},"What it carries",{"type":54,"tag":473,"props":1277,"children":1278},{},[1279],{"type":60,"value":1280},"API class",{"type":54,"tag":484,"props":1282,"children":1283},{},[1284,1332,1358,1392,1424,1458,1511,1552],{"type":54,"tag":469,"props":1285,"children":1286},{},[1287,1296,1323],{"type":54,"tag":491,"props":1288,"children":1289},{},[1290],{"type":54,"tag":84,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":60,"value":1295},"Poses",{"type":54,"tag":491,"props":1297,"children":1298},{},[1299,1301,1307,1309,1315,1317],{"type":60,"value":1300},"Dynamic ",{"type":54,"tag":84,"props":1302,"children":1304},{"className":1303},[],[1305],{"type":60,"value":1306},"T_rig_world",{"type":60,"value":1308}," (per timestamp); static ",{"type":54,"tag":84,"props":1310,"children":1312},{"className":1311},[],[1313],{"type":60,"value":1314},"T_sensor_rig",{"type":60,"value":1316}," per camera\u002Flidar\u002Fradar; static ",{"type":54,"tag":84,"props":1318,"children":1320},{"className":1319},[],[1321],{"type":60,"value":1322},"T_world_world_global",{"type":54,"tag":491,"props":1324,"children":1325},{},[1326],{"type":54,"tag":84,"props":1327,"children":1329},{"className":1328},[],[1330],{"type":60,"value":1331},"PosesComponent",{"type":54,"tag":469,"props":1333,"children":1334},{},[1335,1344,1349],{"type":54,"tag":491,"props":1336,"children":1337},{},[1338],{"type":54,"tag":84,"props":1339,"children":1341},{"className":1340},[],[1342],{"type":60,"value":1343},"Intrinsics",{"type":54,"tag":491,"props":1345,"children":1346},{},[1347],{"type":60,"value":1348},"Per-camera model (Pinhole \u002F Fisheye \u002F FTheta) + per-LiDAR spinning model",{"type":54,"tag":491,"props":1350,"children":1351},{},[1352],{"type":54,"tag":84,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":60,"value":1357},"IntrinsicsComponent",{"type":54,"tag":469,"props":1359,"children":1360},{},[1361,1370,1383],{"type":54,"tag":491,"props":1362,"children":1363},{},[1364],{"type":54,"tag":84,"props":1365,"children":1367},{"className":1366},[],[1368],{"type":60,"value":1369},"CameraSensor",{"type":54,"tag":491,"props":1371,"children":1372},{},[1373,1375,1381],{"type":60,"value":1374},"Encoded image bytes + per-frame ",{"type":54,"tag":84,"props":1376,"children":1378},{"className":1377},[],[1379],{"type":60,"value":1380},"[exposure_start, exposure_end]",{"type":60,"value":1382}," µs",{"type":54,"tag":491,"props":1384,"children":1385},{},[1386],{"type":54,"tag":84,"props":1387,"children":1389},{"className":1388},[],[1390],{"type":60,"value":1391},"CameraSensorComponent",{"type":54,"tag":469,"props":1393,"children":1394},{},[1395,1404,1415],{"type":54,"tag":491,"props":1396,"children":1397},{},[1398],{"type":54,"tag":84,"props":1399,"children":1401},{"className":1400},[],[1402],{"type":60,"value":1403},"LidarSensor",{"type":54,"tag":491,"props":1405,"children":1406},{},[1407,1409],{"type":60,"value":1408},"Per-ray unit direction + per-ray µs timestamp + distance(s) + intensity + ",{"type":54,"tag":84,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":60,"value":1414},"model_element=(row,col)",{"type":54,"tag":491,"props":1416,"children":1417},{},[1418],{"type":54,"tag":84,"props":1419,"children":1421},{"className":1420},[],[1422],{"type":60,"value":1423},"LidarSensorComponent",{"type":54,"tag":469,"props":1425,"children":1426},{},[1427,1444,1449],{"type":54,"tag":491,"props":1428,"children":1429},{},[1430,1436,1438],{"type":54,"tag":84,"props":1431,"children":1433},{"className":1432},[],[1434],{"type":60,"value":1435},"RadarSensor",{"type":60,"value":1437}," ",{"type":54,"tag":1439,"props":1440,"children":1441},"em",{},[1442],{"type":60,"value":1443},"(optional)",{"type":54,"tag":491,"props":1445,"children":1446},{},[1447],{"type":60,"value":1448},"Same shape as LiDAR minus intensity \u002F model_element",{"type":54,"tag":491,"props":1450,"children":1451},{},[1452],{"type":54,"tag":84,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":60,"value":1457},"RadarSensorComponent",{"type":54,"tag":469,"props":1459,"children":1460},{},[1461,1476,1502],{"type":54,"tag":491,"props":1462,"children":1463},{},[1464,1470,1471],{"type":54,"tag":84,"props":1465,"children":1467},{"className":1466},[],[1468],{"type":60,"value":1469},"Cuboids",{"type":60,"value":1437},{"type":54,"tag":1439,"props":1472,"children":1473},{},[1474],{"type":60,"value":1475},"(optional, recommended)",{"type":54,"tag":491,"props":1477,"children":1478},{},[1479,1485,1487,1493,1494,1500],{"type":54,"tag":84,"props":1480,"children":1482},{"className":1481},[],[1483],{"type":60,"value":1484},"CuboidTrackObservation",{"type":60,"value":1486}," list referencing ",{"type":54,"tag":84,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":60,"value":1492},"rig",{"type":60,"value":521},{"type":54,"tag":84,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":60,"value":1499},"world",{"type":60,"value":1501}," \u002F sensor frames",{"type":54,"tag":491,"props":1503,"children":1504},{},[1505],{"type":54,"tag":84,"props":1506,"children":1508},{"className":1507},[],[1509],{"type":60,"value":1510},"CuboidsComponent",{"type":54,"tag":469,"props":1512,"children":1513},{},[1514,1523,1543],{"type":54,"tag":491,"props":1515,"children":1516},{},[1517],{"type":54,"tag":84,"props":1518,"children":1520},{"className":1519},[],[1521],{"type":60,"value":1522},"Masks",{"type":54,"tag":491,"props":1524,"children":1525},{},[1526,1528,1534,1536,1541],{"type":60,"value":1527},"Per-camera dict of ",{"type":54,"tag":84,"props":1529,"children":1531},{"className":1530},[],[1532],{"type":60,"value":1533},"{name: PIL.Image}",{"type":60,"value":1535}," (NuRec ",{"type":54,"tag":76,"props":1537,"children":1538},{},[1539],{"type":60,"value":1540},"requires",{"type":60,"value":1542}," ego masks)",{"type":54,"tag":491,"props":1544,"children":1545},{},[1546],{"type":54,"tag":84,"props":1547,"children":1549},{"className":1548},[],[1550],{"type":60,"value":1551},"MasksComponent",{"type":54,"tag":469,"props":1553,"children":1554},{},[1555,1569,1582],{"type":54,"tag":491,"props":1556,"children":1557},{},[1558,1564,1565],{"type":54,"tag":84,"props":1559,"children":1561},{"className":1560},[],[1562],{"type":60,"value":1563},"PointClouds",{"type":60,"value":1437},{"type":54,"tag":1439,"props":1566,"children":1567},{},[1568],{"type":60,"value":1443},{"type":54,"tag":491,"props":1570,"children":1571},{},[1572,1574,1580],{"type":60,"value":1573},"Pre-computed dense or SfM points (e.g. COLMAP ",{"type":54,"tag":84,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":60,"value":1579},"sfm_points",{"type":60,"value":1581},", depth-derived)",{"type":54,"tag":491,"props":1583,"children":1584},{},[1585],{"type":54,"tag":84,"props":1586,"children":1588},{"className":1587},[],[1589],{"type":60,"value":1590},"PointCloudsComponent",{"type":54,"tag":70,"props":1592,"children":1593},{},[1594],{"type":60,"value":1595},"Frames of reference (these are non-negotiable — wrong frames = silent NuRec failure):",{"type":54,"tag":127,"props":1597,"children":1598},{},[1599,1640,1677,1716,1747,1785],{"type":54,"tag":131,"props":1600,"children":1601},{},[1602,1607,1609,1615,1617,1623,1625,1631,1633,1639],{"type":54,"tag":76,"props":1603,"children":1604},{},[1605],{"type":60,"value":1606},"Rig",{"type":60,"value":1608},": ",{"type":54,"tag":84,"props":1610,"children":1612},{"className":1611},[],[1613],{"type":60,"value":1614},"+X",{"type":60,"value":1616}," forward, ",{"type":54,"tag":84,"props":1618,"children":1620},{"className":1619},[],[1621],{"type":60,"value":1622},"+Y",{"type":60,"value":1624}," left, ",{"type":54,"tag":84,"props":1626,"children":1628},{"className":1627},[],[1629],{"type":60,"value":1630},"+Z",{"type":60,"value":1632}," up. Origin at the middle of the rear axle on nominal ground for AV, or any natural body-fixed point for non-AV. All extrinsics are ",{"type":54,"tag":84,"props":1634,"children":1636},{"className":1635},[],[1637],{"type":60,"value":1638},"T_sensor → rig",{"type":60,"value":99},{"type":54,"tag":131,"props":1641,"children":1642},{},[1643,1648,1649,1654,1656,1661,1663,1668,1670,1675],{"type":54,"tag":76,"props":1644,"children":1645},{},[1646],{"type":60,"value":1647},"Camera sensor",{"type":60,"value":1608},{"type":54,"tag":84,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":60,"value":1614},{"type":60,"value":1655}," right, ",{"type":54,"tag":84,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":60,"value":1622},{"type":60,"value":1662}," down, ",{"type":54,"tag":84,"props":1664,"children":1666},{"className":1665},[],[1667],{"type":60,"value":1630},{"type":60,"value":1669}," forward (optical axis). NCore's convention. Waymo (X-fwd) and similar must be ",{"type":54,"tag":76,"props":1671,"children":1672},{},[1673],{"type":60,"value":1674},"rotated",{"type":60,"value":1676}," before storing extrinsics.",{"type":54,"tag":131,"props":1678,"children":1679},{},[1680,1685,1687,1692,1694,1699,1701,1706,1708,1714],{"type":54,"tag":76,"props":1681,"children":1682},{},[1683],{"type":60,"value":1684},"LiDAR model frame",{"type":60,"value":1686},": azimuth 0° = ",{"type":54,"tag":84,"props":1688,"children":1690},{"className":1689},[],[1691],{"type":60,"value":1614},{"type":60,"value":1693},", 90° = ",{"type":54,"tag":84,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":60,"value":1622},{"type":60,"value":1700},", ",{"type":54,"tag":84,"props":1702,"children":1704},{"className":1703},[],[1705],{"type":60,"value":1630},{"type":60,"value":1707}," up. Independent of the raw sensor's native azimuth — you choose how ",{"type":54,"tag":84,"props":1709,"children":1711},{"className":1710},[],[1712],{"type":60,"value":1713},"column_azimuths_rad",{"type":60,"value":1715}," maps physical columns.",{"type":54,"tag":131,"props":1717,"children":1718},{},[1719,1724,1726,1731,1733,1738,1740,1745],{"type":54,"tag":76,"props":1720,"children":1721},{},[1722],{"type":60,"value":1723},"World",{"type":60,"value":1725},": sequence-local. Re-reference all ",{"type":54,"tag":84,"props":1727,"children":1729},{"className":1728},[],[1730],{"type":60,"value":1306},{"type":60,"value":1732}," to the ",{"type":54,"tag":76,"props":1734,"children":1735},{},[1736],{"type":60,"value":1737},"first",{"type":60,"value":1739}," ego pose so origin is near the vehicle start (raw UTM\u002FECEF at 10+ km loses precision in float32). Carry the original first pose into ",{"type":54,"tag":84,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":60,"value":1322},{"type":60,"value":1746}," (float64) if you need a global anchor.",{"type":54,"tag":131,"props":1748,"children":1749},{},[1750,1755,1756,1762,1763,1769,1771,1776,1778,1784],{"type":54,"tag":76,"props":1751,"children":1752},{},[1753],{"type":60,"value":1754},"Image pixels",{"type":60,"value":1608},{"type":54,"tag":84,"props":1757,"children":1759},{"className":1758},[],[1760],{"type":60,"value":1761},"u",{"type":60,"value":1655},{"type":54,"tag":84,"props":1764,"children":1766},{"className":1765},[],[1767],{"type":60,"value":1768},"v",{"type":60,"value":1770}," down, origin at the top-left ",{"type":54,"tag":76,"props":1772,"children":1773},{},[1774],{"type":60,"value":1775},"corner",{"type":60,"value":1777}," of the top-left pixel (so pixel centers are at ",{"type":54,"tag":84,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":60,"value":1783},"0.5, 0.5",{"type":60,"value":163},{"type":54,"tag":131,"props":1786,"children":1787},{},[1788,1793],{"type":54,"tag":76,"props":1789,"children":1790},{},[1791],{"type":60,"value":1792},"Units",{"type":60,"value":1794},": timestamps in µs everywhere, distances in metres, angles in radians.",{"type":54,"tag":70,"props":1796,"children":1797},{},[1798,1800,1805],{"type":60,"value":1799},"The single source of truth is the spec — when in doubt, open it:\n",{"type":54,"tag":223,"props":1801,"children":1803},{"href":48,"rel":1802},[1051],[1804],{"type":60,"value":48},{"type":60,"value":99},{"type":54,"tag":783,"props":1807,"children":1809},{"id":1808},"sequence-level-metadata",[1810],{"type":60,"value":1811},"Sequence-level metadata",{"type":54,"tag":70,"props":1813,"children":1814},{},[1815,1817,1823,1825,1831],{"type":60,"value":1816},"Some downstream pipelines need metadata beyond the per-component data — carry\nit on the sequence's ",{"type":54,"tag":84,"props":1818,"children":1820},{"className":1819},[],[1821],{"type":60,"value":1822},"generic_meta_data",{"type":60,"value":1824}," (passed to\n",{"type":54,"tag":84,"props":1826,"children":1828},{"className":1827},[],[1829],{"type":60,"value":1830},"SequenceComponentGroupsWriter(...)",{"type":60,"value":1832},"):",{"type":54,"tag":127,"props":1834,"children":1835},{},[1836,1962,1988],{"type":54,"tag":131,"props":1837,"children":1838},{},[1839,1844,1846,1956,1960],{"type":54,"tag":76,"props":1840,"children":1841},{},[1842],{"type":60,"value":1843},"Stereo pairs",{"type":60,"value":1845}," — required by stereo-depth modules (Foundation Stereo) and\nmulti-camera training configs to discover left\u002Fright pairings:",{"type":54,"tag":814,"props":1847,"children":1851},{"className":1848,"code":1849,"language":1850,"meta":819,"style":819},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\"stereo_pairs\": [{\"left\": \"camera_front_left\", \"right\": \"camera_front_right\"}]}\n","json",[1852],{"type":54,"tag":84,"props":1853,"children":1854},{"__ignoreMap":819},[1855],{"type":54,"tag":825,"props":1856,"children":1857},{"class":827,"line":828},[1858,1863,1867,1873,1877,1881,1886,1890,1895,1899,1903,1907,1912,1916,1921,1925,1930,1934,1938,1942,1947,1951],{"type":54,"tag":825,"props":1859,"children":1860},{"style":848},[1861],{"type":60,"value":1862},"{",{"type":54,"tag":825,"props":1864,"children":1865},{"style":848},[1866],{"type":60,"value":976},{"type":54,"tag":825,"props":1868,"children":1870},{"style":1869},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1871],{"type":60,"value":1872},"stereo_pairs",{"type":54,"tag":825,"props":1874,"children":1875},{"style":848},[1876],{"type":60,"value":976},{"type":54,"tag":825,"props":1878,"children":1879},{"style":848},[1880],{"type":60,"value":872},{"type":54,"tag":825,"props":1882,"children":1883},{"style":848},[1884],{"type":60,"value":1885}," [{",{"type":54,"tag":825,"props":1887,"children":1888},{"style":848},[1889],{"type":60,"value":976},{"type":54,"tag":825,"props":1891,"children":1892},{"style":1072},[1893],{"type":60,"value":1894},"left",{"type":54,"tag":825,"props":1896,"children":1897},{"style":848},[1898],{"type":60,"value":976},{"type":54,"tag":825,"props":1900,"children":1901},{"style":848},[1902],{"type":60,"value":872},{"type":54,"tag":825,"props":1904,"children":1905},{"style":848},[1906],{"type":60,"value":851},{"type":54,"tag":825,"props":1908,"children":1909},{"style":854},[1910],{"type":60,"value":1911},"camera_front_left",{"type":54,"tag":825,"props":1913,"children":1914},{"style":848},[1915],{"type":60,"value":976},{"type":54,"tag":825,"props":1917,"children":1918},{"style":848},[1919],{"type":60,"value":1920},",",{"type":54,"tag":825,"props":1922,"children":1923},{"style":848},[1924],{"type":60,"value":851},{"type":54,"tag":825,"props":1926,"children":1927},{"style":1072},[1928],{"type":60,"value":1929},"right",{"type":54,"tag":825,"props":1931,"children":1932},{"style":848},[1933],{"type":60,"value":976},{"type":54,"tag":825,"props":1935,"children":1936},{"style":848},[1937],{"type":60,"value":872},{"type":54,"tag":825,"props":1939,"children":1940},{"style":848},[1941],{"type":60,"value":851},{"type":54,"tag":825,"props":1943,"children":1944},{"style":854},[1945],{"type":60,"value":1946},"camera_front_right",{"type":54,"tag":825,"props":1948,"children":1949},{"style":848},[1950],{"type":60,"value":976},{"type":54,"tag":825,"props":1952,"children":1953},{"style":848},[1954],{"type":60,"value":1955},"}]}\n",{"type":54,"tag":1957,"props":1958,"children":1959},"br",{},[],{"type":60,"value":1961},"Multiple pairs are allowed for surround-stereo rigs.",{"type":54,"tag":131,"props":1963,"children":1964},{},[1965,1970,1972,1978,1980,1986],{"type":54,"tag":76,"props":1966,"children":1967},{},[1968],{"type":60,"value":1969},"Source tag",{"type":60,"value":1971}," — distinguishes real from synthetic data. Renderer-output\nshards (NuRec sim) set ",{"type":54,"tag":84,"props":1973,"children":1975},{"className":1974},[],[1976],{"type":60,"value":1977},"{\"source\": \"simulation\", \"model_checkpoint\": \"...\"}",{"type":60,"value":1979},";\nreal-sensor shards omit the key or set ",{"type":54,"tag":84,"props":1981,"children":1983},{"className":1982},[],[1984],{"type":60,"value":1985},"{\"source\": \"real\"}",{"type":60,"value":1987},". Downstream\nvalidators key off this to skip \"expected vs measured\" checks on sim data.",{"type":54,"tag":131,"props":1989,"children":1990},{},[1991,1996,1998,2004,2006,2012,2014,2019,2021,2026,2028,2034,2036,2042,2043,2049],{"type":54,"tag":76,"props":1992,"children":1993},{},[1994],{"type":60,"value":1995},"Calibration \u002F egomotion provenance",{"type":60,"value":1997}," — the example template writes\n",{"type":54,"tag":84,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":60,"value":2003},"calibration_type",{"type":60,"value":2005}," and ",{"type":54,"tag":84,"props":2007,"children":2009},{"className":2008},[],[2010],{"type":60,"value":2011},"egomotion_type",{"type":60,"value":2013}," on the ",{"type":54,"tag":84,"props":2015,"children":2017},{"className":2016},[],[2018],{"type":60,"value":1331},{"type":60,"value":2020},"'s\n",{"type":54,"tag":84,"props":2022,"children":2024},{"className":2023},[],[2025],{"type":60,"value":1822},{"type":60,"value":2027},". Use this to track the upstream tool (e.g.\n",{"type":54,"tag":84,"props":2029,"children":2031},{"className":2030},[],[2032],{"type":60,"value":2033},"egomotion_type: \"cuvslam-stereo\"",{"type":60,"value":2035}," or ",{"type":54,"tag":84,"props":2037,"children":2039},{"className":2038},[],[2040],{"type":60,"value":2041},"\"kiss-icp\"",{"type":60,"value":2035},{"type":54,"tag":84,"props":2044,"children":2046},{"className":2045},[],[2047],{"type":60,"value":2048},"\"vio:orbslam3\"",{"type":60,"value":2050},") so\nlater modules can pick refinement strategies that match the input quality.",{"type":54,"tag":452,"props":2052,"children":2053},{},[],{"type":54,"tag":63,"props":2055,"children":2057},{"id":2056},"instructions",[2058],{"type":60,"value":2059},"Instructions",{"type":54,"tag":70,"props":2061,"children":2062},{},[2063],{"type":60,"value":2064},"Pick one of the two paths below.",{"type":54,"tag":127,"props":2066,"children":2067},{},[2068,2085],{"type":54,"tag":131,"props":2069,"children":2070},{},[2071,2075,2077,2083],{"type":54,"tag":76,"props":2072,"children":2073},{},[2074],{"type":60,"value":503},{"type":60,"value":2076}," if the user's dataset format is already supported in\n",{"type":54,"tag":84,"props":2078,"children":2080},{"className":2079},[],[2081],{"type":60,"value":2082},"ncore\u002Ftools\u002Fdata_converter\u002F",{"type":60,"value":2084}," (PAI, Waymo, COLMAP\u002FScanNet++) —\nbootstrap the upstream repo and drive the existing binary.",{"type":54,"tag":131,"props":2086,"children":2087},{},[2088,2092,2094,2099,2101,2106],{"type":54,"tag":76,"props":2089,"children":2090},{},[2091],{"type":60,"value":643},{"type":60,"value":2093}," if the format is unsupported (PandaSet, NuScenes, KITTI,\ncustom rig, robotics bag, …) — copy ",{"type":54,"tag":84,"props":2095,"children":2097},{"className":2096},[],[2098],{"type":60,"value":97},{"type":60,"value":2100}," next to the\ndataset and fill in the four hand-written hooks. The V4 conventions\nin the ",{"type":54,"tag":76,"props":2102,"children":2103},{},[2104],{"type":60,"value":2105},"Mental model",{"type":60,"value":2107}," section above are mandatory; the recipes\nfurther down show typical configurations per rig.",{"type":54,"tag":70,"props":2109,"children":2110},{},[2111,2113,2117],{"type":60,"value":2112},"After conversion, always run the ",{"type":54,"tag":76,"props":2114,"children":2115},{},[2116],{"type":60,"value":432},{"type":60,"value":2118},"\nsection below before handing the store to NRE.",{"type":54,"tag":63,"props":2120,"children":2122},{"id":2121},"path-a-drive-an-existing-in-tree-converter",[2123],{"type":60,"value":255},{"type":54,"tag":70,"props":2125,"children":2126},{},[2127,2129,2135],{"type":60,"value":2128},"The upstream ",{"type":54,"tag":84,"props":2130,"children":2132},{"className":2131},[],[2133],{"type":60,"value":2134},"tools\u002Fdata_converter\u002F\u003Cformat>",{"type":60,"value":2136}," modules are Bazel targets. Build\nonce, run per dataset.",{"type":54,"tag":783,"props":2138,"children":2140},{"id":2139},"bootstrap",[2141],{"type":60,"value":2142},"Bootstrap",{"type":54,"tag":814,"props":2144,"children":2146},{"className":816,"code":2145,"language":818,"meta":819,"style":819},"git clone --depth 1 https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore.git\ncd ncore\nbazel build \u002F\u002Ftools\u002Fdata_converter\u002Fpai:convert     # or waymo, or colmap\n",[2147],{"type":54,"tag":84,"props":2148,"children":2149},{"__ignoreMap":819},[2150,2174,2187],{"type":54,"tag":825,"props":2151,"children":2152},{"class":827,"line":828},[2153,2157,2161,2165,2169],{"type":54,"tag":825,"props":2154,"children":2155},{"style":1072},[2156],{"type":60,"value":736},{"type":54,"tag":825,"props":2158,"children":2159},{"style":854},[2160],{"type":60,"value":1101},{"type":54,"tag":825,"props":2162,"children":2163},{"style":854},[2164],{"type":60,"value":1106},{"type":54,"tag":825,"props":2166,"children":2167},{"style":1109},[2168],{"type":60,"value":1112},{"type":54,"tag":825,"props":2170,"children":2171},{"style":854},[2172],{"type":60,"value":2173}," https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore.git\n",{"type":54,"tag":825,"props":2175,"children":2176},{"class":827,"line":838},[2177,2182],{"type":54,"tag":825,"props":2178,"children":2179},{"style":842},[2180],{"type":60,"value":2181},"cd",{"type":54,"tag":825,"props":2183,"children":2184},{"style":854},[2185],{"type":60,"value":2186}," ncore\n",{"type":54,"tag":825,"props":2188,"children":2190},{"class":827,"line":2189},3,[2191,2195,2200,2205],{"type":54,"tag":825,"props":2192,"children":2193},{"style":1072},[2194],{"type":60,"value":747},{"type":54,"tag":825,"props":2196,"children":2197},{"style":854},[2198],{"type":60,"value":2199}," build",{"type":54,"tag":825,"props":2201,"children":2202},{"style":854},[2203],{"type":60,"value":2204}," \u002F\u002Ftools\u002Fdata_converter\u002Fpai:convert",{"type":54,"tag":825,"props":2206,"children":2207},{"style":832},[2208],{"type":60,"value":2209},"     # or waymo, or colmap\n",{"type":54,"tag":70,"props":2211,"children":2212},{},[2213,2215,2221,2223,2228,2230,2236,2237,2243,2245,2251,2252,2258,2259,2265,2266,2272,2273,2279,2281,2286,2287,2292,2293,2298,2299,2304,2305,2310,2311,2316],{"type":60,"value":2214},"Each ",{"type":54,"tag":84,"props":2216,"children":2218},{"className":2217},[],[2219],{"type":60,"value":2220},"convert",{"type":60,"value":2222}," binary takes shared ",{"type":54,"tag":76,"props":2224,"children":2225},{},[2226],{"type":60,"value":2227},"base",{"type":60,"value":2229}," flags (",{"type":54,"tag":84,"props":2231,"children":2233},{"className":2232},[],[2234],{"type":60,"value":2235},"--root-dir",{"type":60,"value":1700},{"type":54,"tag":84,"props":2238,"children":2240},{"className":2239},[],[2241],{"type":60,"value":2242},"--output-dir",{"type":60,"value":2244},",\n",{"type":54,"tag":84,"props":2246,"children":2248},{"className":2247},[],[2249],{"type":60,"value":2250},"--no-cameras",{"type":60,"value":1700},{"type":54,"tag":84,"props":2253,"children":2255},{"className":2254},[],[2256],{"type":60,"value":2257},"--camera-id",{"type":60,"value":1700},{"type":54,"tag":84,"props":2260,"children":2262},{"className":2261},[],[2263],{"type":60,"value":2264},"--no-lidars",{"type":60,"value":1700},{"type":54,"tag":84,"props":2267,"children":2269},{"className":2268},[],[2270],{"type":60,"value":2271},"--lidar-id",{"type":60,"value":1700},{"type":54,"tag":84,"props":2274,"children":2276},{"className":2275},[],[2277],{"type":60,"value":2278},"--verbose",{"type":60,"value":2280},") followed\nby a ",{"type":54,"tag":76,"props":2282,"children":2283},{},[2284],{"type":60,"value":2285},"subcommand",{"type":60,"value":513},{"type":54,"tag":84,"props":2288,"children":2290},{"className":2289},[],[2291],{"type":60,"value":527},{"type":60,"value":1700},{"type":54,"tag":84,"props":2294,"children":2296},{"className":2295},[],[2297],{"type":60,"value":519},{"type":60,"value":1700},{"type":54,"tag":84,"props":2300,"children":2302},{"className":2301},[],[2303],{"type":60,"value":566},{"type":60,"value":1700},{"type":54,"tag":84,"props":2306,"children":2308},{"className":2307},[],[2309],{"type":60,"value":596},{"type":60,"value":2244},{"type":54,"tag":84,"props":2312,"children":2314},{"className":2313},[],[2315],{"type":60,"value":603},{"type":60,"value":2317},") with format-specific flags.",{"type":54,"tag":783,"props":2319,"children":2321},{"id":2320},"standard-sub-flags-worth-knowing",[2322],{"type":60,"value":2323},"Standard sub-flags worth knowing",{"type":54,"tag":461,"props":2325,"children":2326},{},[2327,2348],{"type":54,"tag":465,"props":2328,"children":2329},{},[2330],{"type":54,"tag":469,"props":2331,"children":2332},{},[2333,2338,2343],{"type":54,"tag":473,"props":2334,"children":2335},{},[2336],{"type":60,"value":2337},"Flag",{"type":54,"tag":473,"props":2339,"children":2340},{},[2341],{"type":60,"value":2342},"Default",{"type":54,"tag":473,"props":2344,"children":2345},{},[2346],{"type":60,"value":2347},"Meaning",{"type":54,"tag":484,"props":2349,"children":2350},{},[2351,2389,2417,2461],{"type":54,"tag":469,"props":2352,"children":2353},{},[2354,2363,2371],{"type":54,"tag":491,"props":2355,"children":2356},{},[2357],{"type":54,"tag":84,"props":2358,"children":2360},{"className":2359},[],[2361],{"type":60,"value":2362},"--store-type {itar,directory}",{"type":54,"tag":491,"props":2364,"children":2365},{},[2366],{"type":54,"tag":84,"props":2367,"children":2369},{"className":2368},[],[2370],{"type":60,"value":1247},{"type":54,"tag":491,"props":2372,"children":2373},{},[2374,2379,2381,2387],{"type":54,"tag":84,"props":2375,"children":2377},{"className":2376},[],[2378],{"type":60,"value":1247},{"type":60,"value":2380}," is fastest for NuRec; ",{"type":54,"tag":84,"props":2382,"children":2384},{"className":2383},[],[2385],{"type":60,"value":2386},"directory",{"type":60,"value":2388}," is debuggable",{"type":54,"tag":469,"props":2390,"children":2391},{},[2392,2401,2406],{"type":54,"tag":491,"props":2393,"children":2394},{},[2395],{"type":54,"tag":84,"props":2396,"children":2398},{"className":2397},[],[2399],{"type":60,"value":2400},"--profile {default,separate-sensors,separate-all}",{"type":54,"tag":491,"props":2402,"children":2403},{},[2404],{"type":60,"value":2405},"varies",{"type":54,"tag":491,"props":2407,"children":2408},{},[2409,2411],{"type":60,"value":2410},"NuRec wants ",{"type":54,"tag":84,"props":2412,"children":2414},{"className":2413},[],[2415],{"type":60,"value":2416},"separate-sensors",{"type":54,"tag":469,"props":2418,"children":2419},{},[2420,2436,2441],{"type":54,"tag":491,"props":2421,"children":2422},{},[2423,2429,2430],{"type":54,"tag":84,"props":2424,"children":2426},{"className":2425},[],[2427],{"type":60,"value":2428},"--sequence-meta",{"type":60,"value":521},{"type":54,"tag":84,"props":2431,"children":2433},{"className":2432},[],[2434],{"type":60,"value":2435},"--no-sequence-meta",{"type":54,"tag":491,"props":2437,"children":2438},{},[2439],{"type":60,"value":2440},"enabled",{"type":54,"tag":491,"props":2442,"children":2443},{},[2444,2446,2452,2454,2459],{"type":60,"value":2445},"Writes ",{"type":54,"tag":84,"props":2447,"children":2449},{"className":2448},[],[2450],{"type":60,"value":2451},"\u003Csequence>.json",{"type":60,"value":2453}," next to the store — NuRec\u002F",{"type":54,"tag":84,"props":2455,"children":2457},{"className":2456},[],[2458],{"type":60,"value":89},{"type":60,"value":2460}," need it",{"type":54,"tag":469,"props":2462,"children":2463},{},[2464,2473,2477],{"type":54,"tag":491,"props":2465,"children":2466},{},[2467],{"type":54,"tag":84,"props":2468,"children":2470},{"className":2469},[],[2471],{"type":60,"value":2472},"--world-global-mode {none,identity,localized}",{"type":54,"tag":491,"props":2474,"children":2475},{},[2476],{"type":60,"value":2405},{"type":54,"tag":491,"props":2478,"children":2479},{},[2480,2482,2488,2490,2496,2498,2504],{"type":60,"value":2481},"For NuRec releases that require the ",{"type":54,"tag":84,"props":2483,"children":2485},{"className":2484},[],[2486],{"type":60,"value":2487},"world→world_global",{"type":60,"value":2489}," edge, use ",{"type":54,"tag":84,"props":2491,"children":2493},{"className":2492},[],[2494],{"type":60,"value":2495},"identity",{"type":60,"value":2497}," (or ",{"type":54,"tag":84,"props":2499,"children":2501},{"className":2500},[],[2502],{"type":60,"value":2503},"localized",{"type":60,"value":2505}," to keep a real global anchor)",{"type":54,"tag":783,"props":2507,"children":2509},{"id":2508},"when-to-script-vs-run-interactively",[2510],{"type":60,"value":2511},"When to script vs run interactively",{"type":54,"tag":70,"props":2513,"children":2514},{},[2515,2517,2522,2524,2530,2532,2538,2540,2545,2547,2555,2557,2562,2564,2574],{"type":60,"value":2516},"For a ",{"type":54,"tag":76,"props":2518,"children":2519},{},[2520],{"type":60,"value":2521},"one-off conversion",{"type":60,"value":2523},", the bare ",{"type":54,"tag":84,"props":2525,"children":2527},{"className":2526},[],[2528],{"type":60,"value":2529},"bazel run",{"type":60,"value":2531}," form in each format recipe\nbelow is enough. For repeatable cluster runs, wrap the same two steps\n(",{"type":54,"tag":84,"props":2533,"children":2535},{"className":2534},[],[2536],{"type":60,"value":2537},"bazel build",{"type":60,"value":2539}," then ",{"type":54,"tag":84,"props":2541,"children":2543},{"className":2542},[],[2544],{"type":60,"value":2529},{"type":60,"value":2546},") inside an OSMO \u002F Slurm \u002F Kubernetes task that\nclones NCore at a pinned ref, runs the convert step, and chains the result\ninto the ",{"type":54,"tag":223,"props":2548,"children":2549},{"href":1199},[2550],{"type":54,"tag":84,"props":2551,"children":2553},{"className":2552},[],[2554],{"type":60,"value":148},{"type":60,"value":2556}," training and aux-data containers (see\n",{"type":54,"tag":84,"props":2558,"children":2560},{"className":2559},[],[2561],{"type":60,"value":148},{"type":60,"value":2563},"'s Workflow A). The upstream\n",{"type":54,"tag":223,"props":2565,"children":2567},{"href":47,"rel":2566},[1051],[2568],{"type":54,"tag":84,"props":2569,"children":2571},{"className":2570},[],[2572],{"type":60,"value":2573},"NVIDIA\u002Fncore",{"type":60,"value":2575}," repo ships reference\nconverter targets that you can pin by Git commit for reproducibility.",{"type":54,"tag":452,"props":2577,"children":2578},{},[],{"type":54,"tag":63,"props":2580,"children":2582},{"id":2581},"path-b-author-a-new-converter-from-the-template",[2583],{"type":60,"value":264},{"type":54,"tag":70,"props":2585,"children":2586},{},[2587,2589,2594,2596,2602],{"type":60,"value":2588},"The scaffold is intentionally minimal but writes ",{"type":54,"tag":76,"props":2590,"children":2591},{},[2592],{"type":60,"value":2593},"every",{"type":60,"value":2595}," required component\ntype with placeholder data. Treat it as a checklist: every ",{"type":54,"tag":84,"props":2597,"children":2599},{"className":2598},[],[2600],{"type":60,"value":2601},"# FILL IN",{"type":60,"value":2603}," is a\ncorrectness gate — none can be skipped.",{"type":54,"tag":783,"props":2605,"children":2607},{"id":2606},"scaffold",[2608],{"type":60,"value":2609},"Scaffold",{"type":54,"tag":814,"props":2611,"children":2613},{"className":816,"code":2612,"language":818,"meta":819,"style":819},"# Copy the scaffold next to your dataset (run from this skill's folder)\ncp -r ncore_template \u002Fpath\u002Fto\u002Fncore-myformat\n",[2614],{"type":54,"tag":84,"props":2615,"children":2616},{"__ignoreMap":819},[2617,2625],{"type":54,"tag":825,"props":2618,"children":2619},{"class":827,"line":828},[2620],{"type":54,"tag":825,"props":2621,"children":2622},{"style":832},[2623],{"type":60,"value":2624},"# Copy the scaffold next to your dataset (run from this skill's folder)\n",{"type":54,"tag":825,"props":2626,"children":2627},{"class":827,"line":838},[2628,2633,2638,2643],{"type":54,"tag":825,"props":2629,"children":2630},{"style":1072},[2631],{"type":60,"value":2632},"cp",{"type":54,"tag":825,"props":2634,"children":2635},{"style":854},[2636],{"type":60,"value":2637}," -r",{"type":54,"tag":825,"props":2639,"children":2640},{"style":854},[2641],{"type":60,"value":2642}," ncore_template",{"type":54,"tag":825,"props":2644,"children":2645},{"style":854},[2646],{"type":60,"value":2647}," \u002Fpath\u002Fto\u002Fncore-myformat\n",{"type":54,"tag":70,"props":2649,"children":2650},{},[2651,2653,2659,2661,2667],{"type":60,"value":2652},"Then rename the package and class (",{"type":54,"tag":84,"props":2654,"children":2656},{"className":2655},[],[2657],{"type":60,"value":2658},"ExampleConverter",{"type":60,"value":2660}," → ",{"type":54,"tag":84,"props":2662,"children":2664},{"className":2663},[],[2665],{"type":60,"value":2666},"MyFormatConverter",{"type":60,"value":2668},") and\nimplement the contract:",{"type":54,"tag":461,"props":2670,"children":2671},{},[2672,2688],{"type":54,"tag":465,"props":2673,"children":2674},{},[2675],{"type":54,"tag":469,"props":2676,"children":2677},{},[2678,2683],{"type":54,"tag":473,"props":2679,"children":2680},{},[2681],{"type":60,"value":2682},"Method",{"type":54,"tag":473,"props":2684,"children":2685},{},[2686],{"type":60,"value":2687},"Contract",{"type":54,"tag":484,"props":2689,"children":2690},{},[2691,2716,2733],{"type":54,"tag":469,"props":2692,"children":2693},{},[2694,2703],{"type":54,"tag":491,"props":2695,"children":2696},{},[2697],{"type":54,"tag":84,"props":2698,"children":2700},{"className":2699},[],[2701],{"type":60,"value":2702},"get_sequence_ids(config) -> list[str]",{"type":54,"tag":491,"props":2704,"children":2705},{},[2706,2708,2714],{"type":60,"value":2707},"Discover sequence IDs from ",{"type":54,"tag":84,"props":2709,"children":2711},{"className":2710},[],[2712],{"type":60,"value":2713},"config.root_dir",{"type":60,"value":2715}," (or wherever your dataset lives — manifest CSV, HF clip index, ROS bag glob)",{"type":54,"tag":469,"props":2717,"children":2718},{},[2719,2728],{"type":54,"tag":491,"props":2720,"children":2721},{},[2722],{"type":54,"tag":84,"props":2723,"children":2725},{"className":2724},[],[2726],{"type":60,"value":2727},"from_config(config) -> Converter",{"type":54,"tag":491,"props":2729,"children":2730},{},[2731],{"type":60,"value":2732},"One-time setup (load calibration, open dataset index, init shared interpolators). Heavy lifting that all sequences share goes here",{"type":54,"tag":469,"props":2734,"children":2735},{},[2736,2745],{"type":54,"tag":491,"props":2737,"children":2738},{},[2739],{"type":54,"tag":84,"props":2740,"children":2742},{"className":2741},[],[2743],{"type":60,"value":2744},"convert_sequence(sequence_id) -> None",{"type":54,"tag":491,"props":2746,"children":2747},{},[2748,2750,2756,2758,2764,2766],{"type":60,"value":2749},"Per-sequence work: open ",{"type":54,"tag":84,"props":2751,"children":2753},{"className":2752},[],[2754],{"type":60,"value":2755},"SequenceComponentGroupsWriter",{"type":60,"value":2757},", register component writers, write data, ",{"type":54,"tag":84,"props":2759,"children":2761},{"className":2760},[],[2762],{"type":60,"value":2763},"finalize()",{"type":60,"value":2765},", write ",{"type":54,"tag":84,"props":2767,"children":2769},{"className":2768},[],[2770],{"type":60,"value":2771},"\u003Csequence_id>.json",{"type":54,"tag":70,"props":2773,"children":2774},{},[2775,2777,2783,2785,2790,2792,2797],{"type":60,"value":2776},"Inside ",{"type":54,"tag":84,"props":2778,"children":2780},{"className":2779},[],[2781],{"type":60,"value":2782},"convert_sequence",{"type":60,"value":2784}," the canonical order is ",{"type":54,"tag":76,"props":2786,"children":2787},{},[2788],{"type":60,"value":2789},"Poses → Intrinsics → Masks →\nCamera → LiDAR → Radar → Cuboids → finalize",{"type":60,"value":2791},". This order is not required by the\nwriter but it surfaces calibration \u002F pose \u002F timing bugs ",{"type":54,"tag":76,"props":2793,"children":2794},{},[2795],{"type":60,"value":2796},"before",{"type":60,"value":2798}," you've spent\nminutes encoding image bytes.",{"type":54,"tag":70,"props":2800,"children":2801},{},[2802],{"type":60,"value":2803},"The skeleton walks each step explicitly and lists every silent-correctness\ntrap inline — read these before filling them in:",{"type":54,"tag":127,"props":2805,"children":2806},{},[2807,2852,2867,2882,2897],{"type":54,"tag":131,"props":2808,"children":2809},{},[2810,2812,2818,2820,2826,2827,2832,2834,2840,2842],{"type":60,"value":2811},"Spinning-LiDAR pitfalls (",{"type":54,"tag":84,"props":2813,"children":2815},{"className":2814},[],[2816],{"type":60,"value":2817},"spinning_direction",{"type":60,"value":2819},", non-uniform ",{"type":54,"tag":84,"props":2821,"children":2823},{"className":2822},[],[2824],{"type":60,"value":2825},"row_elevations_rad",{"type":60,"value":2244},{"type":54,"tag":84,"props":2828,"children":2830},{"className":2829},[],[2831],{"type":60,"value":1713},{"type":60,"value":2833}," ordering, Ouster ",{"type":54,"tag":84,"props":2835,"children":2837},{"className":2836},[],[2838],{"type":60,"value":2839},"row_azimuth_offsets_rad",{"type":60,"value":2841},"):\n",{"type":54,"tag":223,"props":2843,"children":2845},{"href":2844},"ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py#L61-L120",[2846],{"type":54,"tag":84,"props":2847,"children":2849},{"className":2848},[],[2850],{"type":60,"value":2851},"example_converter.py:61-120",{"type":54,"tag":131,"props":2853,"children":2854},{},[2855,2857],{"type":60,"value":2856},"Pose trajectory density + float64 → float32 + re-referencing rules:\n",{"type":54,"tag":223,"props":2858,"children":2860},{"href":2859},"ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py#L336-L492",[2861],{"type":54,"tag":84,"props":2862,"children":2864},{"className":2863},[],[2865],{"type":60,"value":2866},"example_converter.py:336-492",{"type":54,"tag":131,"props":2868,"children":2869},{},[2870,2872],{"type":60,"value":2871},"Camera intrinsics for Pinhole \u002F Fisheye \u002F FTheta + shutter type:\n",{"type":54,"tag":223,"props":2873,"children":2875},{"href":2874},"ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py#L524-L578",[2876],{"type":54,"tag":84,"props":2877,"children":2879},{"className":2878},[],[2880],{"type":60,"value":2881},"example_converter.py:524-578",{"type":54,"tag":131,"props":2883,"children":2884},{},[2885,2887],{"type":60,"value":2886},"Per-ray LiDAR timestamps and the three data shapes (range image \u002F sensor-frame\nXYZ \u002F world-frame XYZ requiring decompensation):\n",{"type":54,"tag":223,"props":2888,"children":2890},{"href":2889},"ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py#L746-L829",[2891],{"type":54,"tag":84,"props":2892,"children":2894},{"className":2893},[],[2895],{"type":60,"value":2896},"example_converter.py:746-829",{"type":54,"tag":131,"props":2898,"children":2899},{},[2900,2902],{"type":60,"value":2901},"Cuboid centroid convention (geometric center, not bottom-center):\n",{"type":54,"tag":223,"props":2903,"children":2905},{"href":2904},"ncore_template\u002Fimpl\u002Fdata_converter\u002Fexample_converter.py#L876-L980",[2906],{"type":54,"tag":84,"props":2907,"children":2909},{"className":2908},[],[2910],{"type":60,"value":2911},"example_converter.py:876-980",{"type":54,"tag":783,"props":2913,"children":2915},{"id":2914},"in-process-api-no-bazel",[2916],{"type":60,"value":2917},"In-process API (no Bazel)",{"type":54,"tag":70,"props":2919,"children":2920},{},[2921,2923,2929],{"type":60,"value":2922},"If you already have parsed arrays in Python and don't need a CLI, skip\n",{"type":54,"tag":84,"props":2924,"children":2926},{"className":2925},[],[2927],{"type":60,"value":2928},"FileBasedDataConverter",{"type":60,"value":2930}," entirely and call the V4 writer directly:",{"type":54,"tag":814,"props":2932,"children":2936},{"className":2933,"code":2934,"language":2935,"meta":819,"style":819},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from ncore.data.v4 import SequenceComponentGroupsWriter, PosesComponent, ...\nwriter = SequenceComponentGroupsWriter(\n    output_dir_path=out \u002F seq_id,\n    store_base_name=seq_id,\n    sequence_id=seq_id,\n    sequence_timestamp_interval_us=interval,\n    store_type=\"itar\",\n)\nposes_writer = writer.register_component_writer(PosesComponent.Writer, ...)\n# … write each component …\npaths = writer.finalize()\n","python",[2937],{"type":54,"tag":84,"props":2938,"children":2939},{"__ignoreMap":819},[2940,2948,2956,2964,2972,2981,2990,2999,3008,3017,3026],{"type":54,"tag":825,"props":2941,"children":2942},{"class":827,"line":828},[2943],{"type":54,"tag":825,"props":2944,"children":2945},{},[2946],{"type":60,"value":2947},"from ncore.data.v4 import SequenceComponentGroupsWriter, PosesComponent, ...\n",{"type":54,"tag":825,"props":2949,"children":2950},{"class":827,"line":838},[2951],{"type":54,"tag":825,"props":2952,"children":2953},{},[2954],{"type":60,"value":2955},"writer = SequenceComponentGroupsWriter(\n",{"type":54,"tag":825,"props":2957,"children":2958},{"class":827,"line":2189},[2959],{"type":54,"tag":825,"props":2960,"children":2961},{},[2962],{"type":60,"value":2963},"    output_dir_path=out \u002F seq_id,\n",{"type":54,"tag":825,"props":2965,"children":2966},{"class":827,"line":27},[2967],{"type":54,"tag":825,"props":2968,"children":2969},{},[2970],{"type":60,"value":2971},"    store_base_name=seq_id,\n",{"type":54,"tag":825,"props":2973,"children":2975},{"class":827,"line":2974},5,[2976],{"type":54,"tag":825,"props":2977,"children":2978},{},[2979],{"type":60,"value":2980},"    sequence_id=seq_id,\n",{"type":54,"tag":825,"props":2982,"children":2984},{"class":827,"line":2983},6,[2985],{"type":54,"tag":825,"props":2986,"children":2987},{},[2988],{"type":60,"value":2989},"    sequence_timestamp_interval_us=interval,\n",{"type":54,"tag":825,"props":2991,"children":2993},{"class":827,"line":2992},7,[2994],{"type":54,"tag":825,"props":2995,"children":2996},{},[2997],{"type":60,"value":2998},"    store_type=\"itar\",\n",{"type":54,"tag":825,"props":3000,"children":3002},{"class":827,"line":3001},8,[3003],{"type":54,"tag":825,"props":3004,"children":3005},{},[3006],{"type":60,"value":3007},")\n",{"type":54,"tag":825,"props":3009,"children":3011},{"class":827,"line":3010},9,[3012],{"type":54,"tag":825,"props":3013,"children":3014},{},[3015],{"type":60,"value":3016},"poses_writer = writer.register_component_writer(PosesComponent.Writer, ...)\n",{"type":54,"tag":825,"props":3018,"children":3020},{"class":827,"line":3019},10,[3021],{"type":54,"tag":825,"props":3022,"children":3023},{},[3024],{"type":60,"value":3025},"# … write each component …\n",{"type":54,"tag":825,"props":3027,"children":3029},{"class":827,"line":3028},11,[3030],{"type":54,"tag":825,"props":3031,"children":3032},{},[3033],{"type":60,"value":3034},"paths = writer.finalize()\n",{"type":54,"tag":70,"props":3036,"children":3037},{},[3038],{"type":60,"value":3039},"The contract (component order, dtype rules, timestamp constraints) is identical.",{"type":54,"tag":452,"props":3041,"children":3042},{},[],{"type":54,"tag":63,"props":3044,"children":3046},{"id":3045},"v4-conventions-you-must-obey",[3047],{"type":60,"value":273},{"type":54,"tag":70,"props":3049,"children":3050},{},[3051],{"type":60,"value":3052},"These are the rules that turn into runtime asserts (or worse: silent NuRec\nartefacts). Cross-reference the spec before relaxing any of them.",{"type":54,"tag":783,"props":3054,"children":3056},{"id":3055},"time",[3057],{"type":60,"value":3058},"Time",{"type":54,"tag":127,"props":3060,"children":3061},{},[3062,3086,3121,3149,3175,3203],{"type":54,"tag":131,"props":3063,"children":3064},{},[3065,3070,3071,3077,3079,3085],{"type":54,"tag":76,"props":3066,"children":3067},{},[3068],{"type":60,"value":3069},"Microseconds, uint64, everywhere.",{"type":60,"value":1437},{"type":54,"tag":84,"props":3072,"children":3074},{"className":3073},[],[3075],{"type":60,"value":3076},"np.uint64",{"type":60,"value":3078},", not ",{"type":54,"tag":84,"props":3080,"children":3082},{"className":3081},[],[3083],{"type":60,"value":3084},"np.int64",{"type":60,"value":99},{"type":54,"tag":131,"props":3087,"children":3088},{},[3089,3091,3097,3099,3105,3107,3112,3114,3120],{"type":60,"value":3090},"The sequence interval is half-closed ",{"type":54,"tag":84,"props":3092,"children":3094},{"className":3093},[],[3095],{"type":60,"value":3096},"[start, stop)",{"type":60,"value":3098},". Build it with\n",{"type":54,"tag":84,"props":3100,"children":3102},{"className":3101},[],[3103],{"type":60,"value":3104},"HalfClosedInterval.from_start_end(start, end_inclusive)",{"type":60,"value":3106}," — do ",{"type":54,"tag":76,"props":3108,"children":3109},{},[3110],{"type":60,"value":3111},"not",{"type":60,"value":3113},"\npre-add 1 to ",{"type":54,"tag":84,"props":3115,"children":3117},{"className":3116},[],[3118],{"type":60,"value":3119},"end",{"type":60,"value":99},{"type":54,"tag":131,"props":3122,"children":3123},{},[3124,3126,3131,3133,3139,3141,3147],{"type":60,"value":3125},"Dynamic poses ",{"type":54,"tag":76,"props":3127,"children":3128},{},[3129],{"type":60,"value":3130},"must exactly span",{"type":60,"value":3132}," the interval: ",{"type":54,"tag":84,"props":3134,"children":3136},{"className":3135},[],[3137],{"type":60,"value":3138},"timestamps[0] == start",{"type":60,"value":3140}," and\n",{"type":54,"tag":84,"props":3142,"children":3144},{"className":3143},[],[3145],{"type":60,"value":3146},"timestamps[-1] == stop - 1",{"type":60,"value":3148},". Sensors with timestamps slightly outside this\nrange are clamped at write time.",{"type":54,"tag":131,"props":3150,"children":3151},{},[3152,3154,3159,3161,3167,3169,3173],{"type":60,"value":3153},"Per-sensor frame timestamps are ",{"type":54,"tag":84,"props":3155,"children":3157},{"className":3156},[],[3158],{"type":60,"value":1380},{"type":60,"value":3160}," (cameras) or\n",{"type":54,"tag":84,"props":3162,"children":3164},{"className":3163},[],[3165],{"type":60,"value":3166},"[sweep_start, sweep_end]",{"type":60,"value":3168}," (LiDAR\u002Fradar). They must lie within the sequence\ninterval and the ",{"type":54,"tag":76,"props":3170,"children":3171},{},[3172],{"type":60,"value":3119},{"type":60,"value":3174}," must be unique within that sensor's writer.",{"type":54,"tag":131,"props":3176,"children":3177},{},[3178,3180,3186,3187,3193,3195,3201],{"type":60,"value":3179},"Rolling-shutter cameras: ",{"type":54,"tag":84,"props":3181,"children":3183},{"className":3182},[],[3184],{"type":60,"value":3185},"start = trigger + half_shutter",{"type":60,"value":2244},{"type":54,"tag":84,"props":3188,"children":3190},{"className":3189},[],[3191],{"type":60,"value":3192},"end = readout_done - half_shutter",{"type":60,"value":3194},". Global shutter: ",{"type":54,"tag":84,"props":3196,"children":3198},{"className":3197},[],[3199],{"type":60,"value":3200},"start == end",{"type":60,"value":3202}," is OK.",{"type":54,"tag":131,"props":3204,"children":3205},{},[3206,3208,3214,3216,3221,3223,3229,3231,3236],{"type":60,"value":3207},"LiDAR ",{"type":54,"tag":84,"props":3209,"children":3211},{"className":3210},[],[3212],{"type":60,"value":3213},"frame_timestamps_us[0]",{"type":60,"value":3215}," is the ",{"type":54,"tag":76,"props":3217,"children":3218},{},[3219],{"type":60,"value":3220},"sweep start",{"type":60,"value":3222}," (not midpoint). Per-ray\n",{"type":54,"tag":84,"props":3224,"children":3226},{"className":3225},[],[3227],{"type":60,"value":3228},"timestamp_us",{"type":60,"value":3230}," must lie in ",{"type":54,"tag":84,"props":3232,"children":3234},{"className":3233},[],[3235],{"type":60,"value":3166},{"type":60,"value":3237},". Treating the dataset's\nframe timestamp as the midpoint and subtracting half a sweep duration\nintroduces a ~50 ms shift on a 10 Hz LiDAR and produces motion-comp blur.",{"type":54,"tag":783,"props":3239,"children":3241},{"id":3240},"pose-graph",[3242],{"type":60,"value":3243},"Pose graph",{"type":54,"tag":127,"props":3245,"children":3246},{},[3247,3290,3303,3323],{"type":54,"tag":131,"props":3248,"children":3249},{},[3250,3252,3257,3259,3265,3266,3272,3274,3280,3282,3288],{"type":60,"value":3251},"All intermediate pose math is ",{"type":54,"tag":76,"props":3253,"children":3254},{},[3255],{"type":60,"value":3256},"float64",{"type":60,"value":3258},". Cast to float32 only as the very\nlast step before ",{"type":54,"tag":84,"props":3260,"children":3262},{"className":3261},[],[3263],{"type":60,"value":3264},"store_dynamic_pose",{"type":60,"value":521},{"type":54,"tag":84,"props":3267,"children":3269},{"className":3268},[],[3270],{"type":60,"value":3271},"store_static_pose",{"type":60,"value":3273},".\nException: ",{"type":54,"tag":84,"props":3275,"children":3277},{"className":3276},[],[3278],{"type":60,"value":3279},"world → world_global",{"type":60,"value":3281}," stays float64 (NuRec's\n",{"type":54,"tag":84,"props":3283,"children":3285},{"className":3284},[],[3286],{"type":60,"value":3287},"RigTrajectories.T_world_base",{"type":60,"value":3289}," is float64).",{"type":54,"tag":131,"props":3291,"children":3292},{},[3293,3295,3301],{"type":60,"value":3294},"Re-reference dynamic poses to the first ego pose:\n",{"type":54,"tag":84,"props":3296,"children":3298},{"className":3297},[],[3299],{"type":60,"value":3300},"poses_f64 = inv(poses_f64[0]) @ poses_f64",{"type":60,"value":3302},". Without this, GPS\u002FUTM\u002FENU at\n10+ km loses sub-cm precision once cast to float32.",{"type":54,"tag":131,"props":3304,"children":3305},{},[3306,3308,3313,3315,3321],{"type":60,"value":3307},"The pose trajectory must be ",{"type":54,"tag":76,"props":3309,"children":3310},{},[3311],{"type":60,"value":3312},"dense",{"type":60,"value":3314}," (waypoint spacing \u003C LiDAR sweep\nduration, e.g. \u003C50 ms for 10 Hz). Combine every available source: per-camera\nper-frame poses, per-LiDAR per-sweep poses, IMU\u002FGPS\u002Fodometry. Concatenate,\n",{"type":54,"tag":84,"props":3316,"children":3318},{"className":3317},[],[3319],{"type":60,"value":3320},"np.unique",{"type":60,"value":3322}," by timestamp, sort.",{"type":54,"tag":131,"props":3324,"children":3325},{},[3326,3332,3333,3339,3341,3347,3349,3355],{"type":54,"tag":84,"props":3327,"children":3329},{"className":3328},[],[3330],{"type":60,"value":3331},"T_camera_rig",{"type":60,"value":2005},{"type":54,"tag":84,"props":3334,"children":3336},{"className":3335},[],[3337],{"type":60,"value":3338},"T_lidar_rig",{"type":60,"value":3340}," are float32 (NuRec's ",{"type":54,"tag":84,"props":3342,"children":3344},{"className":3343},[],[3345],{"type":60,"value":3346},"transform_poses",{"type":60,"value":3348}," leaks\ninput dtype through an internal matmul; float64 here collides with the\nfloat32 trajectory and crashes \"Get Lidar Point Clouds\" with\n",{"type":54,"tag":84,"props":3350,"children":3352},{"className":3351},[],[3353],{"type":60,"value":3354},"RuntimeError: double != float",{"type":60,"value":163},{"type":54,"tag":783,"props":3357,"children":3359},{"id":3358},"lidar",[3360],{"type":60,"value":3361},"LiDAR",{"type":54,"tag":127,"props":3363,"children":3364},{},[3365,3473,3627],{"type":54,"tag":131,"props":3366,"children":3367},{},[3368,3370,3375,3377,3382,3384,3389,3391],{"type":60,"value":3369},"Direction vectors are ",{"type":54,"tag":76,"props":3371,"children":3372},{},[3373],{"type":60,"value":3374},"unit-norm",{"type":60,"value":3376},", in ",{"type":54,"tag":76,"props":3378,"children":3379},{},[3380],{"type":60,"value":3381},"sensor coordinates",{"type":60,"value":3383},", at each ray's\n",{"type":54,"tag":76,"props":3385,"children":3386},{},[3387],{"type":60,"value":3388},"measurement time",{"type":60,"value":3390}," (not the sweep-start time). Three input shapes:\n",{"type":54,"tag":216,"props":3392,"children":3393},{},[3394,3433,3449],{"type":54,"tag":131,"props":3395,"children":3396},{},[3397,3402,3404,3410,3411,3417,3418,3424,3426,3432],{"type":54,"tag":76,"props":3398,"children":3399},{},[3400],{"type":60,"value":3401},"Polar range image",{"type":60,"value":3403}," with beam geometry → derive directly from\n",{"type":54,"tag":84,"props":3405,"children":3407},{"className":3406},[],[3408],{"type":60,"value":3409},"column_azimuths_rad[col]",{"type":60,"value":1700},{"type":54,"tag":84,"props":3412,"children":3414},{"className":3413},[],[3415],{"type":60,"value":3416},"row_elevations_rad[row]",{"type":60,"value":2244},{"type":54,"tag":84,"props":3419,"children":3421},{"className":3420},[],[3422],{"type":60,"value":3423},"row_azimuth_offsets_rad[row]",{"type":60,"value":3425},". Direction:\n",{"type":54,"tag":84,"props":3427,"children":3429},{"className":3428},[],[3430],{"type":60,"value":3431},"(cos(elev)*cos(azi), cos(elev)*sin(azi), sin(elev))",{"type":60,"value":99},{"type":54,"tag":131,"props":3434,"children":3435},{},[3436,3441,3442,3448],{"type":54,"tag":76,"props":3437,"children":3438},{},[3439],{"type":60,"value":3440},"Sensor-frame XYZ",{"type":60,"value":2660},{"type":54,"tag":84,"props":3443,"children":3445},{"className":3444},[],[3446],{"type":60,"value":3447},"direction = xyz \u002F |xyz|",{"type":60,"value":99},{"type":54,"tag":131,"props":3450,"children":3451},{},[3452,3457,3458,3463,3465,3471],{"type":54,"tag":76,"props":3453,"children":3454},{},[3455],{"type":60,"value":3456},"World-frame or ego-compensated XYZ",{"type":60,"value":2660},{"type":54,"tag":76,"props":3459,"children":3460},{},[3461],{"type":60,"value":3462},"decompensate",{"type":60,"value":3464}," with\n",{"type":54,"tag":84,"props":3466,"children":3468},{"className":3467},[],[3469],{"type":60,"value":3470},"MotionCompensator.motion_decompensate_points",{"type":60,"value":3472},", then normalise.",{"type":54,"tag":131,"props":3474,"children":3475},{},[3476,3478],{"type":60,"value":3477},"Spinning LiDAR parameter traps (silent — wrong values pass write but fail\nNuRec):\n",{"type":54,"tag":127,"props":3479,"children":3480},{},[3481,3510,3548,3602],{"type":54,"tag":131,"props":3482,"children":3483},{},[3484,3489,3491,3500,3502,3508],{"type":54,"tag":84,"props":3485,"children":3487},{"className":3486},[],[3488],{"type":60,"value":2817},{"type":60,"value":3490},": nearly all automotive spinning LiDARs (Velodyne,\nHesai, Ouster, Robosense) are ",{"type":54,"tag":76,"props":3492,"children":3493},{},[3494],{"type":54,"tag":84,"props":3495,"children":3497},{"className":3496},[],[3498],{"type":60,"value":3499},"\"cw\"",{"type":60,"value":3501},". The template defaults to\n",{"type":54,"tag":84,"props":3503,"children":3505},{"className":3504},[],[3506],{"type":60,"value":3507},"\"ccw\"",{"type":60,"value":3509}," to force the question. Wrong value mirrors Y → Z-flip in NuRec.",{"type":54,"tag":131,"props":3511,"children":3512},{},[3513,3518,3519,3524,3526,3531,3533,3539,3541,3547],{"type":54,"tag":84,"props":3514,"children":3516},{"className":3515},[],[3517],{"type":60,"value":2825},{"type":60,"value":1608},{"type":54,"tag":76,"props":3520,"children":3521},{},[3522],{"type":60,"value":3523},"non-uniform on every common sensor",{"type":60,"value":3525},". Read real\nper-beam angles from the sensor calibration. ",{"type":54,"tag":76,"props":3527,"children":3528},{},[3529],{"type":60,"value":3530},"Strictly descending",{"type":60,"value":3532},"\n(highest beam first); reverse if your source is ascending. NCore asserts\n",{"type":54,"tag":84,"props":3534,"children":3536},{"className":3535},[],[3537],{"type":60,"value":3538},"np.diff > 0",{"type":60,"value":3540}," after projecting through ",{"type":54,"tag":84,"props":3542,"children":3544},{"className":3543},[],[3545],{"type":60,"value":3546},"relative_angle",{"type":60,"value":99},{"type":54,"tag":131,"props":3549,"children":3550},{},[3551,3556,3558,3563,3565,3571,3573,3579,3581,3587,3589,3594,3595,3600],{"type":54,"tag":84,"props":3552,"children":3554},{"className":3553},[],[3555],{"type":60,"value":1713},{"type":60,"value":3557},": must reflect the ",{"type":54,"tag":76,"props":3559,"children":3560},{},[3561],{"type":60,"value":3562},"actual",{"type":60,"value":3564}," per-column azimuth at\nframe start (not a synthetic ",{"type":54,"tag":84,"props":3566,"children":3568},{"className":3567},[],[3569],{"type":60,"value":3570},"linspace",{"type":60,"value":3572},"). NCore validates strict ordering\nvia ",{"type":54,"tag":84,"props":3574,"children":3576},{"className":3575},[],[3577],{"type":60,"value":3578},"relative_angle(azim[0], azim, spinning_direction)",{"type":60,"value":3580},". If raw\nper-column heading is available, use it; otherwise ",{"type":54,"tag":84,"props":3582,"children":3584},{"className":3583},[],[3585],{"type":60,"value":3586},"linspace(0, ±2π, N, endpoint=False)",{"type":60,"value":3588}," is acceptable for ",{"type":54,"tag":84,"props":3590,"children":3592},{"className":3591},[],[3593],{"type":60,"value":3507},{"type":60,"value":521},{"type":54,"tag":84,"props":3596,"children":3598},{"className":3597},[],[3599],{"type":60,"value":3499},{"type":60,"value":3601}," respectively.",{"type":54,"tag":131,"props":3603,"children":3604},{},[3605,3610,3612,3617,3619,3625],{"type":54,"tag":84,"props":3606,"children":3608},{"className":3607},[],[3609],{"type":60,"value":2839},{"type":60,"value":3611},": zero for most sensors; ",{"type":54,"tag":76,"props":3613,"children":3614},{},[3615],{"type":60,"value":3616},"non-zero on Ouster",{"type":60,"value":3618},"\n(",{"type":54,"tag":84,"props":3620,"children":3622},{"className":3621},[],[3623],{"type":60,"value":3624},"beam_azimuth_angles",{"type":60,"value":3626}," from the HTTP API). Skipping this on Ouster\nmisaligns LiDAR-to-camera projection.",{"type":54,"tag":131,"props":3628,"children":3629},{},[3630,3632,3637,3639,3644],{"type":60,"value":3631},"Per-ray ",{"type":54,"tag":84,"props":3633,"children":3635},{"className":3634},[],[3636],{"type":60,"value":3228},{"type":60,"value":3638}," is ",{"type":54,"tag":76,"props":3640,"children":3641},{},[3642],{"type":60,"value":3643},"required",{"type":60,"value":3645}," for motion compensation; supply real\nper-column firing times (typically column-linear across the sweep).",{"type":54,"tag":783,"props":3647,"children":3649},{"id":3648},"cuboids",[3650],{"type":60,"value":1469},{"type":54,"tag":127,"props":3652,"children":3653},{},[3654,3695,3728],{"type":54,"tag":131,"props":3655,"children":3656},{},[3657,3663,3664,3669,3671,3677,3679,3685,3687,3693],{"type":54,"tag":84,"props":3658,"children":3660},{"className":3659},[],[3661],{"type":60,"value":3662},"BBox3.centroid",{"type":60,"value":3215},{"type":54,"tag":76,"props":3665,"children":3666},{},[3667],{"type":60,"value":3668},"geometric center",{"type":60,"value":3670},". Many AV datasets use\nbottom-center → add ",{"type":54,"tag":84,"props":3672,"children":3674},{"className":3673},[],[3675],{"type":60,"value":3676},"dim_z \u002F 2",{"type":60,"value":3678}," to z. Verify empirically: ",{"type":54,"tag":84,"props":3680,"children":3682},{"className":3681},[],[3683],{"type":60,"value":3684},"mean(z) - mean(h)\u002F2",{"type":60,"value":3686},"\nnear 0 = geometric center; near ",{"type":54,"tag":84,"props":3688,"children":3690},{"className":3689},[],[3691],{"type":60,"value":3692},"mean(h)\u002F2",{"type":60,"value":3694}," above ground = bottom-center.",{"type":54,"tag":131,"props":3696,"children":3697},{},[3698,3704,3706,3712,3714,3720,3721,3726],{"type":54,"tag":84,"props":3699,"children":3701},{"className":3700},[],[3702],{"type":60,"value":3703},"reference_frame_id",{"type":60,"value":3705}," ∈ ",{"type":54,"tag":84,"props":3707,"children":3709},{"className":3708},[],[3710],{"type":60,"value":3711},"{\"rig\", \"world\", \u003Csensor_id>}",{"type":60,"value":3713},".\n",{"type":54,"tag":84,"props":3715,"children":3717},{"className":3716},[],[3718],{"type":60,"value":3719},"reference_frame_timestamp_us",{"type":60,"value":2005},{"type":54,"tag":84,"props":3722,"children":3724},{"className":3723},[],[3725],{"type":60,"value":3228},{"type":60,"value":3727}," must lie within the\nsequence interval.",{"type":54,"tag":131,"props":3729,"children":3730},{},[3731,3740,3742,3747,3749,3755,3757,3763],{"type":54,"tag":76,"props":3732,"children":3733},{},[3734],{"type":54,"tag":84,"props":3735,"children":3737},{"className":3736},[],[3738],{"type":60,"value":3739},"LabelSource",{"type":60,"value":3741},": tag the ",{"type":54,"tag":76,"props":3743,"children":3744},{},[3745],{"type":60,"value":3746},"origin pipeline",{"type":60,"value":3748},", not quality. Third-party\ndataset labels (Waymo, NuScenes, PandaSet) → ",{"type":54,"tag":84,"props":3750,"children":3752},{"className":3751},[],[3753],{"type":60,"value":3754},"EXTERNAL",{"type":60,"value":3756},", even if the upstream\nis human GT. Use ",{"type":54,"tag":84,"props":3758,"children":3760},{"className":3759},[],[3761],{"type":60,"value":3762},"GT_ANNOTATION",{"type":60,"value":3764}," only when this converter's team owns the\nannotation.",{"type":54,"tag":783,"props":3766,"children":3768},{"id":3767},"camera",[3769],{"type":60,"value":3770},"Camera",{"type":54,"tag":127,"props":3772,"children":3773},{},[3774,3779,3808,3864],{"type":54,"tag":131,"props":3775,"children":3776},{},[3777],{"type":60,"value":3778},"Image bytes stored verbatim (JPEG\u002FPNG); NCore does not re-encode.",{"type":54,"tag":131,"props":3780,"children":3781},{},[3782,3784,3790,3792,3798,3800,3806],{"type":60,"value":3783},"Use the model that matches your sensor: ",{"type":54,"tag":84,"props":3785,"children":3787},{"className":3786},[],[3788],{"type":60,"value":3789},"OpenCVPinholeCameraModelParameters",{"type":60,"value":3791},"\n(most AV cameras), ",{"type":54,"tag":84,"props":3793,"children":3795},{"className":3794},[],[3796],{"type":60,"value":3797},"OpenCVFisheyeCameraModelParameters",{"type":60,"value":3799}," (Kannala-Brandt\nfisheye, e.g. ScanNet++ \u002F GoPro), ",{"type":54,"tag":84,"props":3801,"children":3803},{"className":3802},[],[3804],{"type":60,"value":3805},"FThetaCameraModelParameters",{"type":60,"value":3807}," (NVIDIA\nHyperion \u002F equidistant-radial). Resolution must match the actual image bytes\nbit-for-bit.",{"type":54,"tag":131,"props":3809,"children":3810},{},[3811,3813,3818,3820,3826,3828,3834,3835,3841,3842,3848,3849,3855,3856,3862],{"type":60,"value":3812},"Map shutter direction by ",{"type":54,"tag":76,"props":3814,"children":3815},{},[3816],{"type":60,"value":3817},"enum name",{"type":60,"value":3819},", not integer cast. The five\n",{"type":54,"tag":84,"props":3821,"children":3823},{"className":3822},[],[3824],{"type":60,"value":3825},"ShutterType",{"type":60,"value":3827}," values are ",{"type":54,"tag":84,"props":3829,"children":3831},{"className":3830},[],[3832],{"type":60,"value":3833},"ROLLING_TOP_TO_BOTTOM=1",{"type":60,"value":1700},{"type":54,"tag":84,"props":3836,"children":3838},{"className":3837},[],[3839],{"type":60,"value":3840},"ROLLING_LEFT_TO_RIGHT=2",{"type":60,"value":2244},{"type":54,"tag":84,"props":3843,"children":3845},{"className":3844},[],[3846],{"type":60,"value":3847},"ROLLING_BOTTOM_TO_TOP=3",{"type":60,"value":1700},{"type":54,"tag":84,"props":3850,"children":3852},{"className":3851},[],[3853],{"type":60,"value":3854},"ROLLING_RIGHT_TO_LEFT=4",{"type":60,"value":1700},{"type":54,"tag":84,"props":3857,"children":3859},{"className":3858},[],[3860],{"type":60,"value":3861},"GLOBAL=5",{"type":60,"value":3863},". Build a\nsource-enum-to-name dict.",{"type":54,"tag":131,"props":3865,"children":3866},{},[3867,3869,3873],{"type":60,"value":3868},"Provide ego masks. NuRec's data-quality guide ",{"type":54,"tag":76,"props":3870,"children":3871},{},[3872],{"type":60,"value":1540},{"type":60,"value":3874}," binary\nego-vehicle masks per camera. Without them the hood\u002Froof rack leaks into the\nreconstruction.",{"type":54,"tag":783,"props":3876,"children":3878},{"id":3877},"nurec-data-quality-minimums",[3879],{"type":60,"value":3880},"NuRec data-quality minimums",{"type":54,"tag":70,"props":3882,"children":3883},{},[3884],{"type":60,"value":3885},"Per the NuRec \"Ensure Data Quality\" guide, hitting these is the difference\nbetween a clean reconstruction and visible artefacts:",{"type":54,"tag":127,"props":3887,"children":3888},{},[3889,3894,3899,3904,3917],{"type":54,"tag":131,"props":3890,"children":3891},{},[3892],{"type":60,"value":3893},"Camera extrinsics: \u003C 0.5° rotation, \u003C 2 cm translation (relative to rig).",{"type":54,"tag":131,"props":3895,"children":3896},{},[3897],{"type":60,"value":3898},"Camera intrinsics: \u003C 1 px reprojection error.",{"type":54,"tag":131,"props":3900,"children":3901},{},[3902],{"type":60,"value":3903},"Egomotion: \u003C 0.5° \u002F \u003C 2.5 cm consecutive-frame error; trajectory must cover\nevery sensor frame's start and end timestamp.",{"type":54,"tag":131,"props":3905,"children":3906},{},[3907,3909,3915],{"type":60,"value":3908},"Cuboids: \u003C 1° \u002F \u003C 5 cm position \u002F \u003C 5 cm dimension; per-track stable\n",{"type":54,"tag":84,"props":3910,"children":3912},{"className":3911},[],[3913],{"type":60,"value":3914},"track_id",{"type":60,"value":3916},"s.",{"type":54,"tag":131,"props":3918,"children":3919},{},[3920,3922,3927],{"type":60,"value":3921},"Original sensor resolution at full FPS, ",{"type":54,"tag":76,"props":3923,"children":3924},{},[3925],{"type":60,"value":3926},"no undistortion \u002F rectification",{"type":60,"value":99},{"type":54,"tag":452,"props":3929,"children":3930},{},[],{"type":54,"tag":63,"props":3932,"children":3934},{"id":3933},"format-recipes-av",[3935],{"type":60,"value":282},{"type":54,"tag":783,"props":3937,"children":3939},{"id":3938},"pai-nvidia-physical-ai-autonomous-vehicles-huggingface",[3940],{"type":60,"value":294},{"type":54,"tag":70,"props":3942,"children":3943},{},[3944,3949],{"type":54,"tag":76,"props":3945,"children":3946},{},[3947],{"type":60,"value":3948},"Built-in.",{"type":60,"value":3950}," Streaming or local. Uses Hyperion 8 \u002F 8.1 sensor IDs.",{"type":54,"tag":814,"props":3952,"children":3954},{"className":816,"code":3953,"language":818,"meta":819,"style":819},"# Streaming (no download — recommended for cloud \u002F OSMO)\nbazel run \u002F\u002Ftools\u002Fdata_converter\u002Fpai:convert -- \\\n    --output-dir \u003COUT> \\\n    --camera-id camera_front_wide_120fov \\\n    --camera-id camera_cross_left_120fov \\\n    --camera-id camera_cross_right_120fov \\\n    --camera-id camera_front_tele_30fov \\\n    pai-stream-v4 \\\n        --clip-id \u003CCLIP_ID> \\\n        --hf-token \"$HF_TOKEN\" \\\n        --store-type itar \\\n        --profile separate-sensors \\\n        --sequence-meta\n",[3955],{"type":54,"tag":84,"props":3956,"children":3957},{"__ignoreMap":819},[3958,3966,3992,4024,4041,4057,4073,4089,4101,4131,4155,4172,4190],{"type":54,"tag":825,"props":3959,"children":3960},{"class":827,"line":828},[3961],{"type":54,"tag":825,"props":3962,"children":3963},{"style":832},[3964],{"type":60,"value":3965},"# Streaming (no download — recommended for cloud \u002F OSMO)\n",{"type":54,"tag":825,"props":3967,"children":3968},{"class":827,"line":838},[3969,3973,3978,3982,3987],{"type":54,"tag":825,"props":3970,"children":3971},{"style":1072},[3972],{"type":60,"value":747},{"type":54,"tag":825,"props":3974,"children":3975},{"style":854},[3976],{"type":60,"value":3977}," run",{"type":54,"tag":825,"props":3979,"children":3980},{"style":854},[3981],{"type":60,"value":2204},{"type":54,"tag":825,"props":3983,"children":3984},{"style":854},[3985],{"type":60,"value":3986}," --",{"type":54,"tag":825,"props":3988,"children":3989},{"style":865},[3990],{"type":60,"value":3991}," \\\n",{"type":54,"tag":825,"props":3993,"children":3994},{"class":827,"line":2189},[3995,4000,4005,4010,4015,4020],{"type":54,"tag":825,"props":3996,"children":3997},{"style":854},[3998],{"type":60,"value":3999},"    --output-dir",{"type":54,"tag":825,"props":4001,"children":4002},{"style":848},[4003],{"type":60,"value":4004}," \u003C",{"type":54,"tag":825,"props":4006,"children":4007},{"style":854},[4008],{"type":60,"value":4009},"OU",{"type":54,"tag":825,"props":4011,"children":4012},{"style":865},[4013],{"type":60,"value":4014},"T",{"type":54,"tag":825,"props":4016,"children":4017},{"style":848},[4018],{"type":60,"value":4019},">",{"type":54,"tag":825,"props":4021,"children":4022},{"style":865},[4023],{"type":60,"value":3991},{"type":54,"tag":825,"props":4025,"children":4026},{"class":827,"line":27},[4027,4032,4037],{"type":54,"tag":825,"props":4028,"children":4029},{"style":854},[4030],{"type":60,"value":4031},"    --camera-id",{"type":54,"tag":825,"props":4033,"children":4034},{"style":854},[4035],{"type":60,"value":4036}," camera_front_wide_120fov",{"type":54,"tag":825,"props":4038,"children":4039},{"style":865},[4040],{"type":60,"value":3991},{"type":54,"tag":825,"props":4042,"children":4043},{"class":827,"line":2974},[4044,4048,4053],{"type":54,"tag":825,"props":4045,"children":4046},{"style":854},[4047],{"type":60,"value":4031},{"type":54,"tag":825,"props":4049,"children":4050},{"style":854},[4051],{"type":60,"value":4052}," camera_cross_left_120fov",{"type":54,"tag":825,"props":4054,"children":4055},{"style":865},[4056],{"type":60,"value":3991},{"type":54,"tag":825,"props":4058,"children":4059},{"class":827,"line":2983},[4060,4064,4069],{"type":54,"tag":825,"props":4061,"children":4062},{"style":854},[4063],{"type":60,"value":4031},{"type":54,"tag":825,"props":4065,"children":4066},{"style":854},[4067],{"type":60,"value":4068}," camera_cross_right_120fov",{"type":54,"tag":825,"props":4070,"children":4071},{"style":865},[4072],{"type":60,"value":3991},{"type":54,"tag":825,"props":4074,"children":4075},{"class":827,"line":2992},[4076,4080,4085],{"type":54,"tag":825,"props":4077,"children":4078},{"style":854},[4079],{"type":60,"value":4031},{"type":54,"tag":825,"props":4081,"children":4082},{"style":854},[4083],{"type":60,"value":4084}," camera_front_tele_30fov",{"type":54,"tag":825,"props":4086,"children":4087},{"style":865},[4088],{"type":60,"value":3991},{"type":54,"tag":825,"props":4090,"children":4091},{"class":827,"line":3001},[4092,4097],{"type":54,"tag":825,"props":4093,"children":4094},{"style":854},[4095],{"type":60,"value":4096},"    pai-stream-v4",{"type":54,"tag":825,"props":4098,"children":4099},{"style":865},[4100],{"type":60,"value":3991},{"type":54,"tag":825,"props":4102,"children":4103},{"class":827,"line":3010},[4104,4109,4113,4118,4123,4127],{"type":54,"tag":825,"props":4105,"children":4106},{"style":854},[4107],{"type":60,"value":4108},"        --clip-id",{"type":54,"tag":825,"props":4110,"children":4111},{"style":848},[4112],{"type":60,"value":4004},{"type":54,"tag":825,"props":4114,"children":4115},{"style":854},[4116],{"type":60,"value":4117},"CLIP_I",{"type":54,"tag":825,"props":4119,"children":4120},{"style":865},[4121],{"type":60,"value":4122},"D",{"type":54,"tag":825,"props":4124,"children":4125},{"style":848},[4126],{"type":60,"value":4019},{"type":54,"tag":825,"props":4128,"children":4129},{"style":865},[4130],{"type":60,"value":3991},{"type":54,"tag":825,"props":4132,"children":4133},{"class":827,"line":3019},[4134,4139,4143,4147,4151],{"type":54,"tag":825,"props":4135,"children":4136},{"style":854},[4137],{"type":60,"value":4138},"        --hf-token",{"type":54,"tag":825,"props":4140,"children":4141},{"style":848},[4142],{"type":60,"value":851},{"type":54,"tag":825,"props":4144,"children":4145},{"style":865},[4146],{"type":60,"value":971},{"type":54,"tag":825,"props":4148,"children":4149},{"style":848},[4150],{"type":60,"value":976},{"type":54,"tag":825,"props":4152,"children":4153},{"style":865},[4154],{"type":60,"value":3991},{"type":54,"tag":825,"props":4156,"children":4157},{"class":827,"line":3028},[4158,4163,4168],{"type":54,"tag":825,"props":4159,"children":4160},{"style":854},[4161],{"type":60,"value":4162},"        --store-type",{"type":54,"tag":825,"props":4164,"children":4165},{"style":854},[4166],{"type":60,"value":4167}," itar",{"type":54,"tag":825,"props":4169,"children":4170},{"style":865},[4171],{"type":60,"value":3991},{"type":54,"tag":825,"props":4173,"children":4175},{"class":827,"line":4174},12,[4176,4181,4186],{"type":54,"tag":825,"props":4177,"children":4178},{"style":854},[4179],{"type":60,"value":4180},"        --profile",{"type":54,"tag":825,"props":4182,"children":4183},{"style":854},[4184],{"type":60,"value":4185}," separate-sensors",{"type":54,"tag":825,"props":4187,"children":4188},{"style":865},[4189],{"type":60,"value":3991},{"type":54,"tag":825,"props":4191,"children":4193},{"class":827,"line":4192},13,[4194],{"type":54,"tag":825,"props":4195,"children":4196},{"style":854},[4197],{"type":60,"value":4198},"        --sequence-meta\n",{"type":54,"tag":70,"props":4200,"children":4201},{},[4202],{"type":60,"value":4203},"Notes:",{"type":54,"tag":127,"props":4205,"children":4206},{},[4207,4227,4240,4261,4273,4304,4337],{"type":54,"tag":131,"props":4208,"children":4209},{},[4210,4212,4218,4220,4225],{"type":60,"value":4211},"HF dataset: ",{"type":54,"tag":84,"props":4213,"children":4215},{"className":4214},[],[4216],{"type":60,"value":4217},"nvidia\u002FPhysicalAI-Autonomous-Vehicles",{"type":60,"value":4219},". License must be accepted\non HF before ",{"type":54,"tag":84,"props":4221,"children":4223},{"className":4222},[],[4224],{"type":60,"value":779},{"type":60,"value":4226}," works.",{"type":54,"tag":131,"props":4228,"children":4229},{},[4230,4232,4238],{"type":60,"value":4231},"7 cameras (FTheta + Fisheye + Pinhole depending on FOV), 1 top LiDAR\n(",{"type":54,"tag":84,"props":4233,"children":4235},{"className":4234},[],[4236],{"type":60,"value":4237},"lidar_top_360fov",{"type":60,"value":4239},", spinning, see datasheet for elevations).",{"type":54,"tag":131,"props":4241,"children":4242},{},[4243,4245,4251,4253,4259],{"type":60,"value":4244},"Camera intrinsics include ",{"type":54,"tag":84,"props":4246,"children":4248},{"className":4247},[],[4249],{"type":60,"value":4250},"shutter_delay_us",{"type":60,"value":4252}," for per-row rolling-shutter\ntimestamping, plus optional ",{"type":54,"tag":84,"props":4254,"children":4256},{"className":4255},[],[4257],{"type":60,"value":4258},"BivariateWindshieldModelParameters",{"type":60,"value":4260}," for\nwindshield refraction.",{"type":54,"tag":131,"props":4262,"children":4263},{},[4264,4266,4272],{"type":60,"value":4265},"Output path: ",{"type":54,"tag":84,"props":4267,"children":4269},{"className":4268},[],[4270],{"type":60,"value":4271},"\u003Coutput-dir>\u002Fpai_\u003Cclip-id>\u002Fpai_\u003Cclip-id>.ncore4.zarr.itar",{"type":60,"value":99},{"type":54,"tag":131,"props":4274,"children":4275},{},[4276,4278,4284,4286,4291,4293,4302],{"type":60,"value":4277},"Discover clip IDs via the ",{"type":54,"tag":84,"props":4279,"children":4281},{"className":4280},[],[4282],{"type":60,"value":4283},"clip_index.parquet",{"type":60,"value":4285}," blob in the HF dataset\n(",{"type":54,"tag":84,"props":4287,"children":4289},{"className":4288},[],[4290],{"type":60,"value":4217},{"type":60,"value":4292},") — the\n",{"type":54,"tag":223,"props":4294,"children":4296},{"href":4295},"..\u002Fphysical-ai-datasets\u002FSKILL.md",[4297],{"type":54,"tag":84,"props":4298,"children":4300},{"className":4299},[],[4301],{"type":60,"value":174},{"type":60,"value":4303}," skill has the\ndownload recipe and toolkit pointers.",{"type":54,"tag":131,"props":4305,"children":4306},{},[4307,4309,4315,4316,4322,4324,4329,4330,4335],{"type":60,"value":4308},"Subset by time with ",{"type":54,"tag":84,"props":4310,"children":4312},{"className":4311},[],[4313],{"type":60,"value":4314},"--seek-sec",{"type":60,"value":521},{"type":54,"tag":84,"props":4317,"children":4319},{"className":4318},[],[4320],{"type":60,"value":4321},"--duration-sec",{"type":60,"value":4323},"; subset sensors with\n",{"type":54,"tag":84,"props":4325,"children":4327},{"className":4326},[],[4328],{"type":60,"value":2264},{"type":60,"value":521},{"type":54,"tag":84,"props":4331,"children":4333},{"className":4332},[],[4334],{"type":60,"value":2257},{"type":60,"value":4336}," (repeatable).",{"type":54,"tag":131,"props":4338,"children":4339},{},[4340,4345,4347,4353,4355,4361,4363,4371,4373,4379],{"type":54,"tag":76,"props":4341,"children":4342},{},[4343],{"type":60,"value":4344},"car2sim_6cam",{"type":60,"value":4346}," sim configs target CARLA sensor names; PAI exports use real\nHyperion IDs — when feeding NRE training, override ",{"type":54,"tag":84,"props":4348,"children":4350},{"className":4349},[],[4351],{"type":60,"value":4352},"dataset.camera_ids",{"type":60,"value":4354}," \u002F\n",{"type":54,"tag":84,"props":4356,"children":4358},{"className":4357},[],[4359],{"type":60,"value":4360},"dataset.lidar_ids",{"type":60,"value":4362}," on the NRE Hydra command line (see\n",{"type":54,"tag":223,"props":4364,"children":4365},{"href":1199},[4366],{"type":54,"tag":84,"props":4367,"children":4369},{"className":4368},[],[4370],{"type":60,"value":148},{"type":60,"value":4372}," Workflow A and ",{"type":54,"tag":84,"props":4374,"children":4376},{"className":4375},[],[4377],{"type":60,"value":4378},"references\u002Fconfiguration.md",{"type":60,"value":163},{"type":54,"tag":783,"props":4381,"children":4383},{"id":4382},"waymo-open",[4384],{"type":60,"value":303},{"type":54,"tag":70,"props":4386,"children":4387},{},[4388,4392,4394,4399],{"type":54,"tag":76,"props":4389,"children":4390},{},[4391],{"type":60,"value":3948},{"type":60,"value":4393}," Reads ",{"type":54,"tag":84,"props":4395,"children":4397},{"className":4396},[],[4398],{"type":60,"value":543},{"type":60,"value":4400}," segment files.",{"type":54,"tag":814,"props":4402,"children":4404},{"className":816,"code":4403,"language":818,"meta":819,"style":819},"bazel run \u002F\u002Ftools\u002Fdata_converter\u002Fwaymo:convert -- \\\n    --root-dir \u003CDIR_OF_TFRECORDS> \\\n    --output-dir \u003COUT> \\\n    waymo-v4 \\\n        --store-type itar \\\n        --profile separate-sensors \\\n        --world-global-mode localized   # or 'identity' \u002F 'none'\n",[4405],{"type":54,"tag":84,"props":4406,"children":4407},{"__ignoreMap":819},[4408,4432,4462,4489,4501,4516,4531],{"type":54,"tag":825,"props":4409,"children":4410},{"class":827,"line":828},[4411,4415,4419,4424,4428],{"type":54,"tag":825,"props":4412,"children":4413},{"style":1072},[4414],{"type":60,"value":747},{"type":54,"tag":825,"props":4416,"children":4417},{"style":854},[4418],{"type":60,"value":3977},{"type":54,"tag":825,"props":4420,"children":4421},{"style":854},[4422],{"type":60,"value":4423}," \u002F\u002Ftools\u002Fdata_converter\u002Fwaymo:convert",{"type":54,"tag":825,"props":4425,"children":4426},{"style":854},[4427],{"type":60,"value":3986},{"type":54,"tag":825,"props":4429,"children":4430},{"style":865},[4431],{"type":60,"value":3991},{"type":54,"tag":825,"props":4433,"children":4434},{"class":827,"line":838},[4435,4440,4444,4449,4454,4458],{"type":54,"tag":825,"props":4436,"children":4437},{"style":854},[4438],{"type":60,"value":4439},"    --root-dir",{"type":54,"tag":825,"props":4441,"children":4442},{"style":848},[4443],{"type":60,"value":4004},{"type":54,"tag":825,"props":4445,"children":4446},{"style":854},[4447],{"type":60,"value":4448},"DIR_OF_TFRECORD",{"type":54,"tag":825,"props":4450,"children":4451},{"style":865},[4452],{"type":60,"value":4453},"S",{"type":54,"tag":825,"props":4455,"children":4456},{"style":848},[4457],{"type":60,"value":4019},{"type":54,"tag":825,"props":4459,"children":4460},{"style":865},[4461],{"type":60,"value":3991},{"type":54,"tag":825,"props":4463,"children":4464},{"class":827,"line":2189},[4465,4469,4473,4477,4481,4485],{"type":54,"tag":825,"props":4466,"children":4467},{"style":854},[4468],{"type":60,"value":3999},{"type":54,"tag":825,"props":4470,"children":4471},{"style":848},[4472],{"type":60,"value":4004},{"type":54,"tag":825,"props":4474,"children":4475},{"style":854},[4476],{"type":60,"value":4009},{"type":54,"tag":825,"props":4478,"children":4479},{"style":865},[4480],{"type":60,"value":4014},{"type":54,"tag":825,"props":4482,"children":4483},{"style":848},[4484],{"type":60,"value":4019},{"type":54,"tag":825,"props":4486,"children":4487},{"style":865},[4488],{"type":60,"value":3991},{"type":54,"tag":825,"props":4490,"children":4491},{"class":827,"line":27},[4492,4497],{"type":54,"tag":825,"props":4493,"children":4494},{"style":854},[4495],{"type":60,"value":4496},"    waymo-v4",{"type":54,"tag":825,"props":4498,"children":4499},{"style":865},[4500],{"type":60,"value":3991},{"type":54,"tag":825,"props":4502,"children":4503},{"class":827,"line":2974},[4504,4508,4512],{"type":54,"tag":825,"props":4505,"children":4506},{"style":854},[4507],{"type":60,"value":4162},{"type":54,"tag":825,"props":4509,"children":4510},{"style":854},[4511],{"type":60,"value":4167},{"type":54,"tag":825,"props":4513,"children":4514},{"style":865},[4515],{"type":60,"value":3991},{"type":54,"tag":825,"props":4517,"children":4518},{"class":827,"line":2983},[4519,4523,4527],{"type":54,"tag":825,"props":4520,"children":4521},{"style":854},[4522],{"type":60,"value":4180},{"type":54,"tag":825,"props":4524,"children":4525},{"style":854},[4526],{"type":60,"value":4185},{"type":54,"tag":825,"props":4528,"children":4529},{"style":865},[4530],{"type":60,"value":3991},{"type":54,"tag":825,"props":4532,"children":4533},{"class":827,"line":2992},[4534,4539,4544],{"type":54,"tag":825,"props":4535,"children":4536},{"style":854},[4537],{"type":60,"value":4538},"        --world-global-mode",{"type":54,"tag":825,"props":4540,"children":4541},{"style":854},[4542],{"type":60,"value":4543}," localized",{"type":54,"tag":825,"props":4545,"children":4546},{"style":832},[4547],{"type":60,"value":4548},"   # or 'identity' \u002F 'none'\n",{"type":54,"tag":70,"props":4550,"children":4551},{},[4552],{"type":60,"value":4203},{"type":54,"tag":127,"props":4554,"children":4555},{},[4556,4604,4641,4669],{"type":54,"tag":131,"props":4557,"children":4558},{},[4559,4561,4567,4568,4574,4575,4581,4582,4588,4589,4595,4597,4603],{"type":60,"value":4560},"5 cameras (",{"type":54,"tag":84,"props":4562,"children":4564},{"className":4563},[],[4565],{"type":60,"value":4566},"camera_front_50fov",{"type":60,"value":1700},{"type":54,"tag":84,"props":4569,"children":4571},{"className":4570},[],[4572],{"type":60,"value":4573},"camera_front_left_50fov",{"type":60,"value":2244},{"type":54,"tag":84,"props":4576,"children":4578},{"className":4577},[],[4579],{"type":60,"value":4580},"camera_front_right_50fov",{"type":60,"value":1700},{"type":54,"tag":84,"props":4583,"children":4585},{"className":4584},[],[4586],{"type":60,"value":4587},"camera_side_left_50fov",{"type":60,"value":2244},{"type":54,"tag":84,"props":4590,"children":4592},{"className":4591},[],[4593],{"type":60,"value":4594},"camera_side_right_50fov",{"type":60,"value":4596},") + 1 top LiDAR (",{"type":54,"tag":84,"props":4598,"children":4600},{"className":4599},[],[4601],{"type":60,"value":4602},"lidar_top",{"type":60,"value":163},{"type":54,"tag":131,"props":4605,"children":4606},{},[4607,4609,4614,4616,4626,4628,4633,4635,4640],{"type":60,"value":4608},"Camera intrinsics → ",{"type":54,"tag":84,"props":4610,"children":4612},{"className":4611},[],[4613],{"type":60,"value":3789},{"type":60,"value":4615},". Waymo's local\ncamera frame is ",{"type":54,"tag":76,"props":4617,"children":4618},{},[4619,4624],{"type":54,"tag":84,"props":4620,"children":4622},{"className":4621},[],[4623],{"type":60,"value":1614},{"type":60,"value":4625}," principal axis",{"type":60,"value":4627},"; the converter rotates to NCore's\n",{"type":54,"tag":84,"props":4629,"children":4631},{"className":4630},[],[4632],{"type":60,"value":1630},{"type":60,"value":4634}," principal axis. If you re-derive extrinsics manually, apply the same\nrotation to ",{"type":54,"tag":84,"props":4636,"children":4638},{"className":4637},[],[4639],{"type":60,"value":3331},{"type":60,"value":99},{"type":54,"tag":131,"props":4642,"children":4643},{},[4644,4646,4652,4654,4660,4662,4668],{"type":60,"value":4645},"Cuboid classes: ",{"type":54,"tag":84,"props":4647,"children":4649},{"className":4648},[],[4650],{"type":60,"value":4651},"unknown, vehicle, pedestrian, sign, cyclist",{"type":60,"value":4653},". Map → NCore\n",{"type":54,"tag":84,"props":4655,"children":4657},{"className":4656},[],[4658],{"type":60,"value":4659},"class_id",{"type":60,"value":4661}," strings; tag ",{"type":54,"tag":84,"props":4663,"children":4665},{"className":4664},[],[4666],{"type":60,"value":4667},"LabelSource.EXTERNAL",{"type":60,"value":99},{"type":54,"tag":131,"props":4670,"children":4671},{},[4672,4674,4680],{"type":60,"value":4673},"Multi-return LiDAR (primary + secondary). Stack into the ",{"type":54,"tag":84,"props":4675,"children":4677},{"className":4676},[],[4678],{"type":60,"value":4679},"[R, N]",{"type":60,"value":4681}," distance \u002F\nintensity arrays.",{"type":54,"tag":783,"props":4683,"children":4685},{"id":4684},"pandaset",[4686],{"type":60,"value":312},{"type":54,"tag":70,"props":4688,"children":4689},{},[4690,4695],{"type":54,"tag":76,"props":4691,"children":4692},{},[4693],{"type":60,"value":4694},"No upstream converter — author with Path B.",{"type":60,"value":4696}," PandaSet (Hesai +\nScale-AI-labelled) ships JSON metadata with each sequence.",{"type":54,"tag":70,"props":4698,"children":4699},{},[4700],{"type":60,"value":4701},"Sensor inventory:",{"type":54,"tag":127,"props":4703,"children":4704},{},[4705,4760],{"type":54,"tag":131,"props":4706,"children":4707},{},[4708,4710,4716,4717,4723,4724,4730,4731,4737,4738,4744,4745,4751,4753,4759],{"type":60,"value":4709},"6 cameras (",{"type":54,"tag":84,"props":4711,"children":4713},{"className":4712},[],[4714],{"type":60,"value":4715},"front_camera",{"type":60,"value":1700},{"type":54,"tag":84,"props":4718,"children":4720},{"className":4719},[],[4721],{"type":60,"value":4722},"front_left_camera",{"type":60,"value":1700},{"type":54,"tag":84,"props":4725,"children":4727},{"className":4726},[],[4728],{"type":60,"value":4729},"front_right_camera",{"type":60,"value":2244},{"type":54,"tag":84,"props":4732,"children":4734},{"className":4733},[],[4735],{"type":60,"value":4736},"back_camera",{"type":60,"value":1700},{"type":54,"tag":84,"props":4739,"children":4741},{"className":4740},[],[4742],{"type":60,"value":4743},"left_camera",{"type":60,"value":1700},{"type":54,"tag":84,"props":4746,"children":4748},{"className":4747},[],[4749],{"type":60,"value":4750},"right_camera",{"type":60,"value":4752},") — pinhole, global shutter.\nIntrinsics in ",{"type":54,"tag":84,"props":4754,"children":4756},{"className":4755},[],[4757],{"type":60,"value":4758},"meta\u002Fintrinsics\u002F\u003Cid>.json",{"type":60,"value":99},{"type":54,"tag":131,"props":4761,"children":4762},{},[4763,4765],{"type":60,"value":4764},"2 LiDARs:\n",{"type":54,"tag":127,"props":4766,"children":4767},{},[4768,4786],{"type":54,"tag":131,"props":4769,"children":4770},{},[4771,4777,4779,4784],{"type":54,"tag":84,"props":4772,"children":4774},{"className":4773},[],[4775],{"type":60,"value":4776},"front_lidar",{"type":60,"value":4778},": Hesai PandarGT (mechanical, 60° HFOV, 150° VFOV\nforward-facing). Treat as a partial spinning sensor (",{"type":54,"tag":84,"props":4780,"children":4782},{"className":4781},[],[4783],{"type":60,"value":1713},{"type":60,"value":4785},"\nspans the 60° wedge).",{"type":54,"tag":131,"props":4787,"children":4788},{},[4789,4795,4797,4806,4808,4813,4815,4821],{"type":54,"tag":84,"props":4790,"children":4792},{"className":4791},[],[4793],{"type":60,"value":4794},"top_lidar",{"type":60,"value":4796}," (key sensor for AV reconstruction): Hesai Pandar64,\n",{"type":54,"tag":76,"props":4798,"children":4799},{},[4800],{"type":54,"tag":84,"props":4801,"children":4803},{"className":4802},[],[4804],{"type":60,"value":4805},"spinning_direction=\"cw\"",{"type":60,"value":4807},", 64 beams with ",{"type":54,"tag":76,"props":4809,"children":4810},{},[4811],{"type":60,"value":4812},"non-uniform",{"type":60,"value":4814}," elevations\n(Pandar64 datasheet table — copy the 64 angles, sort descending),\n",{"type":54,"tag":84,"props":4816,"children":4818},{"className":4817},[],[4819],{"type":60,"value":4820},"row_azimuth_offsets_rad = zeros(64)",{"type":60,"value":4822},", 1800 columns.",{"type":54,"tag":70,"props":4824,"children":4825},{},[4826],{"type":60,"value":4827},"Data layout per sequence (extract):",{"type":54,"tag":814,"props":4829,"children":4833},{"className":4830,"code":4832,"language":60,"meta":819},[4831],"language-text","\u003Cseq_id>\u002F\n├── meta\u002F\n│   ├── intrinsics\u002F\u003Ccamera_id>.json     # focal, principal point, distortion\n│   ├── timestamps.json                 # per-camera-frame µs\n│   └── poses.json                      # per-frame ego pose (UTM)\n├── camera\u002F\u003Ccamera_id>\u002F\u003Cframe>.jpg\n├── camera\u002F\u003Ccamera_id>\u002Fposes.json       # per-frame camera pose in world\n├── lidar\u002F\u003Cframe>.pkl.gz                # XYZ + intensity + timestamp + ring\n└── cuboids\u002F\u003Cframe>.pkl.gz              # bottom-center xyz + dim + yaw\n",[4834],{"type":54,"tag":84,"props":4835,"children":4836},{"__ignoreMap":819},[4837],{"type":60,"value":4832},{"type":54,"tag":70,"props":4839,"children":4840},{},[4841],{"type":60,"value":4842},"Conversion checklist:",{"type":54,"tag":127,"props":4844,"children":4845},{},[4846,4858,4885,4921,4954],{"type":54,"tag":131,"props":4847,"children":4848},{},[4849,4851,4856],{"type":60,"value":4850},"Pose trajectory: union of ",{"type":54,"tag":76,"props":4852,"children":4853},{},[4854],{"type":60,"value":4855},"per-camera per-frame",{"type":60,"value":4857}," poses (6 × ~80 = ~480\nwaypoints) and per-LiDAR-frame poses, deduped + sorted, re-referenced to\nthe first ego pose.",{"type":54,"tag":131,"props":4859,"children":4860},{},[4861,4863,4868,4870,4875,4877,4883],{"type":60,"value":4862},"LiDAR points are ",{"type":54,"tag":76,"props":4864,"children":4865},{},[4866],{"type":60,"value":4867},"world-frame XYZ already ego-compensated",{"type":60,"value":4869}," → run\n",{"type":54,"tag":84,"props":4871,"children":4873},{"className":4872},[],[4874],{"type":60,"value":3470},{"type":60,"value":4876}," to recover sensor-frame\nper-ray XYZ, then normalise to direction. Per-ray µs from the ",{"type":54,"tag":84,"props":4878,"children":4880},{"className":4879},[],[4881],{"type":60,"value":4882},"timestamp",{"type":60,"value":4884},"\ncolumn.",{"type":54,"tag":131,"props":4886,"children":4887},{},[4888,4890,4896,4898,4904,4906,4912,4914,4919],{"type":60,"value":4889},"Map raw Pandar64 ",{"type":54,"tag":84,"props":4891,"children":4893},{"className":4892},[],[4894],{"type":60,"value":4895},"ring",{"type":60,"value":4897}," → NCore ",{"type":54,"tag":84,"props":4899,"children":4901},{"className":4900},[],[4902],{"type":60,"value":4903},"model_element[:, 0]",{"type":60,"value":4905}," via a\n",{"type":54,"tag":84,"props":4907,"children":4909},{"className":4908},[],[4910],{"type":60,"value":4911},"ring_id → row_index",{"type":60,"value":4913}," permutation that sorts elevations ",{"type":54,"tag":76,"props":4915,"children":4916},{},[4917],{"type":60,"value":4918},"descending",{"type":60,"value":4920}," (raw\nring IDs are firing order, not beam index).",{"type":54,"tag":131,"props":4922,"children":4923},{},[4924,4926,4931,4932,4938,4940,4946,4948,4953],{"type":60,"value":4925},"Cuboids: ",{"type":54,"tag":76,"props":4927,"children":4928},{},[4929],{"type":60,"value":4930},"bottom-center → geometric center",{"type":60,"value":513},{"type":54,"tag":84,"props":4933,"children":4935},{"className":4934},[],[4936],{"type":60,"value":4937},"centroid_z += dim_z\u002F2",{"type":60,"value":4939},").\nYaw-only rotation → ",{"type":54,"tag":84,"props":4941,"children":4943},{"className":4942},[],[4944],{"type":60,"value":4945},"rot=(0, 0, yaw_rad)",{"type":60,"value":4947},". ",{"type":54,"tag":84,"props":4949,"children":4951},{"className":4950},[],[4952],{"type":60,"value":4667},{"type":60,"value":99},{"type":54,"tag":131,"props":4955,"children":4956},{},[4957,4959,4965,4967,4973],{"type":60,"value":4958},"Cameras: global shutter (",{"type":54,"tag":84,"props":4960,"children":4962},{"className":4961},[],[4963],{"type":60,"value":4964},"ShutterType.GLOBAL",{"type":60,"value":4966},"). ",{"type":54,"tag":84,"props":4968,"children":4970},{"className":4969},[],[4971],{"type":60,"value":4972},"frame_timestamps_us = [t, t]",{"type":60,"value":99},{"type":54,"tag":783,"props":4975,"children":4977},{"id":4976},"nuscenes",[4978],{"type":60,"value":321},{"type":54,"tag":70,"props":4980,"children":4981},{},[4982,4986,4988,4994,4995,5001,5002,5008,5009,5015,5016,5022,5023,5029,5030,5036],{"type":54,"tag":76,"props":4983,"children":4984},{},[4985],{"type":60,"value":4694},{"type":60,"value":4987}," NuScenes ships nested JSON\ntables (",{"type":54,"tag":84,"props":4989,"children":4991},{"className":4990},[],[4992],{"type":60,"value":4993},"sample",{"type":60,"value":1700},{"type":54,"tag":84,"props":4996,"children":4998},{"className":4997},[],[4999],{"type":60,"value":5000},"sample_data",{"type":60,"value":1700},{"type":54,"tag":84,"props":5003,"children":5005},{"className":5004},[],[5006],{"type":60,"value":5007},"ego_pose",{"type":60,"value":1700},{"type":54,"tag":84,"props":5010,"children":5012},{"className":5011},[],[5013],{"type":60,"value":5014},"calibrated_sensor",{"type":60,"value":1700},{"type":54,"tag":84,"props":5017,"children":5019},{"className":5018},[],[5020],{"type":60,"value":5021},"sensor",{"type":60,"value":2244},{"type":54,"tag":84,"props":5024,"children":5026},{"className":5025},[],[5027],{"type":60,"value":5028},"sample_annotation",{"type":60,"value":1700},{"type":54,"tag":84,"props":5031,"children":5033},{"className":5032},[],[5034],{"type":60,"value":5035},"instance",{"type":60,"value":163},{"type":54,"tag":70,"props":5038,"children":5039},{},[5040],{"type":60,"value":4701},{"type":54,"tag":127,"props":5042,"children":5043},{},[5044,5091,5121],{"type":54,"tag":131,"props":5045,"children":5046},{},[5047,5048,5054,5055,5061,5062,5068,5069,5075,5076,5082,5083,5089],{"type":60,"value":4709},{"type":54,"tag":84,"props":5049,"children":5051},{"className":5050},[],[5052],{"type":60,"value":5053},"CAM_FRONT",{"type":60,"value":1700},{"type":54,"tag":84,"props":5056,"children":5058},{"className":5057},[],[5059],{"type":60,"value":5060},"CAM_FRONT_LEFT",{"type":60,"value":1700},{"type":54,"tag":84,"props":5063,"children":5065},{"className":5064},[],[5066],{"type":60,"value":5067},"CAM_FRONT_RIGHT",{"type":60,"value":1700},{"type":54,"tag":84,"props":5070,"children":5072},{"className":5071},[],[5073],{"type":60,"value":5074},"CAM_BACK",{"type":60,"value":2244},{"type":54,"tag":84,"props":5077,"children":5079},{"className":5078},[],[5080],{"type":60,"value":5081},"CAM_BACK_LEFT",{"type":60,"value":1700},{"type":54,"tag":84,"props":5084,"children":5086},{"className":5085},[],[5087],{"type":60,"value":5088},"CAM_BACK_RIGHT",{"type":60,"value":5090},") — pinhole. Rolling shutter; consult the\ndevice datasheet for shutter direction (rename to lowercase NCore IDs).",{"type":54,"tag":131,"props":5092,"children":5093},{},[5094,5096,5102,5104,5112,5114,5120],{"type":60,"value":5095},"1 LiDAR (",{"type":54,"tag":84,"props":5097,"children":5099},{"className":5098},[],[5100],{"type":60,"value":5101},"LIDAR_TOP",{"type":60,"value":5103},"): Velodyne HDL-32E, ",{"type":54,"tag":76,"props":5105,"children":5106},{},[5107],{"type":54,"tag":84,"props":5108,"children":5110},{"className":5109},[],[5111],{"type":60,"value":4805},{"type":60,"value":5113},",\n32 beams, 1800 columns at 0.2°. Use VLP\u002FHDL-32 datasheet elevations\n(descending). ",{"type":54,"tag":84,"props":5115,"children":5117},{"className":5116},[],[5118],{"type":60,"value":5119},"row_azimuth_offsets_rad = zeros(32)",{"type":60,"value":99},{"type":54,"tag":131,"props":5122,"children":5123},{},[5124,5126,5132,5133,5139,5140,5146,5147,5153,5154,5160],{"type":60,"value":5125},"5 radars (",{"type":54,"tag":84,"props":5127,"children":5129},{"className":5128},[],[5130],{"type":60,"value":5131},"RADAR_FRONT",{"type":60,"value":1700},{"type":54,"tag":84,"props":5134,"children":5136},{"className":5135},[],[5137],{"type":60,"value":5138},"RADAR_FRONT_LEFT",{"type":60,"value":1700},{"type":54,"tag":84,"props":5141,"children":5143},{"className":5142},[],[5144],{"type":60,"value":5145},"RADAR_FRONT_RIGHT",{"type":60,"value":2244},{"type":54,"tag":84,"props":5148,"children":5150},{"className":5149},[],[5151],{"type":60,"value":5152},"RADAR_BACK_LEFT",{"type":60,"value":1700},{"type":54,"tag":84,"props":5155,"children":5157},{"className":5156},[],[5158],{"type":60,"value":5159},"RADAR_BACK_RIGHT",{"type":60,"value":5161},"). Continental ARS 408. Optional —\nNuRec ignores radar.",{"type":54,"tag":70,"props":5163,"children":5164},{},[5165],{"type":60,"value":4842},{"type":54,"tag":127,"props":5167,"children":5168},{},[5169,5188,5208,5218,5251,5278,5342],{"type":54,"tag":131,"props":5170,"children":5171},{},[5172,5174,5179,5181,5186],{"type":60,"value":5173},"A NuScenes \"scene\" → one V4 sequence. Iterate ",{"type":54,"tag":84,"props":5175,"children":5177},{"className":5176},[],[5178],{"type":60,"value":4993},{"type":60,"value":5180},"s in the scene to\nenumerate ",{"type":54,"tag":84,"props":5182,"children":5184},{"className":5183},[],[5185],{"type":60,"value":5000},{"type":60,"value":5187}," per sensor.",{"type":54,"tag":131,"props":5189,"children":5190},{},[5191,5193,5199,5201,5206],{"type":60,"value":5192},"Timestamps in ",{"type":54,"tag":84,"props":5194,"children":5196},{"className":5195},[],[5197],{"type":60,"value":5198},"sample_data.timestamp",{"type":60,"value":5200}," are ",{"type":54,"tag":76,"props":5202,"children":5203},{},[5204],{"type":60,"value":5205},"µs",{"type":60,"value":5207}," already.",{"type":54,"tag":131,"props":5209,"children":5210},{},[5211,5216],{"type":54,"tag":84,"props":5212,"children":5214},{"className":5213},[],[5215],{"type":60,"value":5007},{"type":60,"value":5217}," is rig→world (translation + quaternion). Build the dense\ntrajectory from the union of ego_pose entries across all sample_data\n(cameras at 12 Hz, LiDAR at 20 Hz, radars at 13 Hz → ~50 ms spacing).",{"type":54,"tag":131,"props":5219,"children":5220},{},[5221,5227,5229,5235,5236,5241,5243,5249],{"type":54,"tag":84,"props":5222,"children":5224},{"className":5223},[],[5225],{"type":60,"value":5226},"calibrated_sensor.translation",{"type":60,"value":5228}," + ",{"type":54,"tag":84,"props":5230,"children":5232},{"className":5231},[],[5233],{"type":60,"value":5234},".rotation",{"type":60,"value":3638},{"type":54,"tag":84,"props":5237,"children":5239},{"className":5238},[],[5240],{"type":60,"value":1314},{"type":60,"value":5242}," (named\n",{"type":54,"tag":84,"props":5244,"children":5246},{"className":5245},[],[5247],{"type":60,"value":5248},"T_calib",{"type":60,"value":5250}," in their docs — verify direction by transforming a sensor-frame\ntest point and checking it lands in the expected rig position).",{"type":54,"tag":131,"props":5252,"children":5253},{},[5254,5255,5261,5263,5269,5271,5277],{"type":60,"value":3207},{"type":54,"tag":84,"props":5256,"children":5258},{"className":5257},[],[5259],{"type":60,"value":5260},".pcd.bin",{"type":60,"value":5262}," files are already-ego-compensated sensor-frame XYZ + ring\nindex + intensity. Per-ray timestamps are not stored — synthesise from\n",{"type":54,"tag":84,"props":5264,"children":5266},{"className":5265},[],[5267],{"type":60,"value":5268},"column_index",{"type":60,"value":5270}," (azimuth bin) and the sweep duration (50 ms at 20 Hz):\n",{"type":54,"tag":84,"props":5272,"children":5274},{"className":5273},[],[5275],{"type":60,"value":5276},"t_ray = sweep_start + (azim_bin \u002F 1800) * sweep_duration",{"type":60,"value":99},{"type":54,"tag":131,"props":5279,"children":5280},{},[5281,5286,5288,5301,5302,5308,5310,5316,5317,5322,5323,5329,5330,5335,5336,5341],{"type":54,"tag":84,"props":5282,"children":5284},{"className":5283},[],[5285],{"type":60,"value":5028},{"type":60,"value":5287},": bottom-of-box origin → ",{"type":54,"tag":76,"props":5289,"children":5290},{},[5291,5293,5299],{"type":60,"value":5292},"add ",{"type":54,"tag":84,"props":5294,"children":5296},{"className":5295},[],[5297],{"type":60,"value":5298},"size[2]\u002F2",{"type":60,"value":5300}," to z",{"type":60,"value":3713},{"type":54,"tag":84,"props":5303,"children":5305},{"className":5304},[],[5306],{"type":60,"value":5307},"rotation",{"type":60,"value":5309}," quaternion → XYZ-Euler radians. ",{"type":54,"tag":84,"props":5311,"children":5313},{"className":5312},[],[5314],{"type":60,"value":5315},"instance_token",{"type":60,"value":2660},{"type":54,"tag":84,"props":5318,"children":5320},{"className":5319},[],[5321],{"type":60,"value":3914},{"type":60,"value":2244},{"type":54,"tag":84,"props":5324,"children":5326},{"className":5325},[],[5327],{"type":60,"value":5328},"category_name",{"type":60,"value":2660},{"type":54,"tag":84,"props":5331,"children":5333},{"className":5332},[],[5334],{"type":60,"value":4659},{"type":60,"value":4947},{"type":54,"tag":84,"props":5337,"children":5339},{"className":5338},[],[5340],{"type":60,"value":4667},{"type":60,"value":99},{"type":54,"tag":131,"props":5343,"children":5344},{},[5345],{"type":60,"value":5346},"Ego masks: NuScenes does not ship them. Generate via SAM2 \u002F off-the-shelf\nego segmentation per camera — strongly recommended for NuRec quality.",{"type":54,"tag":452,"props":5348,"children":5349},{},[],{"type":54,"tag":63,"props":5351,"children":5353},{"id":5352},"format-recipes-non-av-sensor-only",[5354],{"type":60,"value":330},{"type":54,"tag":70,"props":5356,"children":5357},{},[5358,5360,5365,5366,5371,5372,5377],{"type":60,"value":5359},"These do not have a vehicle rig; pick a body-fixed origin and apply the same\nrig conventions (",{"type":54,"tag":84,"props":5361,"children":5363},{"className":5362},[],[5364],{"type":60,"value":1614},{"type":60,"value":1616},{"type":54,"tag":84,"props":5367,"children":5369},{"className":5368},[],[5370],{"type":60,"value":1622},{"type":60,"value":1624},{"type":54,"tag":84,"props":5373,"children":5375},{"className":5374},[],[5376],{"type":60,"value":1630},{"type":60,"value":5378}," up).",{"type":54,"tag":783,"props":5380,"children":5382},{"id":5381},"mono-camera-no-depth-no-lidar-colmap-track",[5383],{"type":60,"value":342},{"type":54,"tag":70,"props":5385,"children":5386},{},[5387],{"type":60,"value":5388},"You only have RGB images. Run COLMAP first to produce poses + sparse points,\nthen feed COLMAP into the upstream converter:",{"type":54,"tag":814,"props":5390,"children":5392},{"className":816,"code":5391,"language":818,"meta":819,"style":819},"colmap automatic_reconstructor \\\n    --workspace_path \u003CSCENE> --image_path \u003CSCENE>\u002Fimages \\\n    --camera_model OPENCV --single_camera 1\nbazel run \u002F\u002Ftools\u002Fdata_converter\u002Fcolmap:convert -- \\\n    --root-dir \u003CSCENE> --output-dir \u003COUT> \\\n    colmap-v4 --include-3d-points --start-time-sec 0\n",[5393],{"type":54,"tag":84,"props":5394,"children":5395},{"__ignoreMap":819},[5396,5413,5469,5492,5516,5564],{"type":54,"tag":825,"props":5397,"children":5398},{"class":827,"line":828},[5399,5404,5409],{"type":54,"tag":825,"props":5400,"children":5401},{"style":1072},[5402],{"type":60,"value":5403},"colmap",{"type":54,"tag":825,"props":5405,"children":5406},{"style":854},[5407],{"type":60,"value":5408}," automatic_reconstructor",{"type":54,"tag":825,"props":5410,"children":5411},{"style":865},[5412],{"type":60,"value":3991},{"type":54,"tag":825,"props":5414,"children":5415},{"class":827,"line":838},[5416,5421,5425,5430,5435,5439,5444,5448,5452,5456,5460,5465],{"type":54,"tag":825,"props":5417,"children":5418},{"style":854},[5419],{"type":60,"value":5420},"    --workspace_path",{"type":54,"tag":825,"props":5422,"children":5423},{"style":848},[5424],{"type":60,"value":4004},{"type":54,"tag":825,"props":5426,"children":5427},{"style":854},[5428],{"type":60,"value":5429},"SCEN",{"type":54,"tag":825,"props":5431,"children":5432},{"style":865},[5433],{"type":60,"value":5434},"E",{"type":54,"tag":825,"props":5436,"children":5437},{"style":848},[5438],{"type":60,"value":4019},{"type":54,"tag":825,"props":5440,"children":5441},{"style":854},[5442],{"type":60,"value":5443}," --image_path",{"type":54,"tag":825,"props":5445,"children":5446},{"style":848},[5447],{"type":60,"value":4004},{"type":54,"tag":825,"props":5449,"children":5450},{"style":854},[5451],{"type":60,"value":5429},{"type":54,"tag":825,"props":5453,"children":5454},{"style":865},[5455],{"type":60,"value":5434},{"type":54,"tag":825,"props":5457,"children":5458},{"style":848},[5459],{"type":60,"value":4019},{"type":54,"tag":825,"props":5461,"children":5462},{"style":854},[5463],{"type":60,"value":5464},"\u002Fimages",{"type":54,"tag":825,"props":5466,"children":5467},{"style":865},[5468],{"type":60,"value":3991},{"type":54,"tag":825,"props":5470,"children":5471},{"class":827,"line":2189},[5472,5477,5482,5487],{"type":54,"tag":825,"props":5473,"children":5474},{"style":854},[5475],{"type":60,"value":5476},"    --camera_model",{"type":54,"tag":825,"props":5478,"children":5479},{"style":854},[5480],{"type":60,"value":5481}," OPENCV",{"type":54,"tag":825,"props":5483,"children":5484},{"style":854},[5485],{"type":60,"value":5486}," --single_camera",{"type":54,"tag":825,"props":5488,"children":5489},{"style":1109},[5490],{"type":60,"value":5491}," 1\n",{"type":54,"tag":825,"props":5493,"children":5494},{"class":827,"line":27},[5495,5499,5503,5508,5512],{"type":54,"tag":825,"props":5496,"children":5497},{"style":1072},[5498],{"type":60,"value":747},{"type":54,"tag":825,"props":5500,"children":5501},{"style":854},[5502],{"type":60,"value":3977},{"type":54,"tag":825,"props":5504,"children":5505},{"style":854},[5506],{"type":60,"value":5507}," \u002F\u002Ftools\u002Fdata_converter\u002Fcolmap:convert",{"type":54,"tag":825,"props":5509,"children":5510},{"style":854},[5511],{"type":60,"value":3986},{"type":54,"tag":825,"props":5513,"children":5514},{"style":865},[5515],{"type":60,"value":3991},{"type":54,"tag":825,"props":5517,"children":5518},{"class":827,"line":2974},[5519,5523,5527,5531,5535,5539,5544,5548,5552,5556,5560],{"type":54,"tag":825,"props":5520,"children":5521},{"style":854},[5522],{"type":60,"value":4439},{"type":54,"tag":825,"props":5524,"children":5525},{"style":848},[5526],{"type":60,"value":4004},{"type":54,"tag":825,"props":5528,"children":5529},{"style":854},[5530],{"type":60,"value":5429},{"type":54,"tag":825,"props":5532,"children":5533},{"style":865},[5534],{"type":60,"value":5434},{"type":54,"tag":825,"props":5536,"children":5537},{"style":848},[5538],{"type":60,"value":4019},{"type":54,"tag":825,"props":5540,"children":5541},{"style":854},[5542],{"type":60,"value":5543}," --output-dir",{"type":54,"tag":825,"props":5545,"children":5546},{"style":848},[5547],{"type":60,"value":4004},{"type":54,"tag":825,"props":5549,"children":5550},{"style":854},[5551],{"type":60,"value":4009},{"type":54,"tag":825,"props":5553,"children":5554},{"style":865},[5555],{"type":60,"value":4014},{"type":54,"tag":825,"props":5557,"children":5558},{"style":848},[5559],{"type":60,"value":4019},{"type":54,"tag":825,"props":5561,"children":5562},{"style":865},[5563],{"type":60,"value":3991},{"type":54,"tag":825,"props":5565,"children":5566},{"class":827,"line":2983},[5567,5572,5577,5582],{"type":54,"tag":825,"props":5568,"children":5569},{"style":854},[5570],{"type":60,"value":5571},"    colmap-v4",{"type":54,"tag":825,"props":5573,"children":5574},{"style":854},[5575],{"type":60,"value":5576}," --include-3d-points",{"type":54,"tag":825,"props":5578,"children":5579},{"style":854},[5580],{"type":60,"value":5581}," --start-time-sec",{"type":54,"tag":825,"props":5583,"children":5584},{"style":1109},[5585],{"type":60,"value":5586}," 0\n",{"type":54,"tag":70,"props":5588,"children":5589},{},[5590],{"type":60,"value":4203},{"type":54,"tag":127,"props":5592,"children":5593},{},[5594,5607,5619,5638],{"type":54,"tag":131,"props":5595,"children":5596},{},[5597,5599,5605],{"type":60,"value":5598},"COLMAP timestamps are synthetic (1 FPS by default; tune with\n",{"type":54,"tag":84,"props":5600,"children":5602},{"className":5601},[],[5603],{"type":60,"value":5604},"--start-time-sec",{"type":60,"value":5606}," and the FPS embedded in your image filenames).",{"type":54,"tag":131,"props":5608,"children":5609},{},[5610,5612,5617],{"type":60,"value":5611},"The COLMAP camera frame already matches NCore (",{"type":54,"tag":84,"props":5613,"children":5615},{"className":5614},[],[5616],{"type":60,"value":1630},{"type":60,"value":5618}," optical) — no rotation\nrequired.",{"type":54,"tag":131,"props":5620,"children":5621},{},[5622,5624,5629,5631,5636],{"type":60,"value":5623},"SfM points become a ",{"type":54,"tag":84,"props":5625,"children":5627},{"className":5626},[],[5628],{"type":60,"value":1590},{"type":60,"value":5630}," named ",{"type":54,"tag":84,"props":5632,"children":5634},{"className":5633},[],[5635],{"type":60,"value":1579},{"type":60,"value":5637},". Use this when\nno LiDAR is available so NuRec has a sparse geometric prior.",{"type":54,"tag":131,"props":5639,"children":5640},{},[5641,5643,5649,5651,5657],{"type":60,"value":5642},"Ego masks (",{"type":54,"tag":84,"props":5644,"children":5646},{"className":5645},[],[5647],{"type":60,"value":5648},"\u003Cimage_basename>_mask.png",{"type":60,"value":5650}," next to images, or ",{"type":54,"tag":84,"props":5652,"children":5654},{"className":5653},[],[5655],{"type":60,"value":5656},"--masks-dir",{"type":60,"value":163},{"type":54,"tag":783,"props":5659,"children":5661},{"id":5660},"stereo-cameras",[5662],{"type":60,"value":351},{"type":54,"tag":70,"props":5664,"children":5665},{},[5666],{"type":60,"value":5667},"Two synchronised cameras at known baseline. No LiDAR.",{"type":54,"tag":127,"props":5669,"children":5670},{},[5671,5681,5721,5737,5782],{"type":54,"tag":131,"props":5672,"children":5673},{},[5674,5679],{"type":54,"tag":76,"props":5675,"children":5676},{},[5677],{"type":60,"value":5678},"Rig origin",{"type":60,"value":5680},": midpoint between the two camera optical centres (or the left\ncamera — pick one and stay consistent).",{"type":54,"tag":131,"props":5682,"children":5683},{},[5684,5689,5690,5696,5697,5703,5705,5711,5713,5719],{"type":54,"tag":76,"props":5685,"children":5686},{},[5687],{"type":60,"value":5688},"Static extrinsics",{"type":60,"value":1608},{"type":54,"tag":84,"props":5691,"children":5693},{"className":5692},[],[5694],{"type":60,"value":5695},"T_left_rig",{"type":60,"value":1700},{"type":54,"tag":84,"props":5698,"children":5700},{"className":5699},[],[5701],{"type":60,"value":5702},"T_right_rig",{"type":60,"value":5704}," from your stereo calibration\n(OpenCV ",{"type":54,"tag":84,"props":5706,"children":5708},{"className":5707},[],[5709],{"type":60,"value":5710},"stereoCalibrate",{"type":60,"value":5712}," outputs ",{"type":54,"tag":84,"props":5714,"children":5716},{"className":5715},[],[5717],{"type":60,"value":5718},"R, T",{"type":60,"value":5720}," from right-to-left → invert\u002Fcompose\nto get rig-relative).",{"type":54,"tag":131,"props":5722,"children":5723},{},[5724,5729,5731,5736],{"type":54,"tag":76,"props":5725,"children":5726},{},[5727],{"type":60,"value":5728},"Trajectory",{"type":60,"value":5730},": stereo-VIO (ORB-SLAM3, OpenVSLAM) or COLMAP run on left\nimages → propagate to rig with ",{"type":54,"tag":84,"props":5732,"children":5734},{"className":5733},[],[5735],{"type":60,"value":5695},{"type":60,"value":99},{"type":54,"tag":131,"props":5738,"children":5739},{},[5740,5745,5747],{"type":54,"tag":76,"props":5741,"children":5742},{},[5743],{"type":60,"value":5744},"No LiDAR component.",{"type":60,"value":5746}," Two options:\n",{"type":54,"tag":216,"props":5748,"children":5749},{},[5750,5763],{"type":54,"tag":131,"props":5751,"children":5752},{},[5753,5755,5761],{"type":60,"value":5754},"Skip LiDAR entirely (set ",{"type":54,"tag":84,"props":5756,"children":5758},{"className":5757},[],[5759],{"type":60,"value":5760},"lidar_ids = []",{"type":60,"value":5762},"). NuRec falls back to\nimage-only reconstruction (lower quality, more views needed).",{"type":54,"tag":131,"props":5764,"children":5765},{},[5766,5768,5773,5775,5780],{"type":60,"value":5767},"Compute disparity per stereo pair → 3-D point cloud per frame in the\nleft-camera frame → write as a ",{"type":54,"tag":84,"props":5769,"children":5771},{"className":5770},[],[5772],{"type":60,"value":1590},{"type":60,"value":5774}," per frame\n(analogous to COLMAP ",{"type":54,"tag":84,"props":5776,"children":5778},{"className":5777},[],[5779],{"type":60,"value":1579},{"type":60,"value":5781}," but dense). This gives NuRec a\ngeometric prior without faking a spinning LiDAR.",{"type":54,"tag":131,"props":5783,"children":5784},{},[5785],{"type":60,"value":5786},"Ego masks: render or hand-paint a static mask of the rig body if visible in\nthe FOV.",{"type":54,"tag":783,"props":5788,"children":5790},{"id":5789},"multi-stereo-rig-surround-stereo",[5791],{"type":60,"value":360},{"type":54,"tag":70,"props":5793,"children":5794},{},[5795],{"type":60,"value":5796},"Multiple synchronised stereo pairs on one rig (e.g. NVIDIA Hyperion 8.1\nsurround stereo, AV1, custom inspection robots). Each pair feeds Foundation\nStereo independently to produce dense depth around the platform.",{"type":54,"tag":127,"props":5798,"children":5799},{},[5800,5831,6114,6126,6165],{"type":54,"tag":131,"props":5801,"children":5802},{},[5803,5805,5810,5811,5816,5818,5823,5825,5829],{"type":60,"value":5804},"Encode ",{"type":54,"tag":76,"props":5806,"children":5807},{},[5808],{"type":60,"value":5809},"each camera as its own",{"type":60,"value":1437},{"type":54,"tag":84,"props":5812,"children":5814},{"className":5813},[],[5815],{"type":60,"value":1391},{"type":60,"value":5817}," with a standard\n",{"type":54,"tag":84,"props":5819,"children":5821},{"className":5820},[],[5822],{"type":60,"value":3331},{"type":60,"value":5824}," extrinsic — do ",{"type":54,"tag":76,"props":5826,"children":5827},{},[5828],{"type":60,"value":3111},{"type":60,"value":5830}," pre-rectify or fuse a pair into a\nsingle virtual sensor. NCore does not have a \"stereo pair\" component\ntype; pairing is metadata, not structure.",{"type":54,"tag":131,"props":5832,"children":5833},{},[5834,5836,5841,5842,5847,5849],{"type":60,"value":5835},"Declare the pairings on the ",{"type":54,"tag":76,"props":5837,"children":5838},{},[5839],{"type":60,"value":5840},"sequence-level",{"type":60,"value":1437},{"type":54,"tag":84,"props":5843,"children":5845},{"className":5844},[],[5846],{"type":60,"value":1822},{"type":60,"value":5848}," so\ndownstream tools (Foundation Stereo, NuRec aux-data) can discover them:",{"type":54,"tag":814,"props":5850,"children":5852},{"className":1848,"code":5851,"language":1850,"meta":819,"style":819},"{\"stereo_pairs\": [\n    {\"left\": \"camera_front_left\",  \"right\": \"camera_front_right\"},\n    {\"left\": \"camera_rear_left\",   \"right\": \"camera_rear_right\"},\n    {\"left\": \"camera_side_left_a\", \"right\": \"camera_side_left_b\"}\n]}\n",[5853],{"type":54,"tag":84,"props":5854,"children":5855},{"__ignoreMap":819},[5856,5884,5958,6032,6106],{"type":54,"tag":825,"props":5857,"children":5858},{"class":827,"line":828},[5859,5863,5867,5871,5875,5879],{"type":54,"tag":825,"props":5860,"children":5861},{"style":848},[5862],{"type":60,"value":1862},{"type":54,"tag":825,"props":5864,"children":5865},{"style":848},[5866],{"type":60,"value":976},{"type":54,"tag":825,"props":5868,"children":5869},{"style":1869},[5870],{"type":60,"value":1872},{"type":54,"tag":825,"props":5872,"children":5873},{"style":848},[5874],{"type":60,"value":976},{"type":54,"tag":825,"props":5876,"children":5877},{"style":848},[5878],{"type":60,"value":872},{"type":54,"tag":825,"props":5880,"children":5881},{"style":848},[5882],{"type":60,"value":5883}," [\n",{"type":54,"tag":825,"props":5885,"children":5886},{"class":827,"line":838},[5887,5892,5896,5900,5904,5908,5912,5916,5920,5924,5929,5933,5937,5941,5945,5949,5953],{"type":54,"tag":825,"props":5888,"children":5889},{"style":848},[5890],{"type":60,"value":5891},"    {",{"type":54,"tag":825,"props":5893,"children":5894},{"style":848},[5895],{"type":60,"value":976},{"type":54,"tag":825,"props":5897,"children":5898},{"style":1072},[5899],{"type":60,"value":1894},{"type":54,"tag":825,"props":5901,"children":5902},{"style":848},[5903],{"type":60,"value":976},{"type":54,"tag":825,"props":5905,"children":5906},{"style":848},[5907],{"type":60,"value":872},{"type":54,"tag":825,"props":5909,"children":5910},{"style":848},[5911],{"type":60,"value":851},{"type":54,"tag":825,"props":5913,"children":5914},{"style":854},[5915],{"type":60,"value":1911},{"type":54,"tag":825,"props":5917,"children":5918},{"style":848},[5919],{"type":60,"value":976},{"type":54,"tag":825,"props":5921,"children":5922},{"style":848},[5923],{"type":60,"value":1920},{"type":54,"tag":825,"props":5925,"children":5926},{"style":848},[5927],{"type":60,"value":5928},"  \"",{"type":54,"tag":825,"props":5930,"children":5931},{"style":1072},[5932],{"type":60,"value":1929},{"type":54,"tag":825,"props":5934,"children":5935},{"style":848},[5936],{"type":60,"value":976},{"type":54,"tag":825,"props":5938,"children":5939},{"style":848},[5940],{"type":60,"value":872},{"type":54,"tag":825,"props":5942,"children":5943},{"style":848},[5944],{"type":60,"value":851},{"type":54,"tag":825,"props":5946,"children":5947},{"style":854},[5948],{"type":60,"value":1946},{"type":54,"tag":825,"props":5950,"children":5951},{"style":848},[5952],{"type":60,"value":976},{"type":54,"tag":825,"props":5954,"children":5955},{"style":848},[5956],{"type":60,"value":5957},"},\n",{"type":54,"tag":825,"props":5959,"children":5960},{"class":827,"line":2189},[5961,5965,5969,5973,5977,5981,5985,5990,5994,5998,6003,6007,6011,6015,6019,6024,6028],{"type":54,"tag":825,"props":5962,"children":5963},{"style":848},[5964],{"type":60,"value":5891},{"type":54,"tag":825,"props":5966,"children":5967},{"style":848},[5968],{"type":60,"value":976},{"type":54,"tag":825,"props":5970,"children":5971},{"style":1072},[5972],{"type":60,"value":1894},{"type":54,"tag":825,"props":5974,"children":5975},{"style":848},[5976],{"type":60,"value":976},{"type":54,"tag":825,"props":5978,"children":5979},{"style":848},[5980],{"type":60,"value":872},{"type":54,"tag":825,"props":5982,"children":5983},{"style":848},[5984],{"type":60,"value":851},{"type":54,"tag":825,"props":5986,"children":5987},{"style":854},[5988],{"type":60,"value":5989},"camera_rear_left",{"type":54,"tag":825,"props":5991,"children":5992},{"style":848},[5993],{"type":60,"value":976},{"type":54,"tag":825,"props":5995,"children":5996},{"style":848},[5997],{"type":60,"value":1920},{"type":54,"tag":825,"props":5999,"children":6000},{"style":848},[6001],{"type":60,"value":6002},"   \"",{"type":54,"tag":825,"props":6004,"children":6005},{"style":1072},[6006],{"type":60,"value":1929},{"type":54,"tag":825,"props":6008,"children":6009},{"style":848},[6010],{"type":60,"value":976},{"type":54,"tag":825,"props":6012,"children":6013},{"style":848},[6014],{"type":60,"value":872},{"type":54,"tag":825,"props":6016,"children":6017},{"style":848},[6018],{"type":60,"value":851},{"type":54,"tag":825,"props":6020,"children":6021},{"style":854},[6022],{"type":60,"value":6023},"camera_rear_right",{"type":54,"tag":825,"props":6025,"children":6026},{"style":848},[6027],{"type":60,"value":976},{"type":54,"tag":825,"props":6029,"children":6030},{"style":848},[6031],{"type":60,"value":5957},{"type":54,"tag":825,"props":6033,"children":6034},{"class":827,"line":27},[6035,6039,6043,6047,6051,6055,6059,6064,6068,6072,6076,6080,6084,6088,6092,6097,6101],{"type":54,"tag":825,"props":6036,"children":6037},{"style":848},[6038],{"type":60,"value":5891},{"type":54,"tag":825,"props":6040,"children":6041},{"style":848},[6042],{"type":60,"value":976},{"type":54,"tag":825,"props":6044,"children":6045},{"style":1072},[6046],{"type":60,"value":1894},{"type":54,"tag":825,"props":6048,"children":6049},{"style":848},[6050],{"type":60,"value":976},{"type":54,"tag":825,"props":6052,"children":6053},{"style":848},[6054],{"type":60,"value":872},{"type":54,"tag":825,"props":6056,"children":6057},{"style":848},[6058],{"type":60,"value":851},{"type":54,"tag":825,"props":6060,"children":6061},{"style":854},[6062],{"type":60,"value":6063},"camera_side_left_a",{"type":54,"tag":825,"props":6065,"children":6066},{"style":848},[6067],{"type":60,"value":976},{"type":54,"tag":825,"props":6069,"children":6070},{"style":848},[6071],{"type":60,"value":1920},{"type":54,"tag":825,"props":6073,"children":6074},{"style":848},[6075],{"type":60,"value":851},{"type":54,"tag":825,"props":6077,"children":6078},{"style":1072},[6079],{"type":60,"value":1929},{"type":54,"tag":825,"props":6081,"children":6082},{"style":848},[6083],{"type":60,"value":976},{"type":54,"tag":825,"props":6085,"children":6086},{"style":848},[6087],{"type":60,"value":872},{"type":54,"tag":825,"props":6089,"children":6090},{"style":848},[6091],{"type":60,"value":851},{"type":54,"tag":825,"props":6093,"children":6094},{"style":854},[6095],{"type":60,"value":6096},"camera_side_left_b",{"type":54,"tag":825,"props":6098,"children":6099},{"style":848},[6100],{"type":60,"value":976},{"type":54,"tag":825,"props":6102,"children":6103},{"style":848},[6104],{"type":60,"value":6105},"}\n",{"type":54,"tag":825,"props":6107,"children":6108},{"class":827,"line":2974},[6109],{"type":54,"tag":825,"props":6110,"children":6111},{"style":848},[6112],{"type":60,"value":6113},"]}\n",{"type":54,"tag":131,"props":6115,"children":6116},{},[6117,6119,6124],{"type":60,"value":6118},"Pose trajectory must include every ",{"type":54,"tag":76,"props":6120,"children":6121},{},[6122],{"type":60,"value":6123},"(camera × frame timestamp)",{"type":60,"value":6125}," sample —\nsurround stereo at 8 cameras × 100 frames yields 800 trajectory waypoints,\nmore than dense enough for per-ray motion compensation. Do not subsample.",{"type":54,"tag":131,"props":6127,"children":6128},{},[6129,6131,6137,6139,6144,6146,6151,6152,6157,6159,6163],{"type":60,"value":6130},"Calibration: stereo intrinsics + extrinsics from ",{"type":54,"tag":84,"props":6132,"children":6134},{"className":6133},[],[6135],{"type":60,"value":6136},"cv2.stereoCalibrate",{"type":60,"value":6138}," give\nyou ",{"type":54,"tag":84,"props":6140,"children":6142},{"className":6141},[],[6143],{"type":60,"value":5718},{"type":60,"value":6145}," from right-to-left. Compose with your chosen rig origin to get\n",{"type":54,"tag":84,"props":6147,"children":6149},{"className":6148},[],[6150],{"type":60,"value":5695},{"type":60,"value":2005},{"type":54,"tag":84,"props":6153,"children":6155},{"className":6154},[],[6156],{"type":60,"value":5702},{"type":60,"value":6158}," separately; do ",{"type":54,"tag":76,"props":6160,"children":6161},{},[6162],{"type":60,"value":3111},{"type":60,"value":6164}," store only the\nbaseline.",{"type":54,"tag":131,"props":6166,"children":6167},{},[6168],{"type":60,"value":6169},"Scale is metric by construction (calibrated baseline). Skip scale refinement\n(or run it as a sanity check only).",{"type":54,"tag":783,"props":6171,"children":6173},{"id":6172},"mono-depth-rgb-d-learned-depth",[6174],{"type":60,"value":369},{"type":54,"tag":70,"props":6176,"children":6177},{},[6178],{"type":60,"value":6179},"Single RGB camera + per-frame depth (sensor: RealSense, Kinect, ZED depth, or\nlearned mono-depth like Marigold \u002F DepthAnythingV2 \u002F MoGe-2).",{"type":54,"tag":70,"props":6181,"children":6182},{},[6183],{"type":54,"tag":76,"props":6184,"children":6185},{},[6186],{"type":60,"value":6187},"RGB-D specifics:",{"type":54,"tag":127,"props":6189,"children":6190},{},[6191,6215,6225,6241,6258,6267,6276,6343,6356],{"type":54,"tag":131,"props":6192,"children":6193},{},[6194,6199,6201,6205,6207,6213],{"type":54,"tag":76,"props":6195,"children":6196},{},[6197],{"type":60,"value":6198},"RealSense D4xx \u002F L515",{"type":60,"value":6200},": active IR stereo (D4xx) or LiDAR-class TOF (L515).\nDepth and RGB are co-triggered but ",{"type":54,"tag":76,"props":6202,"children":6203},{},[6204],{"type":60,"value":3111},{"type":60,"value":6206}," pixel-aligned out of the box —\nuse the ",{"type":54,"tag":84,"props":6208,"children":6210},{"className":6209},[],[6211],{"type":60,"value":6212},"rs2_align",{"type":60,"value":6214}," filter (or pre-aligned topics) before treating depth\nas RGB-frame metric. Intrinsics: read the colour stream's intrinsics for\nthe RGB component; ignore the depth-stream intrinsics (depth is aligned\ninto the colour frame).",{"type":54,"tag":131,"props":6216,"children":6217},{},[6218,6223],{"type":54,"tag":76,"props":6219,"children":6220},{},[6221],{"type":60,"value":6222},"Microsoft Kinect Azure \u002F Kinect v2",{"type":60,"value":6224},": TOF depth with non-trivial\ninvalidation near object edges. Mask invalidated pixels (depth == 0) before\nencoding as a point cloud.",{"type":54,"tag":131,"props":6226,"children":6227},{},[6228,6233,6235,6240],{"type":54,"tag":76,"props":6229,"children":6230},{},[6231],{"type":60,"value":6232},"Stereolabs ZED 2 \u002F X",{"type":60,"value":6234},": stereo with a built-in disparity engine. Either\nstore both raw left\u002Fright images and treat as a stereo rig (preferred —\nFoundation Stereo can re-derive depth at higher quality), or store the\nZED-native depth as a per-frame ",{"type":54,"tag":84,"props":6236,"children":6238},{"className":6237},[],[6239],{"type":60,"value":1590},{"type":60,"value":99},{"type":54,"tag":131,"props":6242,"children":6243},{},[6244,6249,6251,6256],{"type":54,"tag":76,"props":6245,"children":6246},{},[6247],{"type":60,"value":6248},"Learned mono-depth",{"type":60,"value":6250}," (Marigold, DepthAnythingV2, MoGe-2) is ",{"type":54,"tag":76,"props":6252,"children":6253},{},[6254],{"type":60,"value":6255},"scale\nambiguous",{"type":60,"value":6257},". Either anchor with one absolute reference (a known object\nsize, ground-plane height, IMU + visual-inertial scale) before storing,\nor accept that scale refinement (r2s module 6) will run downstream.",{"type":54,"tag":131,"props":6259,"children":6260},{},[6261,6265],{"type":54,"tag":76,"props":6262,"children":6263},{},[6264],{"type":60,"value":5678},{"type":60,"value":6266},": camera optical centre (or device body if you have a static\nIMU offset).",{"type":54,"tag":131,"props":6268,"children":6269},{},[6270,6274],{"type":54,"tag":76,"props":6271,"children":6272},{},[6273],{"type":60,"value":5728},{"type":60,"value":6275},": ARKit\u002FARCore pose stream, IMU+camera VIO, or depth-aided\nRGB-D SLAM (Open3D, Spectacular AI).",{"type":54,"tag":131,"props":6277,"children":6278},{},[6279,6284,6286,6290,6292],{"type":54,"tag":76,"props":6280,"children":6281},{},[6282],{"type":60,"value":6283},"No LiDAR",{"type":60,"value":6285}," — depth is ",{"type":54,"tag":1439,"props":6287,"children":6288},{},[6289],{"type":60,"value":3111},{"type":60,"value":6291}," a LiDAR. Two valid encodings:",{"type":54,"tag":216,"props":6293,"children":6294},{},[6295,6326],{"type":54,"tag":131,"props":6296,"children":6297},{},[6298,6308,6310,6316,6318,6324],{"type":54,"tag":76,"props":6299,"children":6300},{},[6301,6303],{"type":60,"value":6302},"Per-frame ",{"type":54,"tag":84,"props":6304,"children":6306},{"className":6305},[],[6307],{"type":60,"value":1590},{"type":60,"value":6309}," (preferred for learned\u002Fstereo-quality\ndepth, where reliability is uneven). Convert depth + intrinsics →\ncamera-frame XYZ, transform to world via ",{"type":54,"tag":84,"props":6311,"children":6313},{"className":6312},[],[6314],{"type":60,"value":6315},"T_camera_world(t)",{"type":60,"value":6317},", store as\na point cloud per frame. Carry the dense depth into ",{"type":54,"tag":84,"props":6319,"children":6321},{"className":6320},[],[6322],{"type":60,"value":6323},"generic_data",{"type":60,"value":6325}," if\ndownstream consumers want it.",{"type":54,"tag":131,"props":6327,"children":6328},{},[6329,6334,6336,6341],{"type":54,"tag":76,"props":6330,"children":6331},{},[6332],{"type":60,"value":6333},"Synthetic spinning LiDAR",{"type":60,"value":6335}," (only if your depth is dense and reliable).\nSample a fixed grid of azimuths\u002Felevations, ray-cast against the depth\nmap at each frame, and write a ",{"type":54,"tag":84,"props":6337,"children":6339},{"className":6338},[],[6340],{"type":60,"value":1423},{"type":60,"value":6342},". This is more\nwork and less honest than option 1 — prefer point clouds unless NuRec\nspecifically needs a LiDAR component.",{"type":54,"tag":131,"props":6344,"children":6345},{},[6346,6348,6354],{"type":60,"value":6347},"Camera intrinsics: pinhole or fisheye depending on the lens. Depth-camera\nmanufacturers ship calibration JSON — copy ",{"type":54,"tag":84,"props":6349,"children":6351},{"className":6350},[],[6352],{"type":60,"value":6353},"fx, fy, cx, cy",{"type":60,"value":6355}," and distortion\ncoefficients verbatim.",{"type":54,"tag":131,"props":6357,"children":6358},{},[6359],{"type":60,"value":6360},"Frame timestamps: depth and RGB are usually co-triggered. Use the RGB\nexposure timestamp; depth has no separate component.",{"type":54,"tag":783,"props":6362,"children":6364},{"id":6363},"mono-lidar-handheld-robot",[6365],{"type":60,"value":378},{"type":54,"tag":70,"props":6367,"children":6368},{},[6369],{"type":60,"value":6370},"Single camera + spinning or solid-state LiDAR, e.g. handheld scanner, ground\nrobot, drone.",{"type":54,"tag":127,"props":6372,"children":6373},{},[6374,6391,6400,6415,6493,6498],{"type":54,"tag":131,"props":6375,"children":6376},{},[6377,6381,6383,6389],{"type":54,"tag":76,"props":6378,"children":6379},{},[6380],{"type":60,"value":5678},{"type":60,"value":6382},": choice driven by mechanical mounting. If the LiDAR is the\nreference for ego-motion (LiDAR-inertial SLAM), set rig = LiDAR (so\n",{"type":54,"tag":84,"props":6384,"children":6386},{"className":6385},[],[6387],{"type":60,"value":6388},"T_lidar_rig = I",{"type":60,"value":6390},"). Otherwise pick the IMU body frame or camera centre.",{"type":54,"tag":131,"props":6392,"children":6393},{},[6394,6398],{"type":54,"tag":76,"props":6395,"children":6396},{},[6397],{"type":60,"value":5728},{"type":60,"value":6399},": LIO-SAM, FAST-LIO, or any LiDAR-inertial pipeline.\nRe-reference to the first frame; cast last (float64 → float32).",{"type":54,"tag":131,"props":6401,"children":6402},{},[6403,6407,6408,6413],{"type":54,"tag":76,"props":6404,"children":6405},{},[6406],{"type":60,"value":5688},{"type":60,"value":1608},{"type":54,"tag":84,"props":6409,"children":6411},{"className":6410},[],[6412],{"type":60,"value":3331},{"type":60,"value":6414}," from camera-LiDAR calibration\n(kalibr, lidar_align). Apply the NCore camera-frame rotation if your\ncalibration target uses a different convention.",{"type":54,"tag":131,"props":6416,"children":6417},{},[6418,6422,6424],{"type":54,"tag":76,"props":6419,"children":6420},{},[6421],{"type":60,"value":3361},{"type":60,"value":6423},":\n",{"type":54,"tag":127,"props":6425,"children":6426},{},[6427,6460],{"type":54,"tag":131,"props":6428,"children":6429},{},[6430,6432,6438,6440,6445,6447,6452,6454,6459],{"type":60,"value":6431},"Spinning (Velodyne \u002F Ouster \u002F Hesai \u002F Robosense \u002F Livox Mid-360 in\nrepetitive mode): use ",{"type":54,"tag":84,"props":6433,"children":6435},{"className":6434},[],[6436],{"type":60,"value":6437},"RowOffsetStructuredSpinningLidarModelParameters",{"type":60,"value":6439},"\nwith the sensor's real elevations (datasheet) and ",{"type":54,"tag":84,"props":6441,"children":6443},{"className":6442},[],[6444],{"type":60,"value":3499},{"type":60,"value":6446},". For Ouster\npopulate ",{"type":54,"tag":84,"props":6448,"children":6450},{"className":6449},[],[6451],{"type":60,"value":2839},{"type":60,"value":6453}," from ",{"type":54,"tag":84,"props":6455,"children":6457},{"className":6456},[],[6458],{"type":60,"value":3624},{"type":60,"value":99},{"type":54,"tag":131,"props":6461,"children":6462},{},[6463,6465,6470,6472,6477,6479,6484,6486,6491],{"type":60,"value":6464},"Solid-state non-repetitive (Livox Avia, Mid-40, Mid-70 in\nnon-repetitive mode): the spinning model does not fit. Either replay\neach scan as a fake \"spinning\" sweep (stash directions in\n",{"type":54,"tag":84,"props":6466,"children":6468},{"className":6467},[],[6469],{"type":60,"value":1713},{"type":60,"value":6471}," per-scan — fragile) or, ",{"type":54,"tag":76,"props":6473,"children":6474},{},[6475],{"type":60,"value":6476},"preferred",{"type":60,"value":6478},", write the\npoints as a ",{"type":54,"tag":84,"props":6480,"children":6482},{"className":6481},[],[6483],{"type":60,"value":1590},{"type":60,"value":6485}," per frame in the sensor frame and\nskip ",{"type":54,"tag":84,"props":6487,"children":6489},{"className":6488},[],[6490],{"type":60,"value":1423},{"type":60,"value":6492},". NuRec can consume point clouds.",{"type":54,"tag":131,"props":6494,"children":6495},{},[6496],{"type":60,"value":6497},"Cuboids: usually unavailable for non-AV — leave the component empty or\nunregistered.",{"type":54,"tag":131,"props":6499,"children":6500},{},[6501,6503,6509],{"type":60,"value":6502},"Ego masks: render the rig body if it intrudes on the FOV (drone arm,\nrobot chassis); empty ",{"type":54,"tag":84,"props":6504,"children":6506},{"className":6505},[],[6507],{"type":60,"value":6508},"{}",{"type":60,"value":6510}," if not.",{"type":54,"tag":783,"props":6512,"children":6514},{"id":6513},"solid-state-non-repetitive-lidar-livox",[6515],{"type":60,"value":387},{"type":54,"tag":70,"props":6517,"children":6518},{},[6519,6521,6525,6527,6533],{"type":60,"value":6520},"Livox Avia \u002F Mid-40 \u002F Mid-70 — and Mid-360 in non-repetitive mode — produce\na point cloud per scan that does ",{"type":54,"tag":76,"props":6522,"children":6523},{},[6524],{"type":60,"value":3111},{"type":60,"value":6526}," lay out on a row-major spinning\ngrid. The ",{"type":54,"tag":84,"props":6528,"children":6530},{"className":6529},[],[6531],{"type":60,"value":6532},"RowOffsetStructuredSpinningLidarModel",{"type":60,"value":6534}," does not fit; forcing it\n(synthetic columns, fake row bins) breaks NCore validation and\nmotion-compensation alignment.",{"type":54,"tag":70,"props":6536,"children":6537},{},[6538],{"type":60,"value":6539},"Encoding rules:",{"type":54,"tag":127,"props":6541,"children":6542},{},[6543,6574],{"type":54,"tag":131,"props":6544,"children":6545},{},[6546,6551,6553,6558,6560,6565,6567,6572],{"type":54,"tag":76,"props":6547,"children":6548},{},[6549],{"type":60,"value":6550},"Preferred",{"type":60,"value":6552}," — write each scan as a per-frame ",{"type":54,"tag":84,"props":6554,"children":6556},{"className":6555},[],[6557],{"type":60,"value":1590},{"type":60,"value":6559},"\ninstance in the ",{"type":54,"tag":76,"props":6561,"children":6562},{},[6563],{"type":60,"value":6564},"sensor frame",{"type":60,"value":6566},", with per-point µs timestamps. Skip\n",{"type":54,"tag":84,"props":6568,"children":6570},{"className":6569},[],[6571],{"type":60,"value":1423},{"type":60,"value":6573}," entirely. NuRec consumes point clouds and r2s depth\nrefinement (module 7) treats them as it would LiDAR sweeps.",{"type":54,"tag":131,"props":6575,"children":6576},{},[6577,6582,6584,6589],{"type":54,"tag":76,"props":6578,"children":6579},{},[6580],{"type":60,"value":6581},"Fallback for repetitive Mid-360",{"type":60,"value":6583}," — the Mid-360 in repetitive mode does\nproduce a structured grid; treat it as a spinning LiDAR with the\ndatasheet's beam table and ",{"type":54,"tag":84,"props":6585,"children":6587},{"className":6586},[],[6588],{"type":60,"value":4805},{"type":60,"value":6590},". This is the only\nLivox variant the spinning model fits.",{"type":54,"tag":70,"props":6592,"children":6593},{},[6594,6596,6602,6604,6610],{"type":60,"value":6595},"Per-point timestamps: Livox custom messages carry ",{"type":54,"tag":84,"props":6597,"children":6599},{"className":6598},[],[6600],{"type":60,"value":6601},"offset_time",{"type":60,"value":6603}," (ns from\nsweep start). Convert to absolute µs:\n",{"type":54,"tag":84,"props":6605,"children":6607},{"className":6606},[],[6608],{"type":60,"value":6609},"timestamp_us = sweep_start_us + offset_time_ns \u002F\u002F 1000",{"type":60,"value":99},{"type":54,"tag":783,"props":6612,"children":6614},{"id":6613},"imu-camera-visual-inertial",[6615],{"type":60,"value":396},{"type":54,"tag":70,"props":6617,"children":6618},{},[6619,6621,6625],{"type":60,"value":6620},"IMU is ",{"type":54,"tag":76,"props":6622,"children":6623},{},[6624],{"type":60,"value":3111},{"type":60,"value":6626}," stored as its own NCore component — it densifies the pose\ntrajectory (and, optionally, anchors metric scale on monocular setups). Two\npaths:",{"type":54,"tag":216,"props":6628,"children":6629},{},[6630,6648],{"type":54,"tag":131,"props":6631,"children":6632},{},[6633,6638,6640,6646],{"type":54,"tag":76,"props":6634,"children":6635},{},[6636],{"type":60,"value":6637},"VIO trajectory (preferred)",{"type":60,"value":6639},": run a visual-inertial pipeline (cuVSLAM\nstereo-inertial, ORB-SLAM3, OpenVSLAM, OpenVINS, Spectacular AI) →\nIMU-rate (100–200 Hz) ",{"type":54,"tag":84,"props":6641,"children":6643},{"className":6642},[],[6644],{"type":60,"value":6645},"T_world_rig",{"type":60,"value":6647}," poses → store as the dynamic pose.\nThe trajectory is already dense enough that per-ray motion compensation\nworks without further densification.",{"type":54,"tag":131,"props":6649,"children":6650},{},[6651,6656],{"type":54,"tag":76,"props":6652,"children":6653},{},[6654],{"type":60,"value":6655},"IMU integration only (bootstrap \u002F fallback)",{"type":60,"value":6657},": pre-integrate IMU\n(linear accel + angular vel) over short windows, anchor each window with\nthe next available camera- or LiDAR-rate pose. Useful for filling gaps or\nextrapolating to per-LiDAR sweep timestamps when the SLAM stack only\nemits poses at frame rate.",{"type":54,"tag":70,"props":6659,"children":6660},{},[6661,6663,6667,6669,6675],{"type":60,"value":6662},"Either way, IMU sample timestamps go into the pose trajectory, ",{"type":54,"tag":76,"props":6664,"children":6665},{},[6666],{"type":60,"value":3111},{"type":60,"value":6668}," into\na separate component. If a downstream consumer wants raw IMU, stash the\nsamples in the sequence-level ",{"type":54,"tag":84,"props":6670,"children":6672},{"className":6671},[],[6673],{"type":60,"value":6674},"generic_meta_data[\"imu_samples\"]",{"type":60,"value":6676}," (compact)\nor in a sidecar file referenced from there.",{"type":54,"tag":70,"props":6678,"children":6679},{},[6680,6682,6688,6690,6695,6696,6701,6703,6709,6711,6716,6718,6724],{"type":60,"value":6681},"Calibration: IMU-to-camera and IMU-to-LiDAR extrinsics live in the static\npose graph as ",{"type":54,"tag":84,"props":6683,"children":6685},{"className":6684},[],[6686],{"type":60,"value":6687},"T_imu_rig = I",{"type":60,"value":6689}," if you take the IMU body frame as the rig\n(common for legged robots and drones), with ",{"type":54,"tag":84,"props":6691,"children":6693},{"className":6692},[],[6694],{"type":60,"value":3331},{"type":60,"value":4354},{"type":54,"tag":84,"props":6697,"children":6699},{"className":6698},[],[6700],{"type":60,"value":3338},{"type":60,"value":6702}," from kalibr \u002F ",{"type":54,"tag":84,"props":6704,"children":6706},{"className":6705},[],[6707],{"type":60,"value":6708},"lidar_align",{"type":60,"value":6710}," outputs. Pick ",{"type":54,"tag":76,"props":6712,"children":6713},{},[6714],{"type":60,"value":6715},"rig = IMU",{"type":60,"value":6717}," when\nthe IMU is the trajectory reference; otherwise pick the mechanical body\nframe and store ",{"type":54,"tag":84,"props":6719,"children":6721},{"className":6720},[],[6722],{"type":60,"value":6723},"T_imu_rig",{"type":60,"value":6725}," for downstream tools that want IMU-frame data.",{"type":54,"tag":783,"props":6727,"children":6729},{"id":6728},"ros2-bag-mcap-sqlite3",[6730],{"type":60,"value":405},{"type":54,"tag":70,"props":6732,"children":6733},{},[6734,6736,6741,6743,6749],{"type":60,"value":6735},"Most robotics datasets ship as ROS2 bags. The standard path is the\n",{"type":54,"tag":76,"props":6737,"children":6738},{},[6739],{"type":60,"value":6740},"rosbags",{"type":60,"value":6742}," Python library — no ",{"type":54,"tag":84,"props":6744,"children":6746},{"className":6745},[],[6747],{"type":60,"value":6748},"rclpy",{"type":60,"value":6750}," and no native ROS install required:",{"type":54,"tag":814,"props":6752,"children":6754},{"className":816,"code":6753,"language":818,"meta":819,"style":819},"pip install rosbags pyav   # pyav decodes H.264 video chunks; rosbags handles .mcap and .db3\n",[6755],{"type":54,"tag":84,"props":6756,"children":6757},{"__ignoreMap":819},[6758],{"type":54,"tag":825,"props":6759,"children":6760},{"class":827,"line":828},[6761,6765,6769,6774,6779],{"type":54,"tag":825,"props":6762,"children":6763},{"style":1072},[6764],{"type":60,"value":726},{"type":54,"tag":825,"props":6766,"children":6767},{"style":854},[6768],{"type":60,"value":1079},{"type":54,"tag":825,"props":6770,"children":6771},{"style":854},[6772],{"type":60,"value":6773}," rosbags",{"type":54,"tag":825,"props":6775,"children":6776},{"style":854},[6777],{"type":60,"value":6778}," pyav",{"type":54,"tag":825,"props":6780,"children":6781},{"style":832},[6782],{"type":60,"value":6783},"   # pyav decodes H.264 video chunks; rosbags handles .mcap and .db3\n",{"type":54,"tag":70,"props":6785,"children":6786},{},[6787,6789,6794],{"type":60,"value":6788},"Convert in ",{"type":54,"tag":76,"props":6790,"children":6791},{},[6792],{"type":60,"value":6793},"two passes",{"type":60,"value":6795},": first enumerate sensors and collect calibration \u002F\nthe static TF tree, then stream frames into the V4 writer. Common topic →\ncomponent mapping:",{"type":54,"tag":461,"props":6797,"children":6798},{},[6799,6815],{"type":54,"tag":465,"props":6800,"children":6801},{},[6802],{"type":54,"tag":469,"props":6803,"children":6804},{},[6805,6810],{"type":54,"tag":473,"props":6806,"children":6807},{},[6808],{"type":60,"value":6809},"ROS2 message type",{"type":54,"tag":473,"props":6811,"children":6812},{},[6813],{"type":60,"value":6814},"NCore mapping",{"type":54,"tag":484,"props":6816,"children":6817},{},[6818,6843,6886,6913,6956,6980,7010,7027,7082],{"type":54,"tag":469,"props":6819,"children":6820},{},[6821,6832],{"type":54,"tag":491,"props":6822,"children":6823},{},[6824,6830],{"type":54,"tag":84,"props":6825,"children":6827},{"className":6826},[],[6828],{"type":60,"value":6829},"sensor_msgs\u002FImage",{"type":60,"value":6831}," (raw)",{"type":54,"tag":491,"props":6833,"children":6834},{},[6835,6841],{"type":54,"tag":84,"props":6836,"children":6838},{"className":6837},[],[6839],{"type":60,"value":6840},"CameraSensorComponent.store_frame",{"type":60,"value":6842}," — re-encode to JPEG with PIL before storing (NCore stores bytes verbatim; raw bitmaps balloon the store)",{"type":54,"tag":469,"props":6844,"children":6845},{},[6846,6855],{"type":54,"tag":491,"props":6847,"children":6848},{},[6849],{"type":54,"tag":84,"props":6850,"children":6852},{"className":6851},[],[6853],{"type":60,"value":6854},"sensor_msgs\u002FCompressedImage",{"type":54,"tag":491,"props":6856,"children":6857},{},[6858,6863,6865,6871,6873,6879,6880],{"type":54,"tag":84,"props":6859,"children":6861},{"className":6860},[],[6862],{"type":60,"value":6840},{"type":60,"value":6864}," — pass ",{"type":54,"tag":84,"props":6866,"children":6868},{"className":6867},[],[6869],{"type":60,"value":6870},"data",{"type":60,"value":6872}," directly with ",{"type":54,"tag":84,"props":6874,"children":6876},{"className":6875},[],[6877],{"type":60,"value":6878},"image_format=\"jpeg\"",{"type":60,"value":2035},{"type":54,"tag":84,"props":6881,"children":6883},{"className":6882},[],[6884],{"type":60,"value":6885},"\"png\"",{"type":54,"tag":469,"props":6887,"children":6888},{},[6889,6900],{"type":54,"tag":491,"props":6890,"children":6891},{},[6892,6898],{"type":54,"tag":84,"props":6893,"children":6895},{"className":6894},[],[6896],{"type":60,"value":6897},"foxglove_msgs\u002FCompressedVideo",{"type":60,"value":6899}," (H.264 chunks)",{"type":54,"tag":491,"props":6901,"children":6902},{},[6903,6905,6911],{"type":60,"value":6904},"Decode with PyAV (",{"type":54,"tag":84,"props":6906,"children":6908},{"className":6907},[],[6909],{"type":60,"value":6910},"av.open(BytesIO(...))",{"type":60,"value":6912},") → re-encode each frame to JPEG → store",{"type":54,"tag":469,"props":6914,"children":6915},{},[6916,6925],{"type":54,"tag":491,"props":6917,"children":6918},{},[6919],{"type":54,"tag":84,"props":6920,"children":6922},{"className":6921},[],[6923],{"type":60,"value":6924},"sensor_msgs\u002FCameraInfo",{"type":54,"tag":491,"props":6926,"children":6927},{},[6928,6930,6935,6937,6943,6944,6949,6950],{"type":60,"value":6929},"Source for ",{"type":54,"tag":84,"props":6931,"children":6933},{"className":6932},[],[6934],{"type":60,"value":3789},{"type":60,"value":6936}," (or fisheye) — ",{"type":54,"tag":84,"props":6938,"children":6940},{"className":6939},[],[6941],{"type":60,"value":6942},"K",{"type":60,"value":1700},{"type":54,"tag":84,"props":6945,"children":6947},{"className":6946},[],[6948],{"type":60,"value":4122},{"type":60,"value":1700},{"type":54,"tag":84,"props":6951,"children":6953},{"className":6952},[],[6954],{"type":60,"value":6955},"width\u002Fheight",{"type":54,"tag":469,"props":6957,"children":6958},{},[6959,6968],{"type":54,"tag":491,"props":6960,"children":6961},{},[6962],{"type":54,"tag":84,"props":6963,"children":6965},{"className":6964},[],[6966],{"type":60,"value":6967},"tf2_msgs\u002FTFMessage",{"type":54,"tag":491,"props":6969,"children":6970},{},[6971,6973,6978],{"type":60,"value":6972},"Read once, build the static TF tree (rosbags' built-in TF helper), derive ",{"type":54,"tag":84,"props":6974,"children":6976},{"className":6975},[],[6977],{"type":60,"value":1314},{"type":60,"value":6979}," per camera\u002Flidar",{"type":54,"tag":469,"props":6981,"children":6982},{},[6983,6999],{"type":54,"tag":491,"props":6984,"children":6985},{},[6986,6992,6993],{"type":54,"tag":84,"props":6987,"children":6989},{"className":6988},[],[6990],{"type":60,"value":6991},"nav_msgs\u002FOdometry",{"type":60,"value":1700},{"type":54,"tag":84,"props":6994,"children":6996},{"className":6995},[],[6997],{"type":60,"value":6998},"geometry_msgs\u002FPoseStamped",{"type":54,"tag":491,"props":7000,"children":7001},{},[7002,7003,7008],{"type":60,"value":1300},{"type":54,"tag":84,"props":7004,"children":7006},{"className":7005},[],[7007],{"type":60,"value":6645},{"type":60,"value":7009}," waypoints — dense (IMU rate) if available, sparse otherwise",{"type":54,"tag":469,"props":7011,"children":7012},{},[7013,7022],{"type":54,"tag":491,"props":7014,"children":7015},{},[7016],{"type":54,"tag":84,"props":7017,"children":7019},{"className":7018},[],[7020],{"type":60,"value":7021},"sensor_msgs\u002FImu",{"type":54,"tag":491,"props":7023,"children":7024},{},[7025],{"type":60,"value":7026},"Trajectory densifier only — integrate or feed into VIO; never stored as its own NCore component",{"type":54,"tag":469,"props":7028,"children":7029},{},[7030,7039],{"type":54,"tag":491,"props":7031,"children":7032},{},[7033],{"type":54,"tag":84,"props":7034,"children":7036},{"className":7035},[],[7037],{"type":60,"value":7038},"sensor_msgs\u002FPointCloud2",{"type":54,"tag":491,"props":7040,"children":7041},{},[7042,7044,7050,7052,7058,7059,7065,7066,7072,7074,7080],{"type":60,"value":7043},"LiDAR sweep — per-point fields ",{"type":54,"tag":84,"props":7045,"children":7047},{"className":7046},[],[7048],{"type":60,"value":7049},"(x, y, z, intensity, ring, t)",{"type":60,"value":7051}," map to ",{"type":54,"tag":84,"props":7053,"children":7055},{"className":7054},[],[7056],{"type":60,"value":7057},"direction = xyz \u002F norm",{"type":60,"value":1700},{"type":54,"tag":84,"props":7060,"children":7062},{"className":7061},[],[7063],{"type":60,"value":7064},"intensity",{"type":60,"value":1700},{"type":54,"tag":84,"props":7067,"children":7069},{"className":7068},[],[7070],{"type":60,"value":7071},"model_element[:, 0] = ring",{"type":60,"value":7073},". If ",{"type":54,"tag":84,"props":7075,"children":7077},{"className":7076},[],[7078],{"type":60,"value":7079},"t",{"type":60,"value":7081}," is absent, synthesise from sweep duration and azimuth bin (see Mono + LiDAR notes).",{"type":54,"tag":469,"props":7083,"children":7084},{},[7085,7094],{"type":54,"tag":491,"props":7086,"children":7087},{},[7088],{"type":54,"tag":84,"props":7089,"children":7091},{"className":7090},[],[7092],{"type":60,"value":7093},"livox_ros_driver2\u002FCustomMsg",{"type":54,"tag":491,"props":7095,"children":7096},{},[7097,7099,7104,7106,7111,7112,7116,7117,7122],{"type":60,"value":7098},"Livox custom format — same as PointCloud2 plus per-point ",{"type":54,"tag":84,"props":7100,"children":7102},{"className":7101},[],[7103],{"type":60,"value":6601},{"type":60,"value":7105}," (ns from sweep start). Solid-state non-repetitive scans go into ",{"type":54,"tag":84,"props":7107,"children":7109},{"className":7108},[],[7110],{"type":60,"value":1590},{"type":60,"value":1700},{"type":54,"tag":76,"props":7113,"children":7114},{},[7115],{"type":60,"value":3111},{"type":60,"value":1437},{"type":54,"tag":84,"props":7118,"children":7120},{"className":7119},[],[7121],{"type":60,"value":1423},{"type":60,"value":7123}," (see solid-state recipe).",{"type":54,"tag":70,"props":7125,"children":7126},{},[7127],{"type":60,"value":4203},{"type":54,"tag":127,"props":7129,"children":7130},{},[7131,7179,7221,7233,7238],{"type":54,"tag":131,"props":7132,"children":7133},{},[7134,7136,7142,7143,7148,7150,7155,7156,7162,7164,7170,7172,7177],{"type":60,"value":7135},"Rolling-shutter ROS2 cameras: ",{"type":54,"tag":84,"props":7137,"children":7139},{"className":7138},[],[7140],{"type":60,"value":7141},"Image.header.stamp",{"type":60,"value":3215},{"type":54,"tag":76,"props":7144,"children":7145},{},[7146],{"type":60,"value":7147},"frame trigger",{"type":60,"value":7149},".\nCompute ",{"type":54,"tag":84,"props":7151,"children":7153},{"className":7152},[],[7154],{"type":60,"value":1380},{"type":60,"value":6453},{"type":54,"tag":84,"props":7157,"children":7159},{"className":7158},[],[7160],{"type":60,"value":7161},"CameraInfo",{"type":60,"value":7163}," exposure metadata\nif present, otherwise read the device datasheet. Setting\n",{"type":54,"tag":84,"props":7165,"children":7167},{"className":7166},[],[7168],{"type":60,"value":7169},"frame_timestamps_us = [trigger, trigger]",{"type":60,"value":7171}," is acceptable for\nwell-synchronised global-shutter rigs, ",{"type":54,"tag":76,"props":7173,"children":7174},{},[7175],{"type":60,"value":7176},"wrong",{"type":60,"value":7178}," for rolling-shutter\nunless the readout time is small enough to ignore.",{"type":54,"tag":131,"props":7180,"children":7181},{},[7182,7184,7190,7192,7196,7198,7204,7205,7211,7213,7219],{"type":60,"value":7183},"TF tree → rig frame: pick ",{"type":54,"tag":84,"props":7185,"children":7187},{"className":7186},[],[7188],{"type":60,"value":7189},"base_link",{"type":60,"value":7191}," (or whichever frame is configured\nas the robot body) as ",{"type":54,"tag":76,"props":7193,"children":7194},{},[7195],{"type":60,"value":1492},{"type":60,"value":7197},". ROS REP 105 (",{"type":54,"tag":84,"props":7199,"children":7201},{"className":7200},[],[7202],{"type":60,"value":7203},"x",{"type":60,"value":1616},{"type":54,"tag":84,"props":7206,"children":7208},{"className":7207},[],[7209],{"type":60,"value":7210},"y",{"type":60,"value":7212}," left,\n",{"type":54,"tag":84,"props":7214,"children":7216},{"className":7215},[],[7217],{"type":60,"value":7218},"z",{"type":60,"value":7220}," up) matches NCore's rig convention exactly — no rotation needed.",{"type":54,"tag":131,"props":7222,"children":7223},{},[7224,7226,7231],{"type":60,"value":7225},"The ",{"type":54,"tag":84,"props":7227,"children":7229},{"className":7228},[],[7230],{"type":60,"value":6740},{"type":60,"value":7232}," API opens both MCAP and SQLite3 with the same code path;\nonly the file extension differs.",{"type":54,"tag":131,"props":7234,"children":7235},{},[7236],{"type":60,"value":7237},"For multi-bag datasets (one bag per take), one bag = one V4 sequence.",{"type":54,"tag":131,"props":7239,"children":7240},{},[7241],{"type":60,"value":7242},"Keep the bag's recording timestamps (not wall-clock playback) — bag\ntimestamps are µs-quantised already, perfect for NCore.",{"type":54,"tag":783,"props":7244,"children":7246},{"id":7245},"aerial-drone",[7247],{"type":60,"value":414},{"type":54,"tag":70,"props":7249,"children":7250},{},[7251],{"type":60,"value":7252},"Drones add three failure modes on top of the standard mono+lidar \u002F stereo\nrecipes:",{"type":54,"tag":127,"props":7254,"children":7255},{},[7256,7266,7305],{"type":54,"tag":131,"props":7257,"children":7258},{},[7259,7264],{"type":54,"tag":76,"props":7260,"children":7261},{},[7262],{"type":60,"value":7263},"Fast rotation",{"type":60,"value":7265},": pose trajectory must densify enough to keep angular\ndrift per waypoint below ~0.5°. At 100 °\u002Fs yaw rate, that means\nwaypoints every 5 ms — much tighter than a typical 10 Hz LiDAR. Use IMU\nsamples (200 Hz+) as the trajectory backbone; do not rely on per-LiDAR\nposes alone.",{"type":54,"tag":131,"props":7267,"children":7268},{},[7269,7274,7276,7282,7284,7289,7291,7296,7298,7303],{"type":54,"tag":76,"props":7270,"children":7271},{},[7272],{"type":60,"value":7273},"Rolling-shutter cameras",{"type":60,"value":7275}," are common on consumer drones. Set\n",{"type":54,"tag":84,"props":7277,"children":7279},{"className":7278},[],[7280],{"type":60,"value":7281},"ShutterType.ROLLING_TOP_TO_BOTTOM",{"type":60,"value":7283},", supply real ",{"type":54,"tag":84,"props":7285,"children":7287},{"className":7286},[],[7288],{"type":60,"value":1380},{"type":60,"value":7290}," per frame, and carry the per-row shutter delay into the\nintrinsics if your model supports it (",{"type":54,"tag":84,"props":7292,"children":7294},{"className":7293},[],[7295],{"type":60,"value":4250},{"type":60,"value":7297}," on\n",{"type":54,"tag":84,"props":7299,"children":7301},{"className":7300},[],[7302],{"type":60,"value":3789},{"type":60,"value":7304}," for FTheta-like models).",{"type":54,"tag":131,"props":7306,"children":7307},{},[7308,7313],{"type":54,"tag":76,"props":7309,"children":7310},{},[7311],{"type":60,"value":7312},"Wide altitude \u002F range",{"type":60,"value":7314},": a 5+ km loop in raw UTM at the end of the\nflight loses the same precision that the AV first-pose re-referencing\nfixes. For continuous takes under ~2 km, re-reference once to the\ntakeoff pose; for longer flights, segment the bag and emit one V4\nsequence per segment.",{"type":54,"tag":70,"props":7316,"children":7317},{},[7318,7320,7325,7327,7333],{"type":60,"value":7319},"Rig origin on a drone: ",{"type":54,"tag":76,"props":7321,"children":7322},{},[7323],{"type":60,"value":7324},"IMU body frame",{"type":60,"value":7326}," is the canonical choice. All\nextrinsics are then ",{"type":54,"tag":84,"props":7328,"children":7330},{"className":7329},[],[7331],{"type":60,"value":7332},"T_sensor_imu",{"type":60,"value":7334},". Rotor masks are usually unnecessary —\nrotors blur out of the FOV at flight RPM — but include a static mask of any\nfixed gimbal arm visible in the FOV.",{"type":54,"tag":452,"props":7336,"children":7337},{},[],{"type":54,"tag":63,"props":7339,"children":7341},{"id":7340},"robotics-pipeline-shards-r2s",[7342],{"type":60,"value":423},{"type":54,"tag":70,"props":7344,"children":7345},{},[7346,7348,7353],{"type":60,"value":7347},"The r2s (\"robotics-to-sim\") pipeline chains NCore through pose, depth, mask,\nand refinement steps before NuRec. Each step writes its ",{"type":54,"tag":76,"props":7349,"children":7350},{},[7351],{"type":60,"value":7352},"own",{"type":60,"value":7354}," NCore shard\nso that any module can be swapped, re-run, or skipped without rebuilding the\npreceding stages. If you're authoring a converter that feeds r2s — or a\ndownstream module that reads\u002Fwrites intermediate shards — follow this\nnaming + content contract.",{"type":54,"tag":783,"props":7356,"children":7358},{"id":7357},"shard-naming-and-contents",[7359],{"type":60,"value":7360},"Shard naming and contents",{"type":54,"tag":461,"props":7362,"children":7363},{},[7364,7390],{"type":54,"tag":465,"props":7365,"children":7366},{},[7367],{"type":54,"tag":469,"props":7368,"children":7369},{},[7370,7375,7380,7385],{"type":54,"tag":473,"props":7371,"children":7372},{},[7373],{"type":60,"value":7374},"Shard",{"type":54,"tag":473,"props":7376,"children":7377},{},[7378],{"type":60,"value":7379},"Producer",{"type":54,"tag":473,"props":7381,"children":7382},{},[7383],{"type":60,"value":7384},"Components carried",{"type":54,"tag":473,"props":7386,"children":7387},{},[7388],{"type":60,"value":7389},"Notes",{"type":54,"tag":484,"props":7391,"children":7392},{},[7393,7464,7508,7567,7624,7663,7710,7750],{"type":54,"tag":469,"props":7394,"children":7395},{},[7396,7405,7410,7459],{"type":54,"tag":491,"props":7397,"children":7398},{},[7399],{"type":54,"tag":84,"props":7400,"children":7402},{"className":7401},[],[7403],{"type":60,"value":7404},"{name}.zarr.itar",{"type":54,"tag":491,"props":7406,"children":7407},{},[7408],{"type":60,"value":7409},"Ingestion (this skill)",{"type":54,"tag":491,"props":7411,"children":7412},{},[7413,7418,7419,7424,7425,7430,7432,7437,7439,7444,7446,7451,7453],{"type":54,"tag":84,"props":7414,"children":7416},{"className":7415},[],[7417],{"type":60,"value":1369},{"type":60,"value":1700},{"type":54,"tag":84,"props":7420,"children":7422},{"className":7421},[],[7423],{"type":60,"value":1343},{"type":60,"value":1700},{"type":54,"tag":84,"props":7426,"children":7428},{"className":7427},[],[7429],{"type":60,"value":1295},{"type":60,"value":7431}," (static ",{"type":54,"tag":84,"props":7433,"children":7435},{"className":7434},[],[7436],{"type":60,"value":1314},{"type":60,"value":7438}," + identity-or-GPS ",{"type":54,"tag":84,"props":7440,"children":7442},{"className":7441},[],[7443],{"type":60,"value":6645},{"type":60,"value":7445},"), optional ",{"type":54,"tag":84,"props":7447,"children":7449},{"className":7448},[],[7450],{"type":60,"value":1403},{"type":60,"value":7452},", sequence ",{"type":54,"tag":84,"props":7454,"children":7456},{"className":7455},[],[7457],{"type":60,"value":7458},"generic_meta_data.stereo_pairs",{"type":54,"tag":491,"props":7460,"children":7461},{},[7462],{"type":60,"value":7463},"Base shard. All-frame images, no derived data.",{"type":54,"tag":469,"props":7465,"children":7466},{},[7467,7476,7481,7497],{"type":54,"tag":491,"props":7468,"children":7469},{},[7470],{"type":54,"tag":84,"props":7471,"children":7473},{"className":7472},[],[7474],{"type":60,"value":7475},"{name}.poses.zarr.itar",{"type":54,"tag":491,"props":7477,"children":7478},{},[7479],{"type":60,"value":7480},"Pose Estimation (cuVSLAM \u002F KISS-ICP)",{"type":54,"tag":491,"props":7482,"children":7483},{},[7484,7489,7491,7496],{"type":54,"tag":84,"props":7485,"children":7487},{"className":7486},[],[7488],{"type":60,"value":1295},{"type":60,"value":7490}," (per-frame dynamic ",{"type":54,"tag":84,"props":7492,"children":7494},{"className":7493},[],[7495],{"type":60,"value":6645},{"type":60,"value":529},{"type":54,"tag":491,"props":7498,"children":7499},{},[7500,7502,7506],{"type":60,"value":7501},"Full trajectory at every input-frame timestamp; ",{"type":54,"tag":76,"props":7503,"children":7504},{},[7505],{"type":60,"value":3111},{"type":60,"value":7507}," subsampled.",{"type":54,"tag":469,"props":7509,"children":7510},{},[7511,7520,7525,7562],{"type":54,"tag":491,"props":7512,"children":7513},{},[7514],{"type":54,"tag":84,"props":7515,"children":7517},{"className":7516},[],[7518],{"type":60,"value":7519},"{name}.kf.zarr.itar",{"type":54,"tag":491,"props":7521,"children":7522},{},[7523],{"type":60,"value":7524},"Pose Refinement (cuSFM \u002F COLMAP)",{"type":54,"tag":491,"props":7526,"children":7527},{},[7528,7533,7535,7540,7542,7547,7549,7554,7556,7561],{"type":54,"tag":84,"props":7529,"children":7531},{"className":7530},[],[7532],{"type":60,"value":1369},{"type":60,"value":7534}," (keyframe subset), ",{"type":54,"tag":84,"props":7536,"children":7538},{"className":7537},[],[7539],{"type":60,"value":1343},{"type":60,"value":7541}," (refined), ",{"type":54,"tag":84,"props":7543,"children":7545},{"className":7544},[],[7546],{"type":60,"value":1295},{"type":60,"value":7548}," (BA-optimised), ",{"type":54,"tag":84,"props":7550,"children":7552},{"className":7551},[],[7553],{"type":60,"value":1563},{"type":60,"value":7555}," (sparse SfM map, instance ",{"type":54,"tag":84,"props":7557,"children":7559},{"className":7558},[],[7560],{"type":60,"value":1579},{"type":60,"value":529},{"type":54,"tag":491,"props":7563,"children":7564},{},[7565],{"type":60,"value":7566},"Keyframe timestamps must be a strict subset of the base shard's frame timestamps.",{"type":54,"tag":469,"props":7568,"children":7569},{},[7570,7579,7584,7603],{"type":54,"tag":491,"props":7571,"children":7572},{},[7573],{"type":54,"tag":84,"props":7574,"children":7576},{"className":7575},[],[7577],{"type":60,"value":7578},"{name}.depth.zarr.itar",{"type":54,"tag":491,"props":7580,"children":7581},{},[7582],{"type":60,"value":7583},"Depth Generation (Foundation Stereo \u002F MoGe-2 \u002F LiDAR projection)",{"type":54,"tag":491,"props":7585,"children":7586},{},[7587,7589,7594,7595,7601],{"type":60,"value":7588},"per-frame ",{"type":54,"tag":84,"props":7590,"children":7592},{"className":7591},[],[7593],{"type":60,"value":1563},{"type":60,"value":5630},{"type":54,"tag":84,"props":7596,"children":7598},{"className":7597},[],[7599],{"type":60,"value":7600},"depth_\u003Ccamera_id>",{"type":60,"value":7602}," (one entry per keyframe)",{"type":54,"tag":491,"props":7604,"children":7605},{},[7606,7608,7614,7616,7622],{"type":60,"value":7607},"Until a first-class ",{"type":54,"tag":84,"props":7609,"children":7611},{"className":7610},[],[7612],{"type":60,"value":7613},"DepthComponent",{"type":60,"value":7615}," lands in V4, encode dense depth as a per-frame point cloud (camera-frame XYZ from depth + intrinsics). Stash uint16 mm depth in ",{"type":54,"tag":84,"props":7617,"children":7619},{"className":7618},[],[7620],{"type":60,"value":7621},"generic_data[\"depth_mm\"]",{"type":60,"value":7623}," for tools that want pixel-aligned access.",{"type":54,"tag":469,"props":7625,"children":7626},{},[7627,7636,7641,7651],{"type":54,"tag":491,"props":7628,"children":7629},{},[7630],{"type":54,"tag":84,"props":7631,"children":7633},{"className":7632},[],[7634],{"type":60,"value":7635},"{name}.masks.zarr.itar",{"type":54,"tag":491,"props":7637,"children":7638},{},[7639],{"type":60,"value":7640},"Semantic Mask Generation (SAM2 \u002F Grounded-SAM)",{"type":54,"tag":491,"props":7642,"children":7643},{},[7644,7649],{"type":54,"tag":84,"props":7645,"children":7647},{"className":7646},[],[7648],{"type":60,"value":1522},{"type":60,"value":7650}," (per-camera, per-keyframe)",{"type":54,"tag":491,"props":7652,"children":7653},{},[7654,7656,7661],{"type":60,"value":7655},"Masks here are ",{"type":54,"tag":76,"props":7657,"children":7658},{},[7659],{"type":60,"value":7660},"semantic",{"type":60,"value":7662}," (sky, ground, dynamic-object), not just ego-vehicle. Ego masks may live alongside in the same component instance.",{"type":54,"tag":469,"props":7664,"children":7665},{},[7666,7675,7680,7698],{"type":54,"tag":491,"props":7667,"children":7668},{},[7669],{"type":54,"tag":84,"props":7670,"children":7672},{"className":7671},[],[7673],{"type":60,"value":7674},"{name}.poses.scaled.zarr.itar",{"type":54,"tag":491,"props":7676,"children":7677},{},[7678],{"type":60,"value":7679},"Scale Refinement",{"type":54,"tag":491,"props":7681,"children":7682},{},[7683,7688,7690,7696],{"type":54,"tag":84,"props":7684,"children":7686},{"className":7685},[],[7687],{"type":60,"value":1295},{"type":60,"value":7689}," with ",{"type":54,"tag":84,"props":7691,"children":7693},{"className":7692},[],[7694],{"type":60,"value":7695},"generic_meta_data.scale_factor",{"type":60,"value":7697}," and per-frame bias",{"type":54,"tag":491,"props":7699,"children":7700},{},[7701,7703,7708],{"type":60,"value":7702},"Same trajectory schema as ",{"type":54,"tag":84,"props":7704,"children":7706},{"className":7705},[],[7707],{"type":60,"value":7475},{"type":60,"value":7709},"; recovered scale + per-frame bias recorded in metadata.",{"type":54,"tag":469,"props":7711,"children":7712},{},[7713,7722,7727,7738],{"type":54,"tag":491,"props":7714,"children":7715},{},[7716],{"type":54,"tag":84,"props":7717,"children":7719},{"className":7718},[],[7720],{"type":60,"value":7721},"{name}.depth.refined.zarr.itar",{"type":54,"tag":491,"props":7723,"children":7724},{},[7725],{"type":60,"value":7726},"Depth Refinement",{"type":54,"tag":491,"props":7728,"children":7729},{},[7730,7731,7736],{"type":60,"value":7588},{"type":54,"tag":84,"props":7732,"children":7734},{"className":7733},[],[7735],{"type":60,"value":1563},{"type":60,"value":7737}," (refined)",{"type":54,"tag":491,"props":7739,"children":7740},{},[7741,7743,7748],{"type":60,"value":7742},"Same component layout as ",{"type":54,"tag":84,"props":7744,"children":7746},{"className":7745},[],[7747],{"type":60,"value":7578},{"type":60,"value":7749},", with cross-frame scale\u002Fbias and occlusion removal applied.",{"type":54,"tag":469,"props":7751,"children":7752},{},[7753,7762,7767,7796],{"type":54,"tag":491,"props":7754,"children":7755},{},[7756],{"type":54,"tag":84,"props":7757,"children":7759},{"className":7758},[],[7760],{"type":60,"value":7761},"{name}.sim.zarr.itar",{"type":54,"tag":491,"props":7763,"children":7764},{},[7765],{"type":60,"value":7766},"Sensor-Data Simulation (NuRec renderer)",{"type":54,"tag":491,"props":7768,"children":7769},{},[7770,7775,7776,7781,7782,7787,7789,7794],{"type":54,"tag":84,"props":7771,"children":7773},{"className":7772},[],[7774],{"type":60,"value":1369},{"type":60,"value":1700},{"type":54,"tag":84,"props":7777,"children":7779},{"className":7778},[],[7780],{"type":60,"value":1295},{"type":60,"value":1700},{"type":54,"tag":84,"props":7783,"children":7785},{"className":7784},[],[7786],{"type":60,"value":1343},{"type":60,"value":7788}," matching the ",{"type":54,"tag":76,"props":7790,"children":7791},{},[7792],{"type":60,"value":7793},"target",{"type":60,"value":7795}," trajectory",{"type":54,"tag":491,"props":7797,"children":7798},{},[7799,7801,7806,7808,7814],{"type":60,"value":7800},"Same schema as a real base shard — directly consumable by any module. ",{"type":54,"tag":76,"props":7802,"children":7803},{},[7804],{"type":60,"value":7805},"Always",{"type":60,"value":7807}," tag ",{"type":54,"tag":84,"props":7809,"children":7811},{"className":7810},[],[7812],{"type":60,"value":7813},"generic_meta_data.source = \"simulation\"",{"type":60,"value":99},{"type":54,"tag":783,"props":7816,"children":7818},{"id":7817},"component-encoding-until-v4-ships-first-class-depth-mappoints",[7819],{"type":60,"value":7820},"Component encoding until V4 ships first-class depth \u002F mappoints",{"type":54,"tag":70,"props":7822,"children":7823},{},[7824],{"type":60,"value":7825},"The r2s spec references two components that are not yet in upstream V4:",{"type":54,"tag":127,"props":7827,"children":7828},{},[7829,7839],{"type":54,"tag":131,"props":7830,"children":7831},{},[7832,7837],{"type":54,"tag":84,"props":7833,"children":7835},{"className":7834},[],[7836],{"type":60,"value":7613},{"type":60,"value":7838}," (per-pixel uint16 depth, mm, per camera per keyframe).",{"type":54,"tag":131,"props":7840,"children":7841},{},[7842,7848],{"type":54,"tag":84,"props":7843,"children":7845},{"className":7844},[],[7846],{"type":60,"value":7847},"MapPointsComponent",{"type":60,"value":7849}," (sparse SfM points + per-frame observations).",{"type":54,"tag":70,"props":7851,"children":7852},{},[7853],{"type":60,"value":7854},"Until they ship, the safe encodings are:",{"type":54,"tag":127,"props":7856,"children":7857},{},[7858,7889],{"type":54,"tag":131,"props":7859,"children":7860},{},[7861,7866,7868,7873,7875,7880,7882,7887],{"type":54,"tag":76,"props":7862,"children":7863},{},[7864],{"type":60,"value":7865},"Dense depth",{"type":60,"value":7867}," → per-frame ",{"type":54,"tag":84,"props":7869,"children":7871},{"className":7870},[],[7872],{"type":60,"value":1590},{"type":60,"value":7874},", instance name\n",{"type":54,"tag":84,"props":7876,"children":7878},{"className":7877},[],[7879],{"type":60,"value":7600},{"type":60,"value":7881},", points in the camera frame at the keyframe\ntimestamp. Carry the raw uint16 depth array in\n",{"type":54,"tag":84,"props":7883,"children":7885},{"className":7884},[],[7886],{"type":60,"value":7621},{"type":60,"value":7888}," if downstream tools need pixel-aligned access.",{"type":54,"tag":131,"props":7890,"children":7891},{},[7892,7897,7899,7904,7906,7911,7913,7919],{"type":54,"tag":76,"props":7893,"children":7894},{},[7895],{"type":60,"value":7896},"SfM map",{"type":60,"value":7898}," → a single ",{"type":54,"tag":84,"props":7900,"children":7902},{"className":7901},[],[7903],{"type":60,"value":1590},{"type":60,"value":7905}," instance named\n",{"type":54,"tag":84,"props":7907,"children":7909},{"className":7908},[],[7910],{"type":60,"value":1579},{"type":60,"value":7912}," (already produced by the upstream COLMAP converter).\nPer-frame observation tracks, when needed, go in\n",{"type":54,"tag":84,"props":7914,"children":7916},{"className":7915},[],[7917],{"type":60,"value":7918},"generic_meta_data[\"track_observations\"]",{"type":60,"value":99},{"type":54,"tag":70,"props":7921,"children":7922},{},[7923],{"type":60,"value":7924},"Treat these as forward-compatible encodings: when V4 adds the first-class\ncomponents, the migration path is mechanical (copy the same arrays into\nthe new writer) and the data shape is already correct.",{"type":54,"tag":783,"props":7926,"children":7928},{"id":7927},"validator-hooks",[7929],{"type":60,"value":7930},"Validator hooks",{"type":54,"tag":70,"props":7932,"children":7933},{},[7934,7936,7941,7943,7949],{"type":60,"value":7935},"Each module's validator runs after its shard is written. The spec\nassertions that map onto NCore writer-time checks are already enforced\n(timestamp ordering, valid intrinsics, pose-trajectory completeness,\nstrict-increasing LiDAR azimuths). The remaining checks (depth value range,\nmask temporal consistency, scale factor bounds, etc.) are the ",{"type":54,"tag":76,"props":7937,"children":7938},{},[7939],{"type":60,"value":7940},"module's",{"type":60,"value":7942},"\nresponsibility — see the r2s ",{"type":54,"tag":84,"props":7944,"children":7946},{"className":7945},[],[7947],{"type":60,"value":7948},"modules.md",{"type":60,"value":7950}," for the canonical list of per-step\nvalidations.",{"type":54,"tag":452,"props":7952,"children":7953},{},[],{"type":54,"tag":63,"props":7955,"children":7957},{"id":7956},"validation-end-to-end-nurec",[7958],{"type":60,"value":432},{"type":54,"tag":70,"props":7960,"children":7961},{},[7962],{"type":60,"value":7963},"After every conversion, before assuming success:",{"type":54,"tag":216,"props":7965,"children":7966},{},[7967,7987,8014],{"type":54,"tag":131,"props":7968,"children":7969},{},[7970,7978,7980,7985],{"type":54,"tag":76,"props":7971,"children":7972},{},[7973],{"type":54,"tag":84,"props":7974,"children":7976},{"className":7975},[],[7977],{"type":60,"value":89},{"type":60,"value":7979}," — visualise the store. Wrong sensor extrinsics, mirrored\nLiDAR (",{"type":54,"tag":84,"props":7981,"children":7983},{"className":7982},[],[7984],{"type":60,"value":2817},{"type":60,"value":7986}," flip), or rotated cameras are obvious here.",{"type":54,"tag":131,"props":7988,"children":7989},{},[7990,7999,8001,8006,8007,8012],{"type":54,"tag":76,"props":7991,"children":7992},{},[7993],{"type":54,"tag":84,"props":7994,"children":7996},{"className":7995},[],[7997],{"type":60,"value":7998},"ncore_project_pc_to_img",{"type":60,"value":8000}," — projects LiDAR onto camera frames. Crisp\nalignment confirms ",{"type":54,"tag":84,"props":8002,"children":8004},{"className":8003},[],[8005],{"type":60,"value":3338},{"type":60,"value":1700},{"type":54,"tag":84,"props":8008,"children":8010},{"className":8009},[],[8011],{"type":60,"value":3331},{"type":60,"value":8013},", intrinsics, per-ray\ntimestamps, and pose-trajectory density are all correct simultaneously.\nSmearing or doubling = motion-comp error (per-ray timestamps wrong, or\npose trajectory too sparse).",{"type":54,"tag":131,"props":8015,"children":8016},{},[8017,8022,8024,8032,8034,8040,8042,8047,8049,8054,8055,8060,8062,8071],{"type":54,"tag":76,"props":8018,"children":8019},{},[8020],{"type":60,"value":8021},"NuRec end-to-end",{"type":60,"value":8023},". Hand the converted store to the\n",{"type":54,"tag":223,"props":8025,"children":8026},{"href":1199},[8027],{"type":54,"tag":84,"props":8028,"children":8030},{"className":8029},[],[8031],{"type":60,"value":148},{"type":60,"value":8033}," sibling skill — Workflow A wires together\naux-data generation (via ",{"type":54,"tag":84,"props":8035,"children":8037},{"className":8036},[],[8038],{"type":60,"value":8039},"nre-tools",{"type":60,"value":8041},"), 3DGUT training, USDZ export,\nand novel-view rendering, and ",{"type":54,"tag":84,"props":8043,"children":8045},{"className":8044},[],[8046],{"type":60,"value":4378},{"type":60,"value":8048}," documents\nhow to override ",{"type":54,"tag":84,"props":8050,"children":8052},{"className":8051},[],[8053],{"type":60,"value":4352},{"type":60,"value":521},{"type":54,"tag":84,"props":8056,"children":8058},{"className":8057},[],[8059],{"type":60,"value":4360},{"type":60,"value":8061}," so the\ntraining Hydra recipe matches your sensor IDs. For repeatable cluster\nruns, wrap the convert + train + export sequence in an OSMO \u002F Slurm \u002F\nKubernetes pipeline that pins both the\n",{"type":54,"tag":223,"props":8063,"children":8065},{"href":47,"rel":8064},[1051],[8066],{"type":54,"tag":84,"props":8067,"children":8069},{"className":8068},[],[8070],{"type":60,"value":2573},{"type":60,"value":8072}," and NRE container\nversions.",{"type":54,"tag":70,"props":8074,"children":8075},{},[8076,8078,8084],{"type":60,"value":8077},"NuRec's \"Ensure Data Quality\" doc (in the NuRec image) also lists\n",{"type":54,"tag":84,"props":8079,"children":8081},{"className":8080},[],[8082],{"type":60,"value":8083},"check_lidar_camera_sweep_alignment",{"type":60,"value":8085}," and other validators you can run\npost-conversion.",{"type":54,"tag":452,"props":8087,"children":8088},{},[],{"type":54,"tag":63,"props":8090,"children":8092},{"id":8091},"troubleshooting-common-failure-modes-and-the-fix-file",[8093],{"type":60,"value":8094},"Troubleshooting (common failure modes and the fix file)",{"type":54,"tag":70,"props":8096,"children":8097},{},[8098,8100,8106],{"type":60,"value":8099},"The canonical fixes live in code (",{"type":54,"tag":84,"props":8101,"children":8103},{"className":8102},[],[8104],{"type":60,"value":8105},"example_converter.py",{"type":60,"value":8107}," inline comments) and\nin the spec; most \"NuRec produced garbage\" complaints reduce to one of:",{"type":54,"tag":461,"props":8109,"children":8110},{},[8111,8138],{"type":54,"tag":465,"props":8112,"children":8113},{},[8114],{"type":54,"tag":469,"props":8115,"children":8116},{},[8117,8128,8133],{"type":54,"tag":473,"props":8118,"children":8119},{},[8120,8122,8127],{"type":60,"value":8121},"Symptom (NuRec \u002F ",{"type":54,"tag":84,"props":8123,"children":8125},{"className":8124},[],[8126],{"type":60,"value":89},{"type":60,"value":529},{"type":54,"tag":473,"props":8129,"children":8130},{},[8131],{"type":60,"value":8132},"Almost-always cause",{"type":54,"tag":473,"props":8134,"children":8135},{},[8136],{"type":60,"value":8137},"Fix",{"type":54,"tag":484,"props":8139,"children":8140},{},[8141,8171,8201,8219,8247,8289,8313,8331,8368,8398,8422,8452,8494,8531,8549,8587,8628],{"type":54,"tag":469,"props":8142,"children":8143},{},[8144,8149,8159],{"type":54,"tag":491,"props":8145,"children":8146},{},[8147],{"type":60,"value":8148},"Z-flipped surfaces",{"type":54,"tag":491,"props":8150,"children":8151},{},[8152,8157],{"type":54,"tag":84,"props":8153,"children":8155},{"className":8154},[],[8156],{"type":60,"value":2817},{"type":60,"value":8158}," wrong",{"type":54,"tag":491,"props":8160,"children":8161},{},[8162,8164,8169],{"type":60,"value":8163},"Set ",{"type":54,"tag":84,"props":8165,"children":8167},{"className":8166},[],[8168],{"type":60,"value":3499},{"type":60,"value":8170}," for all common automotive spinning LiDARs",{"type":54,"tag":469,"props":8172,"children":8173},{},[8174,8179,8189],{"type":54,"tag":491,"props":8175,"children":8176},{},[8177],{"type":60,"value":8178},"Whole point cloud rotated horizontally",{"type":54,"tag":491,"props":8180,"children":8181},{},[8182,8187],{"type":54,"tag":84,"props":8183,"children":8185},{"className":8184},[],[8186],{"type":60,"value":1713},{"type":60,"value":8188}," starting at 0 instead of real heading",{"type":54,"tag":491,"props":8190,"children":8191},{},[8192,8194,8199],{"type":60,"value":8193},"Derive azimuths from per-column pose data, or rotate ",{"type":54,"tag":84,"props":8195,"children":8197},{"className":8196},[],[8198],{"type":60,"value":3338},{"type":60,"value":8200}," to compensate (consistently)",{"type":54,"tag":469,"props":8202,"children":8203},{},[8204,8209,8214],{"type":54,"tag":491,"props":8205,"children":8206},{},[8207],{"type":60,"value":8208},"Strict-increasing assert in NCore writer",{"type":54,"tag":491,"props":8210,"children":8211},{},[8212],{"type":60,"value":8213},"LiDAR elevations ascending or contain duplicates",{"type":54,"tag":491,"props":8215,"children":8216},{},[8217],{"type":60,"value":8218},"Sort descending, nudge duplicates by 1e-6 rad",{"type":54,"tag":469,"props":8220,"children":8221},{},[8222,8231,8242],{"type":54,"tag":491,"props":8223,"children":8224},{},[8225],{"type":54,"tag":84,"props":8226,"children":8228},{"className":8227},[],[8229],{"type":60,"value":8230},"\"Dynamic poses must cover the full sequence time range\"",{"type":54,"tag":491,"props":8232,"children":8233},{},[8234,8236],{"type":60,"value":8235},"Sequence interval built with ",{"type":54,"tag":84,"props":8237,"children":8239},{"className":8238},[],[8240],{"type":60,"value":8241},"from_start_end(start, end + 1)",{"type":54,"tag":491,"props":8243,"children":8244},{},[8245],{"type":60,"value":8246},"Pass real inclusive end; the helper internally adds 1",{"type":54,"tag":469,"props":8248,"children":8249},{},[8250,8260,8276],{"type":54,"tag":491,"props":8251,"children":8252},{},[8253,8258],{"type":54,"tag":84,"props":8254,"children":8256},{"className":8255},[],[8257],{"type":60,"value":3354},{"type":60,"value":8259}," at \"Get Lidar Point Clouds\"",{"type":54,"tag":491,"props":8261,"children":8262},{},[8263,8268,8269,8274],{"type":54,"tag":84,"props":8264,"children":8266},{"className":8265},[],[8267],{"type":60,"value":3331},{"type":60,"value":521},{"type":54,"tag":84,"props":8270,"children":8272},{"className":8271},[],[8273],{"type":60,"value":3338},{"type":60,"value":8275}," written as float64",{"type":54,"tag":491,"props":8277,"children":8278},{},[8279,8281,8287],{"type":60,"value":8280},"Cast extrinsics to float32 (only ",{"type":54,"tag":84,"props":8282,"children":8284},{"className":8283},[],[8285],{"type":60,"value":8286},"world_world_global",{"type":60,"value":8288}," stays float64)",{"type":54,"tag":469,"props":8290,"children":8291},{},[8292,8297,8302],{"type":54,"tag":491,"props":8293,"children":8294},{},[8295],{"type":60,"value":8296},"Reconstruction loses sub-cm detail at scene scale",{"type":54,"tag":491,"props":8298,"children":8299},{},[8300],{"type":60,"value":8301},"Poses not re-referenced; raw UTM\u002FECEF cast to float32",{"type":54,"tag":491,"props":8303,"children":8304},{},[8305,8311],{"type":54,"tag":84,"props":8306,"children":8308},{"className":8307},[],[8309],{"type":60,"value":8310},"poses = inv(poses[0]) @ poses",{"type":60,"value":8312}," in float64, then cast",{"type":54,"tag":469,"props":8314,"children":8315},{},[8316,8321,8326],{"type":54,"tag":491,"props":8317,"children":8318},{},[8319],{"type":60,"value":8320},"Motion-comp blur \u002F rowing artefacts",{"type":54,"tag":491,"props":8322,"children":8323},{},[8324],{"type":60,"value":8325},"Pose trajectory too sparse",{"type":54,"tag":491,"props":8327,"children":8328},{},[8329],{"type":60,"value":8330},"Combine all available pose sources (every camera × every frame, plus IMU\u002FGPS), unique + sort",{"type":54,"tag":469,"props":8332,"children":8333},{},[8334,8339,8351],{"type":54,"tag":491,"props":8335,"children":8336},{},[8337],{"type":60,"value":8338},"Ghosting \u002F motion blur on rolling-shutter cameras",{"type":54,"tag":491,"props":8340,"children":8341},{},[8342,8344,8349],{"type":60,"value":8343},"Single global timestamp used for all cameras, or ",{"type":54,"tag":84,"props":8345,"children":8347},{"className":8346},[],[8348],{"type":60,"value":4964},{"type":60,"value":8350}," set on rolling sensor",{"type":54,"tag":491,"props":8352,"children":8353},{},[8354,8356,8361,8363],{"type":60,"value":8355},"Per-camera per-frame ",{"type":54,"tag":84,"props":8357,"children":8359},{"className":8358},[],[8360],{"type":60,"value":1380},{"type":60,"value":8362},"; map shutter direction by enum ",{"type":54,"tag":76,"props":8364,"children":8365},{},[8366],{"type":60,"value":8367},"name",{"type":54,"tag":469,"props":8369,"children":8370},{},[8371,8376,8381],{"type":54,"tag":491,"props":8372,"children":8373},{},[8374],{"type":60,"value":8375},"Cuboids floating above ground",{"type":54,"tag":491,"props":8377,"children":8378},{},[8379],{"type":60,"value":8380},"Bottom-center origin not converted",{"type":54,"tag":491,"props":8382,"children":8383},{},[8384,8390,8392],{"type":54,"tag":84,"props":8385,"children":8387},{"className":8386},[],[8388],{"type":60,"value":8389},"centroid_z += dim_z \u002F 2",{"type":60,"value":8391},"; verify with ",{"type":54,"tag":84,"props":8393,"children":8395},{"className":8394},[],[8396],{"type":60,"value":8397},"mean(z) - mean(h)\u002F2 ≈ 0",{"type":54,"tag":469,"props":8399,"children":8400},{},[8401,8406,8411],{"type":54,"tag":491,"props":8402,"children":8403},{},[8404],{"type":60,"value":8405},"Hood \u002F roof rack baked into reconstruction",{"type":54,"tag":491,"props":8407,"children":8408},{},[8409],{"type":60,"value":8410},"Missing ego mask",{"type":54,"tag":491,"props":8412,"children":8413},{},[8414,8416],{"type":60,"value":8415},"Generate per-camera binary ego mask; pass via ",{"type":54,"tag":84,"props":8417,"children":8419},{"className":8418},[],[8420],{"type":60,"value":8421},"MasksComponent.store_camera_masks",{"type":54,"tag":469,"props":8423,"children":8424},{},[8425,8430,8435],{"type":54,"tag":491,"props":8426,"children":8427},{},[8428],{"type":60,"value":8429},"LiDAR projects 50 ms ahead of camera",{"type":54,"tag":491,"props":8431,"children":8432},{},[8433],{"type":60,"value":8434},"Frame-start used as sweep midpoint (or vice versa)",{"type":54,"tag":491,"props":8436,"children":8437},{},[8438,8443,8445,8450],{"type":54,"tag":84,"props":8439,"children":8441},{"className":8440},[],[8442],{"type":60,"value":3213},{"type":60,"value":8444}," = real sweep start; per-ray ",{"type":54,"tag":84,"props":8446,"children":8448},{"className":8447},[],[8449],{"type":60,"value":3228},{"type":60,"value":8451}," linear in column",{"type":54,"tag":469,"props":8453,"children":8454},{},[8455,8460,8477],{"type":54,"tag":491,"props":8456,"children":8457},{},[8458],{"type":60,"value":8459},"Foundation Stereo (or aux-data) cannot find its pair",{"type":54,"tag":491,"props":8461,"children":8462},{},[8463,8465,8470,8472],{"type":60,"value":8464},"Missing ",{"type":54,"tag":84,"props":8466,"children":8468},{"className":8467},[],[8469],{"type":60,"value":1872},{"type":60,"value":8471}," on sequence ",{"type":54,"tag":84,"props":8473,"children":8475},{"className":8474},[],[8476],{"type":60,"value":1822},{"type":54,"tag":491,"props":8478,"children":8479},{},[8480,8481,8487,8489],{"type":60,"value":8163},{"type":54,"tag":84,"props":8482,"children":8484},{"className":8483},[],[8485],{"type":60,"value":8486},"generic_meta_data={\"stereo_pairs\": [{\"left\": ..., \"right\": ...}]}",{"type":60,"value":8488}," on ",{"type":54,"tag":84,"props":8490,"children":8492},{"className":8491},[],[8493],{"type":60,"value":2755},{"type":54,"tag":469,"props":8495,"children":8496},{},[8497,8509,8514],{"type":54,"tag":491,"props":8498,"children":8499},{},[8500,8502,8507],{"type":60,"value":8501},"Livox scan stored as a ",{"type":54,"tag":84,"props":8503,"children":8505},{"className":8504},[],[8506],{"type":60,"value":1423},{"type":60,"value":8508}," but most rays read range 0",{"type":54,"tag":491,"props":8510,"children":8511},{},[8512],{"type":60,"value":8513},"Solid-state non-repetitive doesn't have a column grid",{"type":54,"tag":491,"props":8515,"children":8516},{},[8517,8519,8524,8526],{"type":60,"value":8518},"Use per-frame ",{"type":54,"tag":84,"props":8520,"children":8522},{"className":8521},[],[8523],{"type":60,"value":1590},{"type":60,"value":8525}," (sensor-frame XYZ + per-point µs); skip ",{"type":54,"tag":84,"props":8527,"children":8529},{"className":8528},[],[8530],{"type":60,"value":1423},{"type":54,"tag":469,"props":8532,"children":8533},{},[8534,8539,8544],{"type":54,"tag":491,"props":8535,"children":8536},{},[8537],{"type":60,"value":8538},"Drone reconstruction shows streaks \u002F motion smear",{"type":54,"tag":491,"props":8540,"children":8541},{},[8542],{"type":60,"value":8543},"Trajectory densified at LiDAR rate (10 Hz) on a 200 °\u002Fs yaw motion",{"type":54,"tag":491,"props":8545,"children":8546},{},[8547],{"type":60,"value":8548},"Use IMU samples (200 Hz+) as trajectory backbone; merge per-frame poses on top",{"type":54,"tag":469,"props":8550,"children":8551},{},[8552,8557,8562],{"type":54,"tag":491,"props":8553,"children":8554},{},[8555],{"type":60,"value":8556},"ROS2 raw-Image topic blows up store size 30×",{"type":54,"tag":491,"props":8558,"children":8559},{},[8560],{"type":60,"value":8561},"Stored bitmap bytes verbatim instead of re-encoding to JPEG",{"type":54,"tag":491,"props":8563,"children":8564},{},[8565,8567,8572,8574,8580,8582],{"type":60,"value":8566},"PIL-encode each ",{"type":54,"tag":84,"props":8568,"children":8570},{"className":8569},[],[8571],{"type":60,"value":6829},{"type":60,"value":8573}," to JPEG before ",{"type":54,"tag":84,"props":8575,"children":8577},{"className":8576},[],[8578],{"type":60,"value":8579},"store_frame",{"type":60,"value":8581},"; use ",{"type":54,"tag":84,"props":8583,"children":8585},{"className":8584},[],[8586],{"type":60,"value":6878},{"type":54,"tag":469,"props":8588,"children":8589},{},[8590,8595,8608],{"type":54,"tag":491,"props":8591,"children":8592},{},[8593],{"type":60,"value":8594},"Pipeline downstream module sees real data instead of sim",{"type":54,"tag":491,"props":8596,"children":8597},{},[8598,8600,8606],{"type":60,"value":8599},"Renderer-output shard missing ",{"type":54,"tag":84,"props":8601,"children":8603},{"className":8602},[],[8604],{"type":60,"value":8605},"source",{"type":60,"value":8607}," tag",{"type":54,"tag":491,"props":8609,"children":8610},{},[8611,8612,8618,8620,8626],{"type":60,"value":8163},{"type":54,"tag":84,"props":8613,"children":8615},{"className":8614},[],[8616],{"type":60,"value":8617},"generic_meta_data[\"source\"] = \"simulation\"",{"type":60,"value":8619}," (and ",{"type":54,"tag":84,"props":8621,"children":8623},{"className":8622},[],[8624],{"type":60,"value":8625},"\"model_checkpoint\"",{"type":60,"value":8627},") on the simulated sequence shard",{"type":54,"tag":469,"props":8629,"children":8630},{},[8631,8636,8641],{"type":54,"tag":491,"props":8632,"children":8633},{},[8634],{"type":60,"value":8635},"IMU samples written into a \"sensor\" component and rejected by NuRec",{"type":54,"tag":491,"props":8637,"children":8638},{},[8639],{"type":60,"value":8640},"IMU is not a first-class V4 component",{"type":54,"tag":491,"props":8642,"children":8643},{},[8644,8646,8651],{"type":60,"value":8645},"Drop IMU samples into the pose trajectory (or ",{"type":54,"tag":84,"props":8647,"children":8649},{"className":8648},[],[8650],{"type":60,"value":6674},{"type":60,"value":8652},"); never register an IMU writer",{"type":54,"tag":452,"props":8654,"children":8655},{},[],{"type":54,"tag":63,"props":8657,"children":8659},{"id":8658},"limitations",[8660],{"type":60,"value":8661},"Limitations",{"type":54,"tag":127,"props":8663,"children":8664},{},[8665,8682,8692,8714,8749,8772,8790],{"type":54,"tag":131,"props":8666,"children":8667},{},[8668,8673,8675,8680],{"type":54,"tag":76,"props":8669,"children":8670},{},[8671],{"type":60,"value":8672},"No first-class IMU component.",{"type":60,"value":8674}," V4 has no IMU sensor type — IMU\nsamples must ride in the pose trajectory or in ",{"type":54,"tag":84,"props":8676,"children":8678},{"className":8677},[],[8679],{"type":60,"value":1822},{"type":60,"value":8681},"\n(never as a sensor writer).",{"type":54,"tag":131,"props":8683,"children":8684},{},[8685,8690],{"type":54,"tag":76,"props":8686,"children":8687},{},[8688],{"type":60,"value":8689},"Per-ray LiDAR is the only motion-comp-safe option",{"type":60,"value":8691}," for spinning\nLiDARs. If the dataset only gives frame-level timestamps, expect\nmotion-blur smearing in NuRec; reconstruct per-ray timestamps from\nazimuth or accept the artefact.",{"type":54,"tag":131,"props":8693,"children":8694},{},[8695,8700,8702,8707,8708,8712],{"type":54,"tag":76,"props":8696,"children":8697},{},[8698],{"type":60,"value":8699},"Sub-cm scene detail at world scale",{"type":60,"value":8701}," requires float64 pose math\nfollowed by re-referencing (",{"type":54,"tag":84,"props":8703,"children":8705},{"className":8704},[],[8706],{"type":60,"value":8310},{"type":60,"value":3007},{"type":54,"tag":1439,"props":8709,"children":8710},{},[8711],{"type":60,"value":2796},{"type":60,"value":8713}," writing as float32. Raw UTM\u002FECEF casts to float32 will\nsilently lose centimetre-scale geometry.",{"type":54,"tag":131,"props":8715,"children":8716},{},[8717,8721,8723,8728,8729,8734,8736,8741,8743,8747],{"type":54,"tag":76,"props":8718,"children":8719},{},[8720],{"type":60,"value":7273},{"type":60,"value":8722}," need per-camera per-frame\n",{"type":54,"tag":84,"props":8724,"children":8726},{"className":8725},[],[8727],{"type":60,"value":1380},{"type":60,"value":1437},{"type":54,"tag":1439,"props":8730,"children":8731},{},[8732],{"type":60,"value":8733},"and",{"type":60,"value":8735}," the correct ",{"type":54,"tag":84,"props":8737,"children":8739},{"className":8738},[],[8740],{"type":60,"value":3825},{"type":60,"value":8742},"\nby enum ",{"type":54,"tag":76,"props":8744,"children":8745},{},[8746],{"type":60,"value":8367},{"type":60,"value":8748}," — a single global timestamp will produce ghosting.",{"type":54,"tag":131,"props":8750,"children":8751},{},[8752,8757,8759,8764,8765,8770],{"type":54,"tag":76,"props":8753,"children":8754},{},[8755],{"type":60,"value":8756},"Solid-state non-repetitive LiDAR (Livox-style)",{"type":60,"value":8758}," must use\n",{"type":54,"tag":84,"props":8760,"children":8762},{"className":8761},[],[8763],{"type":60,"value":1590},{"type":60,"value":3078},{"type":54,"tag":84,"props":8766,"children":8768},{"className":8767},[],[8769],{"type":60,"value":1423},{"type":60,"value":8771}," (the latter\nassumes a column grid).",{"type":54,"tag":131,"props":8773,"children":8774},{},[8775,8780,8782,8788],{"type":54,"tag":76,"props":8776,"children":8777},{},[8778],{"type":60,"value":8779},"The converter is one-way.",{"type":60,"value":8781}," There is no ",{"type":54,"tag":84,"props":8783,"children":8785},{"className":8784},[],[8786],{"type":60,"value":8787},"v4 → original",{"type":60,"value":8789}," tool;\nalways keep the source dataset alongside.",{"type":54,"tag":131,"props":8791,"children":8792},{},[8793,8795,8800,8802,8807],{"type":60,"value":8794},"This skill is ",{"type":54,"tag":76,"props":8796,"children":8797},{},[8798],{"type":60,"value":8799},"convert + validate only",{"type":60,"value":8801},". Training, rendering, or\nUSDZ packaging is the ",{"type":54,"tag":84,"props":8803,"children":8805},{"className":8804},[],[8806],{"type":60,"value":148},{"type":60,"value":8808}," skill's job.",{"type":54,"tag":63,"props":8810,"children":8812},{"id":8811},"additional-resources",[8813],{"type":60,"value":450},{"type":54,"tag":127,"props":8815,"children":8816},{},[8817,8828,8838,8848,8858,8867,8877,8890,8903,8916],{"type":54,"tag":131,"props":8818,"children":8819},{},[8820,8822],{"type":60,"value":8821},"Install: ",{"type":54,"tag":84,"props":8823,"children":8825},{"className":8824},[],[8826],{"type":60,"value":8827},"pip install nvidia-ncore",{"type":54,"tag":131,"props":8829,"children":8830},{},[8831,8833],{"type":60,"value":8832},"Source, docs, examples: ",{"type":54,"tag":223,"props":8834,"children":8836},{"href":47,"rel":8835},[1051],[8837],{"type":60,"value":47},{"type":54,"tag":131,"props":8839,"children":8840},{},[8841,8843],{"type":60,"value":8842},"V4 spec: ",{"type":54,"tag":223,"props":8844,"children":8846},{"href":48,"rel":8845},[1051],[8847],{"type":60,"value":48},{"type":54,"tag":131,"props":8849,"children":8850},{},[8851,8853],{"type":60,"value":8852},"Sensor models: ",{"type":54,"tag":223,"props":8854,"children":8856},{"href":1175,"rel":8855},[1051],[8857],{"type":60,"value":1175},{"type":54,"tag":131,"props":8859,"children":8860},{},[8861,8862],{"type":60,"value":1150},{"type":54,"tag":223,"props":8863,"children":8865},{"href":1153,"rel":8864},[1051],[8866],{"type":60,"value":1153},{"type":54,"tag":131,"props":8868,"children":8869},{},[8870,8872],{"type":60,"value":8871},"Conversion guides (PAI, Waymo, COLMAP, ScanNet++):\n",{"type":54,"tag":223,"props":8873,"children":8875},{"href":1164,"rel":8874},[1051],[8876],{"type":60,"value":1164},{"type":54,"tag":131,"props":8878,"children":8879},{},[8880,8882],{"type":60,"value":8881},"Skeleton converter (FILL IN walkthrough):\n",{"type":54,"tag":223,"props":8883,"children":8884},{"href":651},[8885],{"type":54,"tag":84,"props":8886,"children":8888},{"className":8887},[],[8889],{"type":60,"value":651},{"type":54,"tag":131,"props":8891,"children":8892},{},[8893,8895],{"type":60,"value":8894},"NRE training \u002F rendering \u002F USDZ export from a converted store:\n",{"type":54,"tag":223,"props":8896,"children":8897},{"href":1199},[8898],{"type":54,"tag":84,"props":8899,"children":8901},{"className":8900},[],[8902],{"type":60,"value":1199},{"type":54,"tag":131,"props":8904,"children":8905},{},[8906,8908],{"type":60,"value":8907},"HuggingFace dataset catalog and download recipes:\n",{"type":54,"tag":223,"props":8909,"children":8910},{"href":4295},[8911],{"type":54,"tag":84,"props":8912,"children":8914},{"className":8913},[],[8915],{"type":60,"value":4295},{"type":54,"tag":131,"props":8917,"children":8918},{},[8919,8921],{"type":60,"value":8920},"Upstream NCore PAI \u002F Waymo \u002F COLMAP converter targets:\n",{"type":54,"tag":223,"props":8922,"children":8925},{"href":8923,"rel":8924},"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fncore\u002Ftree\u002Fmain\u002Ftools\u002Fdata_converter",[1051],[8926],{"type":60,"value":8923},{"type":54,"tag":8928,"props":8929,"children":8930},"style",{},[8931],{"type":60,"value":8932},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":8934,"total":9092},[8935,8953,8970,8981,8993,9007,9020,9034,9047,9058,9072,9081],{"slug":8936,"name":8936,"fn":8937,"description":8938,"org":8939,"tags":8940,"stars":8950,"repoUrl":8951,"updatedAt":8952},"nemoclaw-user-guide","retrieve NemoClaw documentation and configuration","Guides human users' AI agents to the NemoClaw docs MCP server and canonical Fern documentation in Markdown form. Use when users ask how to install, configure, operate, troubleshoot, secure, or learn NemoClaw with an AI coding assistant. Trigger keywords - nemoclaw docs, use nemoclaw with ai agent, nemoclaw mcp docs, nemoclaw install help, nemoclaw quickstart, nemoclaw markdown docs, llms.txt, agent skills.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[8941,8944,8947],{"name":8942,"slug":8943,"type":15},"Documentation","documentation",{"name":8945,"slug":8946,"type":15},"MCP","mcp",{"name":8948,"slug":8949,"type":15},"Search","search",21777,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FNemoClaw","2026-07-20T06:00:01.461044",{"slug":8954,"name":8954,"fn":8955,"description":8956,"org":8957,"tags":8958,"stars":8967,"repoUrl":8968,"updatedAt":8969},"mcore-build-and-dependency","manage Megatron-LM development environments","Container-based dev environment setup and dependency management for Megatron-LM. Covers acquiring and launching the CI container, uv package management, and updating uv.lock.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[8959,8962,8965],{"name":8960,"slug":8961,"type":15},"Containers","containers",{"name":8963,"slug":8964,"type":15},"Deployment","deployment",{"name":8966,"slug":2935,"type":15},"Python",17049,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FMegatron-LM","2026-07-27T06:06:11.249662",{"slug":8971,"name":8971,"fn":8972,"description":8973,"org":8974,"tags":8975,"stars":8967,"repoUrl":8968,"updatedAt":8980},"mcore-bump-base-image","update NVIDIA PyTorch base images","Bump the NVIDIA PyTorch base image (`nvcr.io\u002Fnvidia\u002Fpytorch:YY.MM-py3`) used by Megatron-LM CI. Covers the two pin sites (GitHub CI in `docker\u002F.ngc_version.dev` and GitLab CI in `.gitlab\u002Fstages\u002F01.build.yml`), the post-bump CI loop (re-run functional tests, refresh golden values, mark broken tests), and the gotchas that bit PRs",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[8976,8979],{"name":8977,"slug":8978,"type":15},"CI\u002FCD","ci-cd",{"name":8963,"slug":8964,"type":15},"2026-07-14T05:25:59.97109",{"slug":8982,"name":8982,"fn":8983,"description":8984,"org":8985,"tags":8986,"stars":8967,"repoUrl":8968,"updatedAt":8992},"mcore-cicd","manage CI\u002FCD pipelines for Megatron-LM","CI\u002FCD reference for Megatron-LM. Covers CI pipeline structure, PR scope labels, triggering internal GitLab CI (which force-pushes the current branch to a pull-request\u002FBRANCH ref — always dry-run and verify the destination first; never run against shared or protected branches), and CI failure investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[8987,8988,8989],{"name":8977,"slug":8978,"type":15},{"name":8963,"slug":8964,"type":15},{"name":8990,"slug":8991,"type":15},"GitHub","github","2026-07-27T06:06:12.278222",{"slug":8994,"name":8994,"fn":8995,"description":8996,"org":8997,"tags":8998,"stars":8967,"repoUrl":8968,"updatedAt":9006},"mcore-create-issue","investigate CI failures and create issues","Investigate a failing GitHub Actions run or job and create a GitHub issue for the failure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[8999,9002,9003],{"name":9000,"slug":9001,"type":15},"Debugging","debugging",{"name":8990,"slug":8991,"type":15},{"name":9004,"slug":9005,"type":15},"Triage","triage","2026-07-14T05:25:57.442089",{"slug":9008,"name":9008,"fn":9009,"description":9010,"org":9011,"tags":9012,"stars":8967,"repoUrl":8968,"updatedAt":9019},"mcore-linting-and-formatting","lint and format Megatron-LM code","Linting and formatting for Megatron-LM. Covers running autoformat.sh, tools (ruff, black, isort, pylint, mypy), and code style rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9013,9016],{"name":9014,"slug":9015,"type":15},"Best Practices","best-practices",{"name":9017,"slug":9018,"type":15},"Code Analysis","code-analysis","2026-07-14T05:25:56.18433",{"slug":9021,"name":9021,"fn":9022,"description":9023,"org":9024,"tags":9025,"stars":8967,"repoUrl":8968,"updatedAt":9033},"mcore-migrate-gpt-to-hybrid","migrate Megatron-LM models to HybridModel","Migration guide for moving Megatron Core GPTModel checkpoints, model providers, training commands, and layer mappings to HybridModel.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9026,9029,9032],{"name":9027,"slug":9028,"type":15},"Machine Learning","machine-learning",{"name":9030,"slug":9031,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:11.777011",{"slug":9035,"name":9035,"fn":9036,"description":9037,"org":9038,"tags":9039,"stars":8967,"repoUrl":8968,"updatedAt":9046},"mcore-onboard-gb200-1node-tests","onboard functional tests for GB200","Onboard 1-node GitHub MR functional tests for GB200 from existing mr-scoped 2-node tests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9040,9043],{"name":9041,"slug":9042,"type":15},"QA","qa",{"name":9044,"slug":9045,"type":15},"Testing","testing","2026-07-14T05:25:53.673039",{"slug":9048,"name":9048,"fn":9049,"description":9050,"org":9051,"tags":9052,"stars":8967,"repoUrl":8968,"updatedAt":9057},"mcore-run-on-slurm","launch distributed training jobs on SLURM","How to launch distributed Megatron-LM training jobs on a SLURM cluster. Covers a minimal sbatch skeleton, environment-variable setup for torch.distributed.run, CUDA_DEVICE_MAX_CONNECTIONS rules across hardware and parallelism modes, container conventions, monitoring, and per-rank failure diagnosis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9053,9054],{"name":8963,"slug":8964,"type":15},{"name":9055,"slug":9056,"type":15},"Infrastructure","infrastructure","2026-07-14T05:25:49.362534",{"slug":9059,"name":9059,"fn":9060,"description":9061,"org":9062,"tags":9063,"stars":8967,"repoUrl":8968,"updatedAt":9071},"mcore-split-pr","split pull requests to reduce review load","Split a PR into multiple PRs to reduce the number of required CODEOWNERS reviewer groups.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9064,9067,9068],{"name":9065,"slug":9066,"type":15},"Code Review","code-review",{"name":8990,"slug":8991,"type":15},{"name":9069,"slug":9070,"type":15},"Pull Requests","pull-requests","2026-07-14T05:26:01.226578",{"slug":9073,"name":9073,"fn":9074,"description":9075,"org":9076,"tags":9077,"stars":8967,"repoUrl":8968,"updatedAt":9080},"mcore-testing","run and manage Megatron-LM tests","Test system for Megatron-LM. Covers test layout, recipe YAML structure, adding and running unit and functional tests, golden values, marker filters, and CI parity.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9078,9079],{"name":9041,"slug":9042,"type":15},{"name":9044,"slug":9045,"type":15},"2026-07-14T05:25:54.928983",{"slug":9082,"name":9082,"fn":9083,"description":9084,"org":9085,"tags":9086,"stars":8967,"repoUrl":8968,"updatedAt":9091},"nightly-sync","manage nightly main-to-dev sync workflows","Domain knowledge for the nightly main-to-dev sync workflow. Covers merge strategy, CI architecture, failure investigation, and known issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9087,9090],{"name":9088,"slug":9089,"type":15},"Automation","automation",{"name":8977,"slug":8978,"type":15},"2026-07-30T05:29:03.275638",496,{"items":9094,"total":2983},[9095,9109,9116,9126,9137,9147],{"slug":161,"name":161,"fn":9096,"description":9097,"org":9098,"tags":9099,"stars":23,"repoUrl":24,"updatedAt":9108},"extract 3D Gaussian assets with Asset Harvester","Use to install and run NVIDIA Asset Harvester (Apache-2.0) to extract per-object 3D Gaussian Splat assets (`gaussians.ply`) from AV NCore V4 clips or masked single images via SparseViewDiT + TokenGS, optionally producing `metadata.yaml` for NuRec object insertion. Do NOT use for full-scene reconstruction (use `nre`) or for inputs without per-object masks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9100,9103,9106,9107],{"name":9101,"slug":9102,"type":15},"3D","3d",{"name":9104,"slug":9105,"type":15},"Computer Vision","computer-vision",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"2026-07-14T05:32:37.216976",{"slug":4,"name":4,"fn":5,"description":6,"org":9110,"tags":9111,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9112,9113,9114,9115],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"slug":148,"name":148,"fn":9117,"description":9118,"org":9119,"tags":9120,"stars":23,"repoUrl":24,"updatedAt":9125},"train 3D Gaussian Splat models with NRE","Use to drive NVIDIA Omniverse NuRec \u002F Neural Reconstruction Engine (NRE) via the public NGC containers nvcr.io\u002Fnvidia\u002Fnre\u002Fnre and nvcr.io\u002Fnvidia\u002Fnre\u002Fnre-tools (NGC_API_KEY required) — train 3DGUT Gaussian reconstructions from NCore clips, generate aux data, render frames or LiDAR sweeps (local or warm `serve-grpc`), export PLY\u002Fdepth\u002Fmesh\u002FUSDZ, edit actors, and evaluate metrics. Do NOT use for per-object asset capture (use `asset-harvester`) or sensor-to-NCore conversion (use `ncore`).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9121,9122,9123,9124],{"name":9101,"slug":9102,"type":15},{"name":9027,"slug":9028,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"2026-07-14T05:32:34.548655",{"slug":9127,"name":9127,"fn":9128,"description":9129,"org":9130,"tags":9131,"stars":23,"repoUrl":24,"updatedAt":9136},"nurec-fixer","harmonize and fine-tune 3D reconstruction frames","Use to run NVIDIA DiffusionHarmonizer (public successor to the older Fixer recipes) to enhance, harmonize, evaluate, or fine-tune novel-view frames from NRE \u002F NuRec \u002F 3DGS \u002F NeRF reconstructions. Do NOT use for training the 3D reconstruction itself (use `nre`) or for sensor-to-NCore conversion (use `ncore`).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9132,9133,9134,9135],{"name":9101,"slug":9102,"type":15},{"name":9027,"slug":9028,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"2026-07-14T05:32:38.465728",{"slug":9138,"name":9138,"fn":9139,"description":9140,"org":9141,"tags":9142,"stars":23,"repoUrl":24,"updatedAt":9146},"nurec-index","route NVIDIA NuRec and asset tasks","Router for NVIDIA NuRec \u002F NRE \u002F 3DGUT \u002F USDZ \u002F NCore V4 \u002F asset harvest \u002F frame cleanup tasks — picks the right sibling (nre, ncore, asset-harvester, nurec-fixer, physical-ai-datasets). Use when the sub-skill is unclear or a multi-stage pipeline is needed; do NOT use for non-NuRec tasks or to run any pipeline itself.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9143,9144,9145],{"name":9101,"slug":9102,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"2026-07-14T05:32:31.902229",{"slug":174,"name":174,"fn":9148,"description":9149,"org":9150,"tags":9151,"stars":23,"repoUrl":24,"updatedAt":9161},"find and download NVIDIA Physical AI datasets","Use when the user wants to find, download, or pick a NVIDIA Physical AI dataset on Hugging Face for autonomous-vehicle, robotics, spatial intelligence, manipulation, or neural-reconstruction workflows. Catalog of every dataset under huggingface.co\u002Fnvidia with the `PhysicalAI-` prefix, organised by domain (AV, Robotics-Manipulation, Robotics-GR00T, Robotics-mindmap, Robotics-NuRec, Spatial Intelligence, Grasping, Healthcare, Sim-Ready, Material properties), with per-dataset size, format, gating, license, and the downstream sibling skill (`ncore`, `nre`, `asset-harvester`, `nurec-fixer`) or upstream tool (Isaac Sim, CARLA, Isaac-GR00T, Cosmos-*) that consumes it. Do NOT use as a runtime — it routes you elsewhere. Trigger keywords: nvidia physical ai dataset, PhysicalAI- dataset, hf nvidia dataset, NCore dataset, NuRec dataset, GR00T dataset, GraspGen, SimReady, Cosmos-Drive-Dreams, Lyra SDG, Open-H-Embodiment, huggingface-cli download, physical_ai_av, dataset gated, RDS-HQ.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[9152,9155,9158,9159,9160],{"name":9153,"slug":9154,"type":15},"Datasets","datasets",{"name":9156,"slug":9157,"type":15},"Hugging Face","hugging-face",{"name":9027,"slug":9028,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},"2026-07-14T05:32:33.182445"]