이 포스트는 MacOS에서 LDSO를 실행하는 방법을 다루고 있습니다. 그러나 DSO 역시 실행 과정이 크게 다르지 않으니 같은 순서로 따라 하셔도 성공적으로 빌드할 수 있을 겁니다.
Introduction
SLAM, 특히 VSLAM을 공부하면서 다양한 Open source를 빌드하고 실행해 봤습니다. 그러다 1년 전에 DSO를 접하고, 근래에 LDSO를 접하게 되어 Deep dive를 하고 있습니다. Desktop에서는 Ubuntu 20.04 기반 환경에서 작업을 진행 중인데요. Ubuntu 기반의 환경에서는 작업을 하는데 어떠한 에러도 겪지 않았습니다. 그러나 M1 기반의 MacBook에서 LDSO를 빌드하려니 첩첩산중으로 문제가 발생했습니다. 이번 포스트에서는 제가 겪은 에러들에 대한 trouble-shooting과 lesson-learned을 공유해 VSLAM 및 LDSO(DSO)에 흥미가 있으신 분들이 포기하지 않도록 도와드리겠습니다.
[Environment]
OS: macOS Ventura 13.3
Model: MacBook Pro 14, 2021
Install Dependencies
LDSO의 dependency는 공식 repository에서 쉽게 확인할 수 있습니다. Ubuntu 기반 사용자에게는 친절하게 install_dependencies.sh
의 shell script를 제공하지만 OSX 사용자에게는 가차 없습니다. 그냥 Homebrew를 이용해 알아서 설치하라고 합니다. 참고로 필요한 라이브러리들은 Eigen
, glog
, gtest
, Suitesparse
, OpenCV
, libzip
등이 있습니다. Homebrew Formulae를 이용하면 아래의 명령어들을 통해 필요한 라이브러리들을 설치할 수 있습니다.
$ # Install Eigen
$ brew install eigen
$ # Install glog
$ brew install glog
$ # Install gtest
$ brew install gotests
$ # Install Suitesparse
$ brew install suite-sparse
$ # Install OpenCV
$ brew install opencv
$ # Install lipzip
$ brew install lipzip
Install Pangolin
위에서 설치한 라이브러리들은 Ubuntu에서 sudo apt-get
으로, OSX에서는 brew install
로 쉽게 설치할 수 있었습니다. 이제부터는 조금 골치 아픈 Pangolin
을 설치할 것입니다. ORB-SLAM 기반 SLAM을 포함해 여러 Viewer를 필요로 하는 Open source에서 이용하는 Pangolin
은 꽤나 설치가 힘든 라이브러리로 악명이 자자합니다. 이번 포스팅에서는 가장 최근 release인 v0.8을 설치해 보겠습니다.
처음 M1 MacBook이 출시했을 때는 Pangolin
설치가 거의 불가능에 가까웠습니다. M1 architecture에 대해 compiler와 source code 모두 지원하지 않았습니다. 그러나 현재는 큰 문제없이 공식 repository의 README.md를
따라간다면 설치할 수 있을 것입니다.
# Get Pangolin
cd ~/your_fav_code_directory
git clone --recursive https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
# Install dependencies (as described above, or your preferred method)
./scripts/install_prerequisites.sh -m brew all
# Configure and build
cmake -B build
cmake --build build
현재 Pangolin
설치는 크게 어렵지 않습니다. 그러나 만약 ORB-SLAM2나 다른 Open source 사용을 위해 낮은 버전의 설치가 필요한 경우 아래 포스트를 참고 바랍니다. 제가 속한 팀에서 작성한 글로 v0.5를 설치하는 법을 다루고 있습니다.
Compile Source Code
이제 필요한 라이브러리들의 설치가 끝났습니다. 공식 repository는 컴파일을 위해 make_project.sh
라는 shell script를 제공하고 있습니다. 이제 희망을 갖고 해당 스크립트를 실행해 봅시다.
./make_project.sh
스크립트가 아무런 에러 없이 완료된 분은 더 이상 이 챕터를 읽을 필요가 없습니다. 바로 마지막 챕터로 이동해 KITTI sequence 00번을 돌려 LDSO를 확인 해보세요! 아마 저를 비롯한 많은 분들은 저자가 친절하게 만들어준 스크립트가 에러를 뱉을 것입니다. 하나씩 수정해 보도록 합시다.
Trouble Shooting
Clang: -march=native
우선 저는 아래와 같은 에러를 직면하게 되었습니다. Compiler인 clang
이 제일 앞에 나온걸로 봐서 골치 아픈 녀석임이 틀림없죠.
clang: error: the clang compiler does not support '-march=native'
찾아보니 M1으로 architecture 전환이 이뤄지면서 compiler가 이를 따라가지 못하는 호환성 이슈들이 있었습니다. -march=native
옵션도 그중 하나로 보이네요. 현시점에서는 이를 해결하기 위해 두 가지 방법이 있어 보입니다.
-mcpu=apple-m1
Clang 13.0.0부터 -mcpu=apple-m1
옵션을 지원합니다. 이는 이름에서 알 수 있듯이 M1 architecture을 위한 옵션으로 위 문제를 해결할 수 있습니다. 아래 명령어를 통해 clang 설치, 혹은 소프트웨어 관리에서 업데이트 후 사용할 수 있습니다.
$ # Install clang
$ xcode-select --install
-march=native
Clang 15.0.0부터는 문제의 -march=native
옵션 자체를 지원하고 있습니다. 그러나 문제는 xcode를 통한 clang 업데이트에서는 아직 해당 버전을 설치할 수 없습니다. 이 경우 Homebrew를 활용해 직접 업데이트를 할 수 있습니다. 아래 명령어들을 통해 최신 clang을 설치할 수 있습니다.
$ # 1. Install llvm with brew
$ brew install llvm
$ # 2. Check clang version
$ cd /opt/homebrew/opt/llvm
$ clang --version
Homebrew clang version 15.0.6
Target: arm64-apple-darwin22.2.0
Thread model: posix
InstalledDir: /opt/homebrew/opt/llvm/bin
$ # 3. Modify path with the new version
$ export PATH="/opt/homebrew/opt/llvm/bin:$PATH"
저는 첫 번째 방법으로 문제를 해결했으며, 아래는 이를 반영한 CMakeLists.txt
변경사항입니다.
# LDSO/CMakeLists.txt
# Before
# set(CMAKE_CXX_FLAGS "-Wall -Wno-deprecated -march=native -Wno-duplicate-decl-specifier -Wno-ignored-qualifiers -Wno-reorder -Wno-missing-braces")
# After
set(CMAKE_CXX_FLAGS "-Wall -Wno-deprecated -mcpu=apple-m1 -Wno-duplicate-decl-specifier -Wno-ignored-qualifiers -Wno-reorder -Wno-missing-braces")
# LDSO/thirdparty/g2o/CMakeLists.txt
# Before
# SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -march=native")
# SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -march=native")
# After
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -mcpu=apple-m1")
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -mcpu=apple-m1")
Pangolin could not be found because dependency Eigen3 could not be found.
다음은 Pangolin
이슈입니다. 정확히는 Eigen
에 의한 Pangolin
이슈이죠. 실제로 Eigen
만 고쳐준다면 아무 일 없었다는 듯이 통과하는 항목입니다. 아래는 에러 메시지입니다.
Pangolin could not be found because dependency Eigen3 could not be found.
이 경우 원리는 모르겠지만 아래와 같이 CMakeLists.txt
를 수정하면 문제가 해결됩니다. Reference에 출처를 남겼으니 이력을 살펴보시면 도움이 될 것 같습니다.
# Before
find_package(Eigen3 REQUIRED)
# After
find_package(Eigen3 REQUIRED NO_MODULE)
fatal error: 'gflags/gflags.h' file not found
이번에는 gflags/glog
두 개의 라이브러리가 골치 아프게 했습니다. 사실 Ubuntu 환경에서는 아무 문제도 없었던 녀석들인데 이번에는 좀 번거롭게 해서 나중에 시간이 된다면 원인을 밝혀야겠습니다. 우선 모두 Source code build를 통해 재설치 후 CMakeLists.txt
수정을 통해 직접 include 시켜 문제를 해결했습니다. Boost 라이브러리도 중간에 에러 메시지를 뱉어 같이 추가해 주었습니다.
# Add find_package()
find_package(Gflags REQUIRED)
find_package(Boost REQUIRED)
# Add include_directories()
include_directories(
${GFLAGS_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
}
Add SSE2NEON/GLEW header
이번에는 dependencies에 없던 두 개의 헤더가 문제가 되었습니다. 각각 SSE2NEON.h
와 GL/glew.h
파일인데요. 사실 이 지경에 오자 멘탈이 살짝 나가 되는대로 해보자 마인드로 Github에서 두 개의 헤더에 대한 source code를 다운로드하여 직접 추가해 주었습니다. 모두 include 폴더에 추가해 주었으며, 놀랍게도 문제없이 잘 돌아가네요. 아래는 제가 source code를 참고한 repository들입니다.
SSE2NEON.h
GLEW.h
Run KITTI demo example
여기까지 무사히 따라오신 분들은 compile 과정까지 끝냈다고 생각하겠습니다. 이제 우리의 가장 친한 친구 KITTI 데이터셋을 이용해 demo 파일을 실행해 보도록 하겠습니다. 우선 아래 공식 사이트에서 LDSO를 돌리기 위해 필요한 Visual Odometry dataset을 다운로드하도록 하겠습니다. Grayscale로 받아 시간을 단축하도록 합시다. 그래도 22GB이지만 말이죠.
이제 아래 명령어를 입력해 주시면 KITTI demo를 돌릴 수 있습니다. Sequence 00이 LDSO/dataset/Kitti/
에 위치한다고 가정했습니다. 이제 LDSO set-up이 끝났습니다. 저도 이제 본격적으로 MacBook 환경에서 공부를 시작할 예정인데요. 앞으로 LDSO paper review를 포함한 code review로 찾아뵙도록 하겠습니다. 혹시 설치에 어려움을 겪으시는 분은 편하게 제게 메일을 주시거나 댓글 남겨주세요.
./bin/run_dso_kitti \
preset=0 \
files=dataset/Kitti/sequences/00/ \
calib=./examples/Kitti/Kitti00-02.txt
Reference