https://github.com/UZ-SLAMLab/ORB_SLAM3
ORB-SLAM3 대비 주요 차이점
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
.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}
#)