.. Copyright (C) 2026 Mitsubishi Electric Research Laboratories (MERL) .. SPDX-License-Identifier: AGPL-3.0-or-later .. _detailed_instalation: .. _detailed_installation: Detailed Installation ===================== This page expands the recommended installation workflow from :doc:`install`. It lists the shell commands, environment values, package names, and CMake options used by the repository tasks so the build configuration is visible. The values are expanded from the top-level and module-local ``mise.toml`` files, but the steps below use direct commands. ------------- Dependencies ------------- The code was implemented and tested with `Ubuntu 24.04 `_, CUDA 12.8, ``CUDA_ARCH=86``, and ``TORCH_CUDA_ARCH_LIST=8.6``. Adjust the CUDA paths and architecture values for your GPU before building on a different machine. The standard tool versions used by the repository are: - CMake 3.26 - Python 3.12.12 - uv - clang-format 21.1.8, for development formatting checks Set the CUDA and runtime environment from the repository root: .. code-block:: bash export CUDA_HOME=/usr/local/cuda-12.8 export CUDA_VERSION=12.8 export CUDA_ARCH=86 export TORCH_CUDA_ARCH_LIST=8.6 export RERUN_VERSION=0.25.1 export ONNX_VERSION=1.22.0 export ASAN_OPTIONS=protect_shadow_gap=0 export PATH="${CUDA_HOME}/bin:${PATH}" export LD_LIBRARY_PATH="${CUDA_HOME}/lib64:${LD_LIBRARY_PATH:-}" export CPLUS_INCLUDE_PATH="${CUDA_HOME}/targets/x86_64-linux/include:${CPLUS_INCLUDE_PATH:-}" export LIBRARY_PATH="${CUDA_HOME}/targets/x86_64-linux/lib:${LIBRARY_PATH:-}" Install the CUDA repository keyring and standard system dependencies: .. code-block:: bash wget -qO /tmp/cuda-keyring.deb \ https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i /tmp/cuda-keyring.deb rm -f /tmp/cuda-keyring.deb sudo apt-get update sudo apt-get install -y --no-install-recommends \ ninja-build \ g++-14 gcc-14 \ gcc-9 g++-9 \ git libssl-dev \ libboost-all-dev \ libgoogle-glog-dev \ cuda-toolkit-12-8 \ libgflags-dev \ libatlas-base-dev \ libopenblas-dev \ liblapack-dev \ libyaml-cpp-dev \ libeigen3-dev \ libtbb-dev \ libpng-dev \ libjpeg-turbo8-dev \ wget unzip if apt-cache show libcudnn9-cuda-12 >/dev/null 2>&1; then sudo apt-get install -y libcudnn9-cuda-12 elif apt-cache show cudnn9-cuda-12 >/dev/null 2>&1; then sudo apt-get install -y cudnn9-cuda-12 fi Install OpenCV when building the visual place localization module with its OpenCV-dependent components: .. code-block:: bash sudo apt-get install -y libopencv-dev -------------------- Clone the Repository -------------------- Clone the repository and download the third-party libraries: .. code-block:: bash git clone cd slam-mer ./scripts/sync_optional_modules.sh git submodule update --init --recursive ------------------------ Python Tool Environment ------------------------ Create the Python environment from the repository root: .. code-block:: bash uv sync Use optional Python extras when needed: .. code-block:: bash uv sync --extra dev uv sync --extra docs The ``dev`` extra installs pre-commit. The ``docs`` extra installs Sphinx, the Read the Docs theme, Breathe, and Exhale. ----------------------------- Compile Third-Party Libraries ----------------------------- Build GTSAM from source: .. code-block:: bash if [ ! -d "thirdparty/gtsam/build/install" ]; then if git -C thirdparty/gtsam apply --unidiff-zero --reverse --check \ ../gtsam_similarity3.patch >/dev/null 2>&1; then echo "thirdparty/gtsam_similarity3.patch already applied." elif git -C thirdparty/gtsam apply --unidiff-zero --check \ ../gtsam_similarity3.patch; then git -C thirdparty/gtsam apply --unidiff-zero ../gtsam_similarity3.patch echo "Applied thirdparty/gtsam_similarity3.patch." else echo "Failed to apply thirdparty/gtsam_similarity3.patch cleanly." >&2 exit 1 fi else echo "GTSAM install exists, skipping patch application." fi cmake -B thirdparty/gtsam/build -S thirdparty/gtsam \ -DCMAKE_BUILD_TYPE=Release \ -DGTSAM_SUPPORT_NESTED_DISSECTION=OFF \ -DGTSAM_USE_SYSTEM_EIGEN=ON \ -DGTSAM_WITH_TBB=ON \ -DGTSAM_BUILD_TESTS=OFF \ -DGTSAM_BUILD_EXAMPLES_ALWAYS=OFF \ -DGTSAM_BUILD_TIMING_ALWAYS=OFF \ -DGTSAM_BUILD_UNSTABLE=OFF \ -DGTSAM_LIBRARY_TYPE=SHARED \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -DCMAKE_INSTALL_PREFIX=./thirdparty/gtsam/build/install \ -DCMAKE_INSTALL_MESSAGE=NEVER \ -GNinja ninja -C thirdparty/gtsam/build ninja -C thirdparty/gtsam/build install Build Rerun SDK 0.25.1: .. code-block:: bash if [ ! -d "thirdparty/rerun_cpp_sdk" ]; then wget -O thirdparty/rerun_cpp_sdk.zip \ "https://github.com/rerun-io/rerun/releases/download/${RERUN_VERSION}/rerun_cpp_sdk.zip" fi if [ -f "thirdparty/rerun_cpp_sdk.zip" ]; then unzip -o thirdparty/rerun_cpp_sdk.zip -d thirdparty rm -f thirdparty/rerun_cpp_sdk.zip fi cmake -B thirdparty/rerun_cpp_sdk/build -S thirdparty/rerun_cpp_sdk \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=thirdparty/rerun_cpp_sdk/build/install \ -DCUDA_NVRTC_SHORTHASH=IGNORE \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_INSTALL_MESSAGE=NEVER \ -GNinja ninja -C thirdparty/rerun_cpp_sdk/build rerun_sdk ninja -C thirdparty/rerun_cpp_sdk/build install Build PoseLib: .. code-block:: bash cmake -B thirdparty/PoseLib/build -S thirdparty/PoseLib \ -DBUILD_SHARED_LIBS=ON \ -DWITH_BENCHMARK=OFF \ -DBUILD_TESTS=OFF \ -DPYTHON_PACKAGE=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=thirdparty/PoseLib/build/install \ -DCMAKE_INSTALL_MESSAGE=NEVER \ -GNinja ninja -C thirdparty/PoseLib/build ninja -C thirdparty/PoseLib/build install Build FAISS with GPU support: .. code-block:: bash cmake -B thirdparty/faiss/build -S thirdparty/faiss \ -DBUILD_SHARED_LIBS=ON \ -DFAISS_ENABLE_GPU=ON \ -DFAISS_ENABLE_MKL=OFF \ -DBLA_VENDOR=OpenBLAS \ -DFAISS_OPT_LEVEL=avx2 \ -DCUDAToolkit_ROOT=/usr/local/cuda-${CUDA_VERSION} \ -DCMAKE_CUDA_ARCHITECTURES=${CUDA_ARCH} \ -DBUILD_TESTING=OFF \ -DFAISS_ENABLE_PYTHON=OFF \ -DFAISS_ENABLE_C_API=OFF \ -DFAISS_ENABLE_EXTRAS=OFF \ -DFAISS_USE_LTO=OFF \ -DCMAKE_CUDA_COMPILER=/usr/local/cuda-${CUDA_VERSION}/bin/nvcc \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=thirdparty/faiss/build/install \ -DCMAKE_INSTALL_MESSAGE=NEVER \ -GNinja ninja -C thirdparty/faiss/build ninja -C thirdparty/faiss/build install ---------------------- Optional SLAM Modules ---------------------- The optional modules live in ``thirdparty/depth_inference`` and ``thirdparty/visual_place_localization``. Both modules use CUDA 12.8 and ONNX Runtime 1.22.0. The module-local configuration files currently list ``CUDA_ARCH=89``; keep the top-level ``CUDA_ARCH=86`` value above unless you are intentionally changing the target GPU architecture. Prepare and build the depth inference module: .. code-block:: bash cd thirdparty/depth_inference uv sync if [ -d "thirdparty/onnxruntime-linux-x64-gpu-${ONNX_VERSION}" ]; then echo "ONNX Runtime already installed." else wget -O "thirdparty/onnxruntime-linux-x64-gpu-${ONNX_VERSION}.tgz" \ "https://github.com/microsoft/onnxruntime/releases/download/v${ONNX_VERSION}/onnxruntime-linux-x64-gpu-${ONNX_VERSION}.tgz" tar -xvf "thirdparty/onnxruntime-linux-x64-gpu-${ONNX_VERSION}.tgz" -C thirdparty/ rm "thirdparty/onnxruntime-linux-x64-gpu-${ONNX_VERSION}.tgz" fi if [ -d assets/mast3r_onnx_model ]; then echo "MAST3R assets already installed." else gh release download v0.1.0 -p "mast3r_onnx_model.tar.gz.part-*" -D assets/ cat assets/mast3r_onnx_model.tar.gz.part-* > assets/mast3r_onnx_model.tar.gz tar -xvf assets/mast3r_onnx_model.tar.gz -C assets/ rm -f assets/mast3r_onnx_model.tar.gz* fi if [ -d assets/dust3r_onnx_model ]; then echo "DUSt3R assets already installed." else gh release download v0.1.0 -p "dust3r_onnx_model.tar.gz.part-*" -D assets/ cat assets/dust3r_onnx_model.tar.gz.part-* > assets/dust3r_onnx_model.tar.gz tar -xvf assets/dust3r_onnx_model.tar.gz -C assets/ rm -f assets/dust3r_onnx_model.tar.gz fi if [ -d assets/depth_anything_v2_onnx_model ]; then echo "Depth Anything V2 assets already installed." else gh release download v0.1.0 -p "depth_anything_v2_onnx_model.tar.gz" -D assets/ tar -xvf assets/depth_anything_v2_onnx_model.tar.gz -C assets/ rm -f assets/depth_anything_v2_onnx_model.tar.gz fi cmake -B build -S . \ -DCMAKE_BUILD_TYPE=Debug \ -DBUILD_SHARED=ON \ -DBUILD_TESTS=OFF \ -DCMAKE_INSTALL_PREFIX="${PWD}/build/install" \ -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ -GNinja ninja -C build ninja -C build install cd ../.. Prepare and build the visual place localization module. This module reuses the top-level FAISS installation through ``Faiss_DIR``: .. code-block:: bash cd thirdparty/visual_place_localization uv sync archive="thirdparty/onnxruntime-linux-x64-gpu-${ONNX_VERSION}.tgz" install_dir="thirdparty/onnxruntime-linux-x64-gpu-${ONNX_VERSION}" cleanup_archive() { rm -f "${archive}" } trap cleanup_archive EXIT if [ -f "${install_dir}/include/onnxruntime_cxx_api.h" ] && \ [ -f "${install_dir}/lib/libonnxruntime.so" ]; then echo "ONNX Runtime already installed." else if [ -d "${install_dir}" ]; then echo "Removing incomplete ONNX Runtime install at ${install_dir}." rm -rf "${install_dir}" fi mkdir -p thirdparty rm -f "${archive}" df -h thirdparty wget -O "${archive}" \ "https://github.com/microsoft/onnxruntime/releases/download/v${ONNX_VERSION}/onnxruntime-linux-x64-gpu-${ONNX_VERSION}.tgz" df -h thirdparty tar -xzf "${archive}" -C thirdparty/ df -h thirdparty fi if [ -d assets/visual_place_recognition/megaloc_onnx_model ]; then echo "MegaLoc assets already installed." else gh release download v0.1.0 -p "megaloc_onnx_model.tar.gz" \ --dir assets/visual_place_recognition/ tar -xvf assets/visual_place_recognition/megaloc_onnx_model.tar.gz \ -C assets/visual_place_recognition/ rm -f assets/visual_place_recognition/megaloc_onnx_model.tar.gz fi cmake -B build -S . \ -DCMAKE_BUILD_TYPE=Release \ -DUSE_GPU_DATABASE=ON \ -DBUILD_TESTS=OFF \ -DBUILD_SHARED=ON \ -DFaiss_DIR="${PWD}/../faiss/build/install/share/faiss" \ -DCMAKE_INSTALL_PREFIX="${PWD}/build/install" \ -GNinja ninja -C build ninja -C build install cd ../.. ------------------- LibTorch and ALIKED ------------------- ALIKED is compiled from ``utils/aliked`` during the main SLAM-MER build when ``WITH_ALIKED=ON``. Download LibTorch 2.9.0+cu128 before enabling ALIKED: .. code-block:: bash if [ -d "thirdparty/libtorch" ]; then echo "libtorch already present: thirdparty/libtorch" else archive="libtorch-shared-with-deps-2.9.0+cu128.zip" url="https://download.pytorch.org/libtorch/cu128/libtorch-shared-with-deps-2.9.0%2Bcu128.zip" cd thirdparty wget -O "${archive}" "${url}" unzip "${archive}" rm -f "${archive}" cd .. fi -------------------------------- Compile the Visual-SLAM Pipeline -------------------------------- After compiling the third-party libraries and optional modules, configure and install the full SLAM-MER Release build: .. code-block:: bash cmake -B build -S . \ -DCMAKE_BUILD_TYPE=Release \ -DDEPTH_INFERENCE:BOOL=ON \ -DVISUAL_PLACE_LOCALIZATION:BOOL=ON \ -DCMAKE_INSTALL_PREFIX=./build/install \ -GNinja ninja -C build install For a Debug build with verbose logging enabled: .. code-block:: bash cmake -B build -S . \ -DCMAKE_BUILD_TYPE=Debug \ -DLOG_TERMINAL:BOOL=OFF \ -DLOG_INTERFACE:BOOL=ON \ -DLOG_CUDA:BOOL=ON \ -DLOG_TIME:BOOL=ON \ -DLOG_LOCALIZATION:BOOL=ON \ -DLOG_POSE_ESTIMATION:BOOL=ON \ -DLOG_SETTINGS:BOOL=ON \ -DLOG_SLAM:BOOL=ON \ -DLOG_ADJUSTMENT:BOOL=ON \ -DLOG_REPRESENTATION:BOOL=ON \ -DDEPTH_INFERENCE:BOOL=ON \ -DVISUAL_PLACE_LOCALIZATION:BOOL=ON \ -DCMAKE_INSTALL_PREFIX=./build/install \ -GNinja ninja -C build install To build only the core libraries without depth inference or visual place localization: .. code-block:: bash cmake -B build -S . \ -DCMAKE_BUILD_TYPE="${SLAM_MER_BUILD_TYPE:-Release}" \ -DDEPTH_INFERENCE:BOOL=OFF \ -DVISUAL_PLACE_LOCALIZATION:BOOL=OFF \ -DWITH_ALIKED:BOOL="${SLAM_MER_WITH_ALIKED:-ON}" \ -DCMAKE_INSTALL_PREFIX=./build/install \ -GNinja ninja -C build install Set ``SLAM_MER_WITH_ALIKED=OFF`` for the reduced build when ``thirdparty/libtorch`` is unavailable. For the complete CMake option list, see the top-level ``COMPILATION_OPTIONS.md``. To control which transformation templates are compiled, use ``-DSLAM_TRANSFORMATION_INSTANTIATIONS=ALL|POSE3|SIMILARITY3`` (default: ``ALL``). If the Rerun viewer has GUI backend issues, for example in WSL2, start the web viewer in advance: .. code-block:: bash rerun --web-viewer Or run the matching Rerun Python package directly: .. code-block:: bash uvx --from rerun-sdk==X.XX.X rerun --web-viewer Runnable examples, dataset download instructions, and experiment-specific executables are maintained outside this library repository: .. code-block:: text https://github.com/slam-mer/slam-mer_examples This repository currently provides the SLAM-MER libraries and documentation. It does not contain the old dataset download scripts that were previously documented here. ---------- Evaluation ---------- When an example writes a TUM-format trajectory, it can be evaluated with `evo `_. Install evo with: .. code-block:: bash pip install evo For absolute pose errors, use the command by replacing the filenames: .. code-block:: bash evo_ape tum -as ------------- Documentation ------------- Install documentation system packages: .. code-block:: bash sudo apt update sudo apt install -y \ python3-sphinx \ python3-sphinx-rtd-theme \ doxygen \ python3-exhale \ python3-breathe Build the full Sphinx and Doxygen documentation: .. code-block:: bash uv sync --extra docs rm -rf doc/_build doc/api doc/doxygen/_docs cd doc/doxygen doxygen Doxyfile.cfg cd .. make html cd .. For quick prose-only rebuilds that skip Doxygen regeneration, use: .. code-block:: bash cd doc SLAM_MER_DOCS_FAST=1 make html cd .. The generated HTML is written to ``doc/_build/html/index.html``. Register pre-commit and pre-push hooks from the repository root: .. code-block:: bash uv sync --extra dev uv run pre-commit install --install-hooks --hook-type pre-commit --hook-type pre-push After this step, pre-commit runs on every ``git commit`` and pre-push checks run on every ``git push``. ------------------ Debugging the Code ------------------ To enable `Address Sanitizer (ASan) `_, build the project with ``-DUSE_ASAN=ON``. Libraries that use prebuilt LibTorch binaries, such as ALIKED, must not be built with ASan due to GCC incompatibilities. Build the project with ASan enabled using the following commands: .. code-block:: bash cmake -B build -S . \ -DCMAKE_BUILD_TYPE=Debug \ -DWITH_ALIKED=OFF \ -DUSE_ASAN=ON \ -DDEPTH_INFERENCE=OFF \ -DVISUAL_PLACE_LOCALIZATION=OFF \ -DCMAKE_INSTALL_PREFIX=./build/install \ -GNinja ninja -C build install To use `Compute Sanitizer `_ for CUDA memory error detection, build with ``-DUSE_ASAN=OFF``, because ASan and Compute Sanitizer cannot be used together. Build with Compute Sanitizer support: .. code-block:: bash cmake -B build -S . \ -DCMAKE_BUILD_TYPE=Debug \ -DWITH_ALIKED=ON \ -DUSE_ASAN=OFF \ -DCMAKE_INSTALL_PREFIX=./build/install \ -GNinja ninja -C build install Then run the executable from the examples repository with Compute Sanitizer: .. code-block:: bash compute-sanitizer In Release builds, most ``LOG_*`` CMake options are forced off by ``cmake/Options.cmake``. Use a Debug build when verbose runtime logging is needed.