ORB-SLAM3 setup

Dingool95·2025년 10월 28일

ORB-SLAM3 github

https://github.com/UZ-SLAMLab/ORB_SLAM3

ORB-SLAM3 대비 주요 차이점

  • Inertial odometry 추가
  • RGB-D 카메라 적용 가능.

Pangolin github

SLAM 결과 시각화를 위해서 필요한 패키지
https://github.com/stevenlovegrove/Pangolin

c++14를 위해서 v0.6으로 변경(마지막 c++14호환 버전)

$ git checkout v0.6

아래는 최신 Pangolin임, ORB-SLAM3와 c++ 버전이 다름.
dependencies 설치 script 파일 변경 필요 (아래 출처)
https://medium.com/@smilesajid14/e-unable-to-locate-package-catch2-794c1f1687aa

#!/bin/bash

# exit when any command fails
set -e

MANAGERS=(dnf apt port vcpkg brew pacman)
MANAGER=""
LIST=0
VERBOSE=0
DRYRUN=0
UPDATE=0
REQUIRED_RECOMMENDED_ALL=1
SUDO=""

PKGS_UPDATE=""
PKGS_REQUIRED=()
PKGS_RECOMMENDED=()
PKGS_ALL=()
PKGS_OPTIONS=()

# Parse Command line
PARAMS=""
while (( "$#" )); do
  case "$1" in
    -v|--verbose)
      VERBOSE=1
      shift
      ;;
    -d|--dry-run)
      DRYRUN=1
      shift
      ;;
    -l|--list)
      LIST=1
      shift
      ;;
    -u|--update-package-list)
      UPDATE=1
      shift
      ;;
    -m|--package-manager)
      if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
        MANAGER=($2)
        shift 2
      else
        echo "Error: Argument for $1 is missing" >&2
        exit 1
      fi
      ;;
    -h|--help)
      echo "$0 [-vh] [-m package-manager-list] [required|recommended|all]"
      echo "  -m, --package-manager:     preferred package manager order (default: \"${MANAGERS[*]}\")"
      echo "  -v, --verbose:             verbose output"
      echo "  -d, --dry-run:             print actions, but do not execute"
      echo "  -l, --list:                just list the packages to install"
      echo "  -u, --update-package-list: update package manager package list"
      echo "  -h, --help:                this help message"
      echo " (required|recommended|all) the set of dependencies to select."
      exit 0
      ;;
    -*|--*=) # unsupported flags
      echo "Error: Unsupported flag $1" >&2
      exit 1
      ;;
    *) # preserve positional arguments
      PARAMS="$1"
      shift
      ;;
  esac
done

# Make lower case
PARAMS=$(echo "$PARAMS" | tr '[:upper:]' '[:lower:]' | tr -s "[:blank:]")

# Work out which set of dependencies we're installing
case "$PARAMS" in
  required)
    REQUIRED_RECOMMENDED_ALL=0
    if ((VERBOSE > 0)); then echo "Selecting required dependencies only."; fi
    ;;
  ""|recommended)
    REQUIRED_RECOMMENDED_ALL=1
    if ((VERBOSE > 0)); then echo "Selecting required+recommended dependencies."; fi
    ;;
  all)
    REQUIRED_RECOMMENDED_ALL=2
    if ((VERBOSE > 0)); then echo "Selecting all available dependencies."; fi
    ;;
  *)
    echo "Unrecognized positional argument \"$PARAMS\". Expecting one of (required,recommended [default],all)"
    exit 1
    ;;
esac

# Find an available package manager from the preferred list
# if one has not already been selected manually.
if [ -z "$MANAGER" ]
then
  for m in ${MANAGERS[@]}
  do
      if [ -x "$(command -v $m)" ]; then
          MANAGER="$m"
          break
      fi
  done
fi

# If no package manager is found, exit
if [ -z "$MANAGER" ]
then
      echo "Error: No preferred package managers from list [${MANAGERS[*]}] found. Use -m to select manually." >&2
      exit 1
fi
if ((VERBOSE > 0)); then echo "Using \"$MANAGER\" package manager (select another using -m)"; fi

# Setup prereq commands and packages.
if [[ "$MANAGER" == "apt" ]]; then
    SUDO="sudo"
    PKGS_UPDATE="apt update"
    PKGS_OPTIONS+=(install --no-install-suggests --no-install-recommends)
    if ((DRYRUN > 0));  then PKGS_OPTIONS+=(--dry-run); SUDO=""; fi
    PKGS_REQUIRED+=(libgl1-mesa-dev libwayland-dev libxkbcommon-dev wayland-protocols libegl1-mesa-dev)
    PKGS_REQUIRED+=(libc++-dev libepoxy-dev libglew-dev libeigen3-dev cmake g++ ninja-build)
    PKGS_RECOMMENDED+=(libjpeg-dev libpng-dev)
    PKGS_RECOMMENDED+=(libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libavdevice-dev)
    PKGS_ALL+=(libdc1394-dev libraw1394-dev libopenni-dev python3-dev)

    # Check if catch2 needs to be installed from source
    if ! dpkg -s catch2 &>/dev/null; then
        echo "Catch2 not found in apt repository, installing from source..."
        git clone https://github.com/catchorg/Catch2.git
        cd Catch2
        cmake -Bbuild -H. -DBUILD_TESTING=OFF
        sudo cmake --build build/ --target install
        cd ..
        rm -rf Catch2
    fi
elif [[ "$MANAGER" == "dnf" ]]; then
    SUDO="sudo"
    PKGS_UPDATE="dnf check-update"
    PKGS_OPTIONS+=(install)
    PKGS_REQUIRED+=(wayland-devel libxkbcommon-devel g++ ninja-build)
    PKGS_REQUIRED+=(epoxy-devel eigen3 cmake)
    PKGS_RECOMMENDED+=(libjpeg-devel libpng-devel OpenEXR-devel catch2)
    PKGS_ALL+=(libdc1394-devel libraw1394-devel librealsense-devel openni-devel)
    if ((DRYRUN > 0));  then
        MANAGER="echo $MANAGER"
        SUDO=""
    fi
elif [[ "$MANAGER" == "pacman" ]]; then
    SUDO="sudo"
    PKGS_UPDATE=""
    PKGS_OPTIONS+=(-Syu --needed)
    PKGS_REQUIRED+=(mesa wayland libxkbcommon wayland-protocols libc++ glew eigen cmake gcc ninja)
    PKGS_RECOMMENDED+=(libjpeg-turbo libpng ffmpeg)
    PKGS_ALL+=(libdc1394 libraw1394 openni python3)
    if ((DRYRUN > 0));  then
        MANAGER="echo $MANAGER"
        SUDO=""
    fi
elif [[ "$MANAGER" == "port" ]]; then
    SUDO="sudo"
    PKGS_UPDATE="port sync -q"
    if ((DRYRUN > 0));  then PKGS_OPTIONS+=(-y); SUDO=""; fi
    PKGS_OPTIONS+=(-N install -q)
    PKGS_REQUIRED+=(glew eigen3-devel cmake +gui ninja)
    PKGS_RECOMMENDED+=(libjpeg-turbo libpng openexr tiff ffmpeg-devel lz4 zstd py37-pybind11 catch2)
    PKGS_ALL+=(libdc1394 openni)
elif [[ "$MANAGER" == "brew" ]]; then
    PKGS_OPTIONS+=(install)
    if ((VERBOSE > 0)); then PKGS_OPTIONS+=(--verbose); fi
    PKGS_REQUIRED+=(glew eigen cmake ninja)
    PKGS_RECOMMENDED+=(libjpeg-turbo libpng openexr libtiff ffmpeg lz4 zstd catch2 python-setuptools)
    if ((DRYRUN > 0));  then
        MANAGER="echo $MANAGER"
    fi
elif [[ "$MANAGER" == "vcpkg" ]]; then
    PKGS_OPTIONS+=(install --triplet=x64-windows)
    if ((DRYRUN > 0));  then PKGS_OPTIONS+=(--dry-run); fi
    PKGS_REQUIRED+=(glew eigen3 vcpkg-tool-ninja)
    PKGS_RECOMMENDED+=(libjpeg-turbo libpng openexr tiff ffmpeg lz4 zstd python3 Catch2)
    PKGS_ALL+=(openni2 realsense2)
else
    echo "Error: Don't know how to use \"$MANAGER\", please fix the script." >&2
    exit 1
fi

if ((REQUIRED_RECOMMENDED_ALL < 2)); then PKGS_ALL=(); fi
if ((REQUIRED_RECOMMENDED_ALL < 1)); then PKGS_RECOMMENDED=(); fi

PACKAGES=( "${PKGS_REQUIRED[@]}" "${PKGS_RECOMMENDED[@]}" "${PKGS_ALL[@]}" )

if ((LIST > 0)); then
    echo "${PACKAGES[*]}"
    exit 0
fi

if ((UPDATE > 0)); then
    if ((VERBOSE > 0)); then echo "Requesting \"$MANAGER\" package update."; fi
    $SUDO $PKGS_UPDATE
fi

if ((VERBOSE > 0)); then echo "Requesting install of: ${PACKAGES[*]}"; fi

# Install
$SUDO $MANAGER ${PKGS_OPTIONS[*]} ${PACKAGES[*]}

빌드 옵션으로 설치된 python3 버전으로 맞추도록, 그리고 clang, g++ 중에 clang 컴파일러로 빌드
(c++11을 요구하는데, c++14여서 옵션 및 코드 수정)

$ cmake -B build -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DPython3_EXECUTABLE=/usr/bin/python3 -DCMAKE_CXX_FLAGS="-Wno-error=deprecated-copy -Wno-error=unknown-warning-option"
$ cmake --build build
$ cmake --build build -t pypangolin_pip_install

/home/j/active_ws/Pangolin/CMakeLists.txt 수정

9번 라인 코드 블록
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

88번 라인 코드 블록
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
    add_compile_options(-Wall -Wextra -Werror)
    add_compile_options(-Wno-error=missing-braces)
    # error: ISO C++ prohibits anonymous structs
    # add_compile_options(-Wpedantic)
    # ignore "parentheses" warning for custom "picojson" fork
    add_compile_options(-Wno-parentheses)
    add_compile_options(-Wno-null-pointer-arithmetic)
    # add_compile_options(-Wno-null-pointer-subtraction)
    if(CMAKE_COMPILER_IS_GNUCC)
        add_compile_options(-Werror=maybe-uninitialized)
    endif()
    add_compile_options(-Werror=vla)
endif()

ORB-SLAM3 CMakeLists.txt 수정

33번 코드 default OpenCV 4.4인데 버전 맞춰서 수정
find_package(OpenCV 4.2)
$ export Pangolin_DIR=/PATH_TO/Pangolin/build

ROS example build

.bashrc에 ROS 패키지 경로 추가

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/PATH_TO/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3

build_ros.sh 파일 수정

line 3: cd Examples_old/ROS/ORB_SLAM3

Sophus 라이브러리 system-wise 설치

$ cd /PATH_TO/ORB_SLAM3/Thirdparty/Sophus/build
$ sudo make install

/PATH_TO/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt 수정

line 71
# Node for monocular camera (Augmented Reality Demo)
# rosbuild_add_executable(MonoAR
#src/AR/ros_mono_ar.cc
#src/AR/ViewerAR.h
#src/AR/ViewerAR.cc
#)

# target_link_libraries(MonoAR
#${LIBS}
#)
profile
내 맘대로 요점정리

0개의 댓글