[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-83286":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":14,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":17,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":24,"readmeContent":25,"aiSummary":10,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":26,"discoverSource":27},83286,"ScaRF-SLAM","ori-drs\u002FScaRF-SLAM","ori-drs","Globally Consistent Online Visual Dense Reconstruction","",null,"Python",85,4,2,0,31,17,64.7,"GNU General Public License v3.0",false,"main",true,[],"2026-06-12 04:01:40","\u003Cdiv align=\"center\">\n  \u003Ch1>ScaRF-SLAM🧣: Scale-Consistent Reconstruction with Feed-Forward Models and Classical Visual SLAM\u003C\u002Fh1>\n  \u003Cp>\n    \u003Ca href=\"https:\u002F\u002Fyuhaozhang7.github.io\" target=\"_blank\">Yuhao Zhang\u003C\u002Fa>\u003Csup>1\u003C\u002Fsup>,\n    \u003Ca href=\"https:\u002F\u002Fyifutao.github.io\u002F\" target=\"_blank\">Yifu Tao\u003C\u002Fa>\u003Csup>1\u003C\u002Fsup>,\n    \u003Ca href=\"https:\u002F\u002Fscholar.google.com\u002Fcitations?user=ZxXBaswAAAAJ&hl=en&oi=ao\" target=\"_blank\">Frank Dellaert\u003C\u002Fa>\u003Csup>2\u003C\u002Fsup>,\n    \u003Ca href=\"https:\u002F\u002Fscholar.google.com\u002Fcitations?user=BqV8LaoAAAAJ&hl=en&oi=ao\" target=\"_blank\">Maurice Fallon\u003C\u002Fa>\u003Csup>1\u003C\u002Fsup>\u003Cbr>\n    \u003Csup>1\u003C\u002Fsup>Dynamic Robot Systems Group, University of Oxford &nbsp;&nbsp;\n    \u003Csup>2\u003C\u002Fsup>Georgia Institute of Technology\n  \u003C\u002Fp>\n\n  [\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FarXiv--b31b1b?style=social&logo=arxiv\" alt=\"Arxiv\">](https:\u002F\u002Farxiv.org\u002Fabs\u002F2606.00307v1)\n  [\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FYouTube--red?style=social&logo=youtube\" alt=\"YouTube\">]()\n  [\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGoogle%20Drive--4285F4?style=social&logo=data:image\u002Fsvg+xml;base64,PHN2ZyByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8cGF0aCBmaWxsPSIjNDI4NUY0IiBkPSJNMTIuMDEgMS40ODVjLTIuMDgyIDAtMy43NTQuMDItMy43NDMuMDQ3LjAxLjAyIDEuNzA4IDMuMDAxIDMuNzc0IDYuNjJsMy43NiA2LjU3NGgzLjc2YzIuMDgxIDAgMy43NTMtLjAyIDMuNzQyLS4wNDctLjAwNS0uMDItMS43MDgtMy4wMDEtMy43NzUtNi42MmwtMy43Ni02LjU3NHoiLz4KICA8cGF0aCBmaWxsPSIjMzRBODUzIiBkPSJNNy4yNSAzLjIxNWE3ODkuODI4IDc4OS44NjEgMCAwIDAtMy42MyA2LjMxOUwwIDE1Ljg2OGwxLjg5IDMuMjk4IDEuODg1IDMuMjk3IDMuNjItNi4zMzUgMy42MTgtNi4zMy0xLjg4LTMuMjg3QzguMSA0LjcwNCA3LjI1NSAzLjIyIDcuMjUgMy4yMTR6Ii8+CiAgPHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTkuNTA5IDE1Ljg2OGwtLjIwMy4zNDhjLS4xMTQuMTk4LS45NiAxLjY3Mi0xLjg4IDMuMjg3YTQyMy45MyA0MjMuOTQ4IDAgMCAxLTEuNjk4IDIuOTdjLS4wMS4wMjYgMy4yNC4wNDIgNy4yMjIuMDQyaDcuMjQ0bDEuNzk2LTMuMTU3Yy45OTItMS43MzQgMS44NS0zLjIzIDEuOTA2LTMuMzIzbC4xMDQtLjE2N2gtNy4yNDl6Ii8+Cjwvc3ZnPgo=\" alt=\"Drive\">](https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1yYc3ctsetFZquQLp0JlV6gAeFr_35No8)\n\n  \u003Cimg src=\"media\u002Frecon_demo.jpg\" alt=\"ScaRF-SLAM reconstruction demo\" width=\"90%\">\n\u003C\u002Fdiv>\n\nScaRF-SLAM is a dense visual mapping framework that combines the robustness of classical visual SLAM with the reconstruction capability of modern geometric foundation models (GFMs). Instead of relying on learned geometry for camera tracking, ScaRF-SLAM decouples localization and dense mapping: classical SLAM provides accurate, low-latency pose estimation, while GFMs are used exclusively for feed-forward depth prediction and reconstruction. By anchoring dense mapping to reliable SLAM poses and enforcing lightweight scale-consistency optimization across frames and submaps, the system achieves globally consistent, high-quality 3D reconstruction while remaining robust to limited batch sizes and loop closures. The framework is compatible with a wide range of SLAM configurations — including monocular, stereo, mono-inertial, multi-camera, and fisheye-camera systems — making it practical for real-world robotics and large-scale mapping applications.\n\n**You can take your classical visual SLAM system and wrap ScaRF-SLAM around it!**\n\n## Table of Contents\n\n- [🎬 Preview](#-preview)\n- [📦 Environment Setup](#-environment-setup)\n- [📷 Dataset](#-dataset)\n- [🗺️ Offline Reconstruction](#-offline-reconstruction)\n- [🚀 Online Reconstruction with SLAM](#-online-reconstruction-with-slam)\n- [🔀 Multi-Session Mapping](#-multi-session-mapping)\n- [⚙️ Configuration](#-configuration)\n- [📐 Evaluation](#-evaluation)\n- [📄 License](#-license)\n- [📚 Citation](#-citation)\n\n## 🎬 Preview \n\n\u003Cdiv align=\"center\">\n  \u003Cimg alt=\"\" src=\"media\u002Fslam_demo.gif\" width=\"47%\" hspace=\"6\" vspace=\"6\" \u002F>\n  \u003Cimg alt=\"\" src=\"media\u002Frobot_demo.gif\" width=\"47%\" hspace=\"6\" vspace=\"6\" \u002F>\n  \u003Cbr>\n  \u003Cimg alt=\"\" src=\"media\u002Fwalk_demo.gif\" width=\"47%\" hspace=\"6\" vspace=\"6\" \u002F>\n  \u003Cimg alt=\"\" src=\"media\u002Fmulti_session_demo.gif\" width=\"47%\" hspace=\"6\" vspace=\"6\" \u002F>\n\u003C\u002Fdiv>\n\n## 📦 Environment Setup\n\n### Create Conda Environment\n\n```bash\nconda create -n scarf-slam python=3.11\nconda activate scarf-slam\n```\n\n### Install Depth Anything 3\n\nCheck the [official repository](https:\u002F\u002Fgithub.com\u002Fbytedance-seed\u002Fdepth-anything-3) for more details.\n\n```bash\ncd ~\u002Fgit\u002F\ngit clone git@github.com:ByteDance-Seed\u002FDepth-Anything-3.git\ncd Depth-Anything-3\n\npip install xformers torch\\>=2 torchvision\npip install -e .\n```\n\n(Optional) To include sky masks in DA3 predictions, open `da3.py`, find the `NestedDepthAnything3Net` class, then update its `forward` function by adding the following line just before the return statement:\n```python\noutput.sky = metric_output.sky\n```\n\n### Install Other Dependencies\n\n```bash\npip install rosbags open3d gtsam vismatch\n```\n\n- [`rosbags`](https:\u002F\u002Fternaris.gitlab.io\u002Frosbags\u002F): pure-Python library for reading and writing ROS bag files.\n- [`open3d`](https:\u002F\u002Fwww.open3d.org\u002F): library for 3D data processing and visualization.\n- [`gtsam`](https:\u002F\u002Fgtsam.org\u002F): factor-graph optimization library for robotics and computer vision.\n- [`vismatch`](https:\u002F\u002Fpypi.org\u002Fproject\u002Fvismatch\u002F): unified API for image matching models.\n\n### (Optional) Install OV-SLAM\n\nOV-SLAM refers to [OpenVINS](https:\u002F\u002Fdocs.openvins.com\u002Fgetting-started.html) plus [ov_secondary](https:\u002F\u002Fgithub.com\u002Frpng\u002Fov_secondary) for pose graph optimization.\n\n```bash\nsudo apt update\nsudo apt install libeigen3-dev libboost-all-dev libceres-dev\n\ncd ~\u002Fros2_ws\u002Fsrc\ngit clone git@github.com:rpng\u002Fopen_vins.git\ngit clone git@github.com:ori-drs\u002Fov_secondary_scarf.git\ncd ~\u002Fros2_ws\ncolcon build --symlink-install\n```\n\n## 📷 Dataset\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\"media\u002Fdataset.jpg\" alt=\"ScaRF-SLAM dataset overview\" width=\"99%\">\n\u003C\u002Fdiv>\n\nThe dataset contains five sequences ([download link](https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1yYc3ctsetFZquQLp0JlV6gAeFr_35No8)). Each sequence follows the folder structure below (using `R01` as an example):\n```text\nr01\n├── r01_bag\n│   ├── metadata.yaml\n│   └── r01_bag_0.mcap\n└── r01_gt\n    ├── cloud_gt_fov\n    │   ├── \u003Csec>_\u003Cnsec>.pcd\n    │   ├── \u003Csec>_\u003Cnsec>.pcd\n    │   └── ...\n    ├── cloud_gt.pcd\n    ├── poses_gt.csv\n    └── poses_gt.txt\n```\n\n- `r01_bag`: ROS 2 data bag containing fisheye images and IMU measurements.\n- `cloud_gt_fov`: sparse undistorted LiDAR point clouds at each timestamp in the local camera coordinate frame, with points outside the camera field of view removed. Used for recall evaluation.\n- `cloud_gt.pcd`: dense registered and undistorted LiDAR point cloud. Used for precision and reconstruction error evaluation.\n- `poses_gt.csv`: ground-truth camera trajectory in CSV format.\n- `poses_gt.tum`: ground-truth camera trajectory in TUM format.\n\n\n## 🗺️ Offline Reconstruction\n\nThe easiest way to get started with ScaRF-SLAM is to use offline reconstruction. This mode takes either a ROS2 bag containing images and a trajectory, or an image folder with a corresponding pose file.\n\n### Option 1: ROS2 Bag\n\nThe data is read with the `rosbags` Python package, so a full ROS2 installation is not required for offline reconstruction from an existing bag.\n\nThe ROS2 bag must contain:\n\n- an image topic of type `sensor_msgs\u002Fmsg\u002FCompressedImage`\n- a final trajectory topic of type `nav_msgs\u002Fmsg\u002FPath`\n\nFor example, when using the ORI dataset with ground-truth poses, [ori_insta_offline.yaml](.\u002Fconfig\u002Fscarf_slam\u002Fori_insta_offline.yaml) specifies:\n\n```yaml\nuse_slam: false\nslam_image_topic: \u002Finsta\u002Fcam0\u002Fimage_raw\u002Fcompressed\nslam_final_trajectory_topic: \u002Finsta\u002Fgt_poses\n```\n\nDownload the dataset and run the system:\n\n```bash\npython3 run_mapping.py \\\n  --slam_folder $OUTPUT_FOLDER \\\n  --input_bag $DATASET_BAG \\\n  --config config\u002Fscarf_slam\u002Fori_insta_offline.yaml\n```\n\n### Option 2: Image Folder and Pose File\n\nPrepare an image folder with timestamped image files:\n\n```text\nimage_\u003Csec>_\u003Cnsec>.jpg\nimage_\u003Csec>_\u003Cnsec>.png\n```\n\nPrepare poses in either CSV format `trajectory.csv`:\n\n```text\n# counter, sec, nsec, x, y, z, qx, qy, qz, qw\n0, 1769886345, 745156160, 0, 0, 0, 0, 0, 0, 1\n```\n\nor TUM format `trajectory.txt`:\n\n```text\n# timestamp tx ty tz qx qy qz qw\n1769886345.745156160 0 0 0 0 0 0 1\n```\n\nRun:\n\n```bash\ncd ~\u002Fgit\u002FScaRF-SLAM\npython3 run_mapping.py \\\n  --slam_folder $OUTPUT_FOLDER \\\n  --image_folder $IMAGE_FOLDER \\\n  --poses $TRAJECTORY_FILE \\\n  --config config\u002Fscarf_slam\u002Fori_insta_offline.yaml\n```\n\nThe system first synchronizes the trajectory and image timestamps, then creates a temporary ROS2 MCAP bag with `rosbags`. The temporary bag is written under a `tmp\u002Fsynced_bags` directory next to the output session folder and is deleted automatically when processing finishes.\n\n⚠️ If the images are already rectified pinhole images, update the pinhole intrinsics and resolution in the config file and remove any `fisheye_cam*` sections:\n\n```yaml\n# Example\npinhole_intrinsics: [463.994229, 463.245244, 400, 300]\npinhole_resolution: [800, 600]\n```\n\n### Quick Start Example\n\nYou can use ORI `R05` as a short starting sequence to check that the offline mapper is configured correctly.\n\n## 🚀 Online Reconstruction with SLAM\n\nFor reproducibility and easier integration with other classical SLAM systems, ScaRF-SLAM keeps dense mapping separate from the SLAM frontend. The online reconstruction workflow is:\n\n1. Run a classical SLAM system, such as OV-SLAM, and save the published image, odometry, and trajectory topics as a ROS2 bag. This bag captures the information that an online SLAM system would provide during runtime.\n2. Run the ScaRF-SLAM mapping module on the saved ROS2 bag. The mapper reads the bag incrementally and uses only the poses available at each timestamp, which mimics the behavior of a SLAM frontend running concurrently with dense mapping.\n\nThe SLAM bag must contain:\n\n- an image topic of type `sensor_msgs\u002Fmsg\u002FCompressedImage`, containing one image per frame\n- an odometry topic of type `nav_msgs\u002Fmsg\u002FOdometry`, containing frame poses from accumulated relative motion; this stream is not affected by loop closure and corresponds to the OpenVINS output in OV-SLAM\n- a trajectory topic of type `nav_msgs\u002Fmsg\u002FPath`, where each message stores the current SLAM trajectory snapshot when a new frame is added\n- a final trajectory topic of type `nav_msgs\u002Fmsg\u002FPath`, containing the final trajectory produced by the SLAM system\n\nOdometry is used for mapping keyframe selection. After selecting keyframes, ScaRF-SLAM reads the selected images and the trajectory snapshot available at the current timestamp to get current pose of selected keyframes. It does not use future trajectory data during online-style reconstruction.\n\nConfig example:\n\n```yaml\nuse_slam: true\nslam_trajectory_topic: \u002Fov_slam\u002Ftrajectory\nslam_final_trajectory_topic: \u002Fov_slam\u002Ftrajectory_final\nslam_odometry_topic: \u002Fov_slam\u002Fodometry\nslam_image_topic: \u002Fov_slam\u002Fimage\u002Fcompressed\n```\n\n### Run OV-SLAM\n\nIn terminal 1:\n\n```bash\ncd ~\u002Fgit\u002FScaRF-SLAM\nros2 launch launch\u002Frun_ov_slam.launch.py \\\n  output_path:=$OUTPUT_FOLDER\n```\n\n💾 The SLAM bag will automatically be saved to `$OUTPUT_FOLDER\u002Fov_slam\u002Fov_slam_bag` after a few seconds of inactivity once no new data is received.\n\nIn terminal 2:\n\n```bash\nros2 bag play $DATASET_BAG --clock --rate 0.25\n```\n\nFor reproducibility and stability, use slow playback rate of `0.25`. You can increase it up to `1.0` if the CPU can keep up.\n\n### Run Online Mapping\n\n```bash\npython3 run_mapping.py \\\n  --slam_folder $OUTPUT_FOLDER \\\n  --input_bag $SLAM_BAG \\\n  --config config\u002Fscarf_slam\u002Fori_insta_slam.yaml\n```\n\n### Visualization\n\nFor online visualization, enable `publish_ros2*` in the config and run:\n\n```bash\nrviz2 -d launch\u002Fscarf_slam.rviz\n```\n\nThis can be slow because it publishes and subscribes to large point cloud messages. By default, the point cloud is downsampled by `0.05` for ROS2 publishing.\n\nFor visualization of the final reconstruction:\n\n```bash\npython3 scripts\u002Fvis_utils\u002Fvisualize_pcd.py \\\n  --pcd $OUTPUT_FOLDER\u002Frecon\u002F\u003Ctrajectory>\u002Fpts_global_\u003Csuffix>.pcd \\\n  --downsample 0.25\n```\n\n### Quick Start Example\n\nYou can use ORI `R05` as a short starting sequence for testing the OV-SLAM loop-closure and dense mapping pipeline.\n\n\n## 🔀 Multi-Session Mapping\n\nScaRF-SLAM supports multi-session mapping by reusing the pose graph and saved reconstruction graph from an earlier session. The second SLAM session can load the first session's OV-SLAM pose graph so cross-session loop closures can refine the trajectory. The second mapping run can then load the first session's saved ScaRF-SLAM optimization graph so both sessions are optimized and fused in a shared map.\n\nEach completed mapping session writes a graph artifact under:\n\n```text\n$SESSION_FOLDER\u002Frecon\u002F\u003Ctrajectory>\u002Fopt_graph_\u003Csuffix>\n```\n\nPass this directory to `--prev_slam_folder` when extending a map. You can also pass the previous session folder itself if it contains exactly one `recon\u002F*\u002Fopt_graph*\u002Fmanifest.json`; if multiple graph artifacts exist, pass the exact graph directory.\n\n⚠️ The current implementation assumes that all timestamps in the previous session are earlier than the first timestamp in the new session.\n\n### Run Session 1 SLAM\n\nTerminal 1:\n\n```bash\nros2 launch launch\u002Frun_ov_slam.launch.py \\\n  output_path:=$SESSION_ONE_FOLDER\n```\n\nTerminal 2:\n\n```bash\nros2 bag play $SESSION_ONE_DATA_BAG --clock --rate 0.5\n```\n\n### Run Session 1 Mapping\n\n```bash\npython3 run_mapping.py \\\n  --slam_folder $SESSION_ONE_FOLDER \\\n  --input_bag $SESSION_ONE_FOLDER\u002Fov_slam\u002Fov_slam_bag \\\n  --config config\u002Fscarf_slam\u002Fori_insta_slam.yaml\n```\n\n### Run Session 2 SLAM\n\nLoad the first session's OV-SLAM pose graph when starting the second session:\n\n```bash\nros2 launch launch\u002Frun_ov_slam.launch.py \\\n  output_path:=$SESSION_TWO_FOLDER \\\n  pose_graph_load_path:=$SESSION_ONE_FOLDER\u002Fov_slam\u002Fpose_graph\n```\n\nThen play the second session data bag:\n\n```bash\nros2 bag play $SESSION_TWO_DATA_BAG --clock --rate 0.5\n```\n\n### Run Session 2 Mapping\n\nLoad the first session's ScaRF-SLAM graph when running mapping for the second session:\n\n```bash\npython3 run_mapping.py \\\n  --slam_folder $SESSION_TWO_FOLDER \\\n  --input_bag $SESSION_TWO_FOLDER\u002Fov_slam\u002Fov_slam_bag \\\n  --prev_slam_folder $SESSION_ONE_FOLDER\u002Frecon\u002Fov_slam\u002Fopt_graph_\u003Csuffix> \\\n  --config config\u002Fscarf_slam\u002Fori_insta_slam.yaml\n```\n\n### Quick Start Example\n\nYou can use ORI `R01` as the first session and ORI `R02` as the second session for a compact multi-session mapping check.\n\n## ⚙️ Configuration\n\n### System Configuration\nMain configs live in `config\u002Fscarf_slam\u002F`:\n\n- `ori_insta_offline.yaml`: offline reconstruction with an externally provided trajectory.\n- `ori_insta_mono.yaml`: reconstruction with a non-metric trajectory.\n- `ori_insta_slam.yaml`: online reconstruction with SLAM.\n\nImportant fields:\n\n- `use_slam`: `false` for offline fixed-trajectory reconstruction, `true` for SLAM-backed reconstruction.\n- `slam_odometry_topic`: odometry data topic name, required for online reconstruction.\n- `slam_trajectory_topic`: trajectory snapshot topic name, required for online reconstruction.\n- `slam_final_trajectory_topic`: final trajectory data topic name, required for offline reconstruction.\n- `slam_image_topic`: image data topic name.\n- `is_mono`: enables monocular-only, non-metric trajectory handling. ⚠️ Due to the limited precision of the deep learning model, the trajectory scale should not be excessively small. The system rescales the mean translation magnitude of the first batch to `0.5`, stores the resulting scale factor, and applies it consistently to all subsequent input poses.\n- `trajectory`: output subfolder name under `recon\u002F`.\n- `sec_skip`: minimum time gap, in seconds, between selected mapping keyframes.\n- `kf_distance`: translation threshold, in meters, for keyframe selection. A frame is selected when its odometry motion from the previous selected keyframe exceeds this distance. Disabled for non-metric input trajectory.\n- `kf_distance_large`: alternative translation threshold used after an open-space batch is detected, reducing how densely keyframes are selected in open areas.\n- `kf_angle_deg`: viewing-angle threshold, in degrees, for keyframe selection.\n- `max_distance`: maximum range filtering. Set this to `0` to compute a dynamic value from the current batch trajectory.\n- `pinhole_intrinsics\u002Fresolution`: camera model used by the depth prediction model.\n- `fisheye_cam*`: optional fisheye camera calibration and extrinsics if input images are distorted.\n- `publish_ros2*`: optional ROS2 visualization publishers.\n\n### Output Configuration\n\n`--slam_folder` specifies the output directory used to store the following data:\n\n- `poses_\u003Cmodel_name>.csv`: camera-to-world poses for each mapped keyframe.\n- `poses_\u003Cmodel_name>_ts.csv`: timestamps for each mapped keyframe.\n- `recon\u002F\u003Ctrajectory>\u002Fpts_global*.pcd`: final reconstruction in the world coordinate frame.\n- `recon\u002F\u003Ctrajectory>\u002Fpts_local*\u002F`: per-keyframe point clouds in their local coordinate frames, required for chunk-wise evaluation.\n- `recon\u002F\u003Ctrajectory>\u002Fopt_graph*\u002F`: saved mapping-session state used to resume or extend reconstruction in multi-session mapping.\n\n## 📐 Evaluation\n\nThe evaluation script aligns the reconstruction trajectory to the ground-truth trajectory, optionally refines the point-cloud alignment with ICP, and reports precision\u002Frecall and reconstruction-error metrics.\n\nUse the two ground-truth point-cloud sources differently:\n\n- `cloud_gt.pcd`: dense registered LiDAR map, used for precision and reconstruction-error evaluation.\n- `cloud_gt_fov\u002F`: per-frame LiDAR clouds within the camera field of view, used for recall evaluation.\n\nCommon placeholders:\n\n- `$GT_FOLDER`: sequence ground-truth folder, for example `\u002Fpath\u002Fto\u002Fr01_gt`.\n- `$RECON_FOLDER`: mapping output folder passed as `--slam_folder`.\n- `\u003Ctrajectory>`: trajectory output name under `recon\u002F`.\n- `\u003Cxxx>` and `\u003Cmodel_name>`: suffixes produced by the reconstruction run.\n\n### Global Reconstruction Quality\n\nEvaluate a global reconstruction PCD against the dense GT map for precision and reconstruction error:\n\n```bash\npython3 scripts\u002Feval_utils\u002Fcompare_pts.py \\\n  --gt $GT_FOLDER\u002Fcloud_gt.pcd \\\n  --gt-traj $GT_FOLDER\u002Fposes_gt.txt \\\n  --recon $RECON_FOLDER\u002Frecon\u002F\u003Ctrajectory>\u002Fpts_global_\u003Cxxx>.pcd \\\n  --recon-traj $RECON_FOLDER\u002Frecon\u002F\u003Ctrajectory>\u002Fposes_\u003Cmodel_name>.txt \\\n  --voxel-size 0.02 --threshold 0.03 \\\n  --precision --icp --vis-all\n```\n\nEvaluate recall against the field-of-view GT clouds:\n\n```bash\npython3 scripts\u002Feval_utils\u002Fcompare_pts.py \\\n  --gt $GT_FOLDER\u002Fcloud_gt_fov \\\n  --gt-traj $GT_FOLDER\u002Fposes_gt.txt \\\n  --recon $RECON_FOLDER\u002Frecon\u002F\u003Ctrajectory>\u002Fpts_global_\u003Cxxx>.pcd \\\n  --recon-traj $RECON_FOLDER\u002Frecon\u002F\u003Ctrajectory>\u002Fposes_\u003Cmodel_name>.txt \\\n  --voxel-size 0.02 --threshold 0.03 \\\n  --chamfer-threshold 0.1 \\\n  --recall --icp --vis-all\n```\n\n### Chunk-Wise Reconstruction Quality\n\nChunk-wise evaluation uses the local per-keyframe point clouds in `pts_local_\u003Cxxx>\u002F`. This is useful for measuring local reconstruction quality before global point-cloud accumulation.\n\nEvaluate chunk-wise precision and reconstruction error:\n\n```bash\npython3 scripts\u002Feval_utils\u002Fcompare_pts.py \\\n  --gt $GT_FOLDER\u002Fcloud_gt.pcd \\\n  --gt-traj $GT_FOLDER\u002Fposes_gt.txt \\\n  --recon $RECON_FOLDER\u002Frecon\u002F\u003Ctrajectory>\u002Fpts_local_\u003Cxxx> \\\n  --recon-traj $RECON_FOLDER\u002Frecon\u002F\u003Ctrajectory>\u002Fposes_\u003Cmodel_name>.txt \\\n  --voxel-size 0.02 --threshold 0.03 \\\n  --chunk-m 10.0 \\\n  --precision --icp\n```\n\nEvaluate chunk-wise recall:\n\n```bash\npython3 scripts\u002Feval_utils\u002Fcompare_pts.py \\\n  --gt $GT_FOLDER\u002Fcloud_gt_fov \\\n  --gt-traj $GT_FOLDER\u002Fposes_gt.txt \\\n  --recon $RECON_FOLDER\u002Frecon\u002F\u003Ctrajectory>\u002Fpts_local_\u003Cxxx> \\\n  --recon-traj $RECON_FOLDER\u002Frecon\u002F\u003Ctrajectory>\u002Fposes_\u003Cmodel_name>.txt \\\n  --voxel-size 0.02 --threshold 0.03 \\\n  --chamfer-threshold 0.1 \\\n  --chunk-m 10.0 \\\n  --recall --icp\n```\n\n\n## 📄 License\n\nThis project is released under the [GNU GPL v3.0](.\u002FLICENSE). For third-party dependency licenses, refer to the repositories and packages listed in the [Environment Setup](#-environment-setup) section.\n\nFor commercial purposes, please contact the authors.\n\n## 📚 Citation\n\nIf you find ScaRF-SLAM useful for your research, please consider citing:\n\n```bibtex\n@article{zhang2026scarfslam,\n  title={{ScaRF-SLAM}: Scale-Consistent Reconstruction with Feed-Forward Models and Classical Visual SLAM},\n  author={Zhang, Yuhao and Tao, Yifu and Dellaert, Frank and Fallon, Maurice},\n  journal={arXiv preprint arXiv:2606.00307},\n  year={2026}\n}\n```\n","2026-06-11 04:10:49","CREATED_QUERY"]