LoginSignup
11
9

More than 3 years have passed since last update.

OpenVSLAMをVisual Studio 2017でビルドする

Last updated at Posted at 2019-11-04

OpenVSLAM

https://github.com/xdspacelab/openvslam
ぱっと見はORB-SLAMを綺麗にして各種テストデータやWebカメラ対応されたようなイメージ
Ubuntuでのビルドは可能でWSLでもキッチリコンパイル可能

この記事のモチベーション

今後機能拡張を検討するに当たってLinuxネイティブな環境を用意するのがしんどいため、慣れているWindows+VS(VC)環境に持っていく
※エディタにVSCode使えばLinuxでも問題ないんですがやっぱりWindowsが良いんですよね

前提

依存パッケージがいろいろあって、公式では

  • Eigen3
  • g2o
  • SuiteSparse
  • DBoW2(カスタム)
  • yaml-cpp
  • OpenCV
  • gflags
  • glog
  • Pangolin(ビューワ)

が必要と書いてあるのですが、実際にはaptでインストールされるパッケージがあるため、
Windowsでは

  • LAPACK
  • BLAS

を追加で何とかする必要があります。
lapack3はSuiteSparseのビルドに必要なためビルド済みバイナリを使用します。
(全部コンパイルしてもいいけどMinGWを使ったコンパイル環境整えるのが超めんどくさい)

※実はSuiteSparseのCMake時にHunterをEnableにした場合はLAPACK3は自前で用意しなくて良いみたいです
Hunterに関してはこちら ⇒ https://docs.hunter.sh/en/latest/packages/all.html

本題

手順1: リポジトリ集め

OpenVSLAM(本体)

openvslamリポジトリには直下に3rdディレクトリがあるのでそこに必要なパッケージを入れます
また、インストールディレクトリを作っておいた方が良いため、ディレクトリを作っておきます

git clone https://github.com/xdspacelab/openvslam.git
mkdir -p openvslam/3rd/install/include
mkdir -p openvslam/3rd/install/lib
cd openvslam/3rd

Eigen

git clone https://github.com/eigenteam/eigen-git-mirror.git -b 3.3.7

g2o

git clone https://github.com/RainerKuemmerle/g2o.git
cd g2o
git checkout 9b41a4ea5ade8e1250b9c1b279f3a9c098811b5a
cd ../

SuiteSparse(Windowsビルド用バージョン)

git clone https://github.com/jlblancoc/suitesparse-metis-for-windows.git -b v1.5.0

DBoW2(カスタムバージョン)

git clone https://github.com/shinsumicco/DBoW2.git

yaml-cpp

git clone https://github.com/jbeder/yaml-cpp.git

OpenCV

git clone https://github.com/opencv/opencv.git -b 3.4.0

Pangolin

git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
git checkout ad8b5f83222291c51b4800d5a5873b0e90a0cf81
cd ../

glog

git clone https://github.com/google/glog.git -b v0.4.0

gflags

git clone https://github.com/gflags/gflags.git -b v2.2.2

手順2: ビルド済みファイル集め

lapack3

下記にVSでビルドされたバイナリがあります(RefBLAS, LAPACK, LAPACKE)
https://icl.cs.utk.edu/lapack-for-windows/lapack/#libraries
これらを3rd/install/includeと3rd/install/libに入れておきます

手順3: 依存ライブラリをCMakeでビルド

※依存の順番があるためその順に従っていきます
※test/sampleバイナリは不要なので時間短縮するためにビルド設定から省きます

gflags

※BUILDファイルがあるためbuild_ディレクトリを作成

image.png

image.png
ReleaseでビルドしてINSTALLプロジェクトをビルド

glog

※下記のようにgflagsのパスを設定します
※BUILDファイルがあるためbuild_ディレクトリを作成

image.png
ReleaseでビルドしてINSTALLプロジェクトをビルド

yaml-cpp

※buildディレクトリを作成してCMake
image.png
ReleaseでビルドしてINSTALLプロジェクトをビルド

Eigen

※Eigenはヘッダーオンリーライブラリ

image.png
INSTALLプロジェクトをビルド

SuiteSparse

※LAPACK3のパスを設定します(HunterをENABLEにする場合は不要)
※PCREはDISABLEにしておきます
image.png
ReleaseでビルドしてINSTALLプロジェクトをビルド

OpenCV

※公式のページにあるように

cmake \
    -DENABLE_CXX11=ON \
    -DBUILD_DOCS=OFF \
    -DBUILD_EXAMPLES=OFF \
    -DBUILD_JASPER=OFF \
    -DBUILD_OPENEXR=OFF \
    -DBUILD_PERF_TESTS=OFF \
    -DBUILD_TESTS=OFF \
    -DWITH_EIGEN=ON \
    -DWITH_FFMPEG=ON \
    -DWITH_OPENMP=ON \

となるように設定します
※今回のケースでは不要だとは思いますがEIGEN_INCLUDE_PATHは3rd/install/include/eigen3を設定します

image.png
DebugReleaseでビルドしてINSTALLプロジェクトをビルド

DBoW2

※何故かOpenCV_DIRの解決に失敗するため、DBoW2/CMakeLists.txtを下記のように書き換えます

set("OpenCV_DIR" "../install")
find_package(OpenCV QUIET)

image.png
ReleaseでビルドしてINSTALLプロジェクトをビルド
※ちなみにDebugではconvert_orb_vocab.exeのビルドに失敗します

g2o

※こちらも公式にある通りに

cmake \
    -DBUILD_SHARED_LIBS=ON \
    -DBUILD_UNITTESTS=OFF \
    -DG2O_USE_CHOLMOD=ON \
    -DG2O_USE_CSPARSE=ON \
    -DG2O_USE_OPENGL=OFF \
    -DG2O_USE_OPENMP=ON \

となるように設定します

※CHOLMOD_LIBRARYが無いよと言われるはずなので3rd/install/lib/libcholmod.libを設定すると他のライブラリも解決してくれるようになります
※CHOLMOD_INCLUDE_DIRは3rd/install/include/suitesparseを指定します
※CHOLMOD_SOLVERプロジェクトを生成するためにBLAS_LIBRARIES_DIRとLAPACK_LIBRARIES_DIRに3rd/install/libをしています(SuiteSparseでHunterを使用している場合はそのパスを指定します)
※さらにLAPACK_LIBRARIESには"liblapack.lib", BLAS_LIBRARIESには"libblas.lib"のファイルパス設定します
※"Found CHOLMOD and its dependencies"のログが出ていることを確認します
CSPARSEがEXTERNALのディレクトリを参照していると不整合を起こすため、BUILD_CSPARSEをDisableにした上でCSPARSE_INCLUDE_DIRは3rd/install/include/suitesparse, CSPARSE_LIBRARYを3rd/install/lib/libcxsparse.libを参照するようにします
※ビルド時間が長いためG2O_BUILD_EXAMPLEはDIABLEにします
※QT5のエラーは無視します
※必ずSHARED_LIBSを有効にします(CSPARSEがLGPLなため)

image.png

DEBUGでビルドしてINSTALLプロジェクトをビルド
ReleaseでビルドしてINSTALLプロジェクトをビルド

Pangolin

※いったんエラーが出ますが再度ConfigureすればGenerate可能になります
image.png
ReleaseでビルドしてINSTALLプロジェクトをビルド

※私の環境ではランタイムライブラリの設定がマルチスレッド(/MT)になっていたのでマルチスレッドDLL(/MD)にプロジェクト設定で変更してからビルドしました

手順4: OpenVSLAMをCMakeでビルド

※そのままではビルドできません

openvslam/CMakeLists.txtを編集

  • 下記のようにしてC++チェックのFATAL_ERRORを回避(本来はCMAKE_CXX_STANDARDを使うとVC対応ができるとのこと)
    message(STATUS "C++11 support: OK (-std=c++0x)")
#else()
#    message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()
  • -WextraとOgはコメントアウト
  • VCではM_PIは暗黙的に使えないためM_PIを定義に追加
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
add_definitions(-DM_PI=3.14159265358979323846)

Add Entryで項目を追加

  • SUITESPARSE_CHECK_INCLUDE_DIRS: 3rd/install/include/suitesparse
  • SUITESPARSE_CHECK_LIBRARY_DIRS: 3rd/install/lib/Release
  • BLAS_LIBRARIES: install/lib/libblas.lib
  • LAPACK_LIBRARIES: install/lib/liblapack.lib

〇〇_DIRに〇〇Config.cmakeのあるディレクトリを指定

  • 下記のように地道にポチポチするとConfigureが通るようになります image.png image.png

ソースコードの文字コードをSJISに変換

  • BOM無しUTF-8のコードが含まれているためコンパイルに失敗するため
    • 本来はEditorConfigの拡張を使うと良いみたいです
  • openvslam/src以下を全部変換
    • 一括変換ツールを使うと良いです(KanjiTranslatorとかPowerShellで変換コード組むとか)

orb_extractor_node.hに#include <array>を追加

  • 何故か#include <list>しかないため
#include <list>
#include <array>

color_scheme.hに#include を追加

  • std::tolowerに必要だけどincludeされていないため
#include <array>
#include <string>
#include <cctype>

dirent.hの代わりにmsdirent.hを用意

定義を.ccから.hへ移動

  • いくつかのクラスに関して親クラスの仮想関数の定義が被ってしまう問題があるため(コンパイラ依存?)、定義を移動させます
  • 下記のファイルのコンストラクタを.ccから.hへ移動します
    • equirectangular_pose_opt_edge.cc
    • equirectangular_reproj_edge.cc
    • perspective_pose_opt_edge.cc
    • perspective_reproj_edge.cc
    • shot_vertex.cc (SIM3とSE3の2つあります)
    • forward_reproj_edge.cc
    • transform_vertex.cc
    • landmark_vertex.cc
  • 下記のファイルはメンバ関数すべてを.ccから.hへ移動します
    • backward_reproj_edge.cc
    • graph_opt_edge.cc
    • landmark_vertex_container.cc

ビルド

  • プロジェクト設定を改変
    • .DLLが生成される設定になっているので.libが生成されるように変更(openvslamプロジェクトとpangolin_viewerプロジェクト)
      • 出力拡張子も.dllから.libへ変更
    • コンパイラの警告が出れば/NODEFAULTLIBを設定
      • 例えば/NODEFAULTLIB:libcmt.lib
    • 必要なライブラリのリンクを追加
      • 下記のような内容を記述した.cppファイルをプロジェクトに追加すると楽です
#pragma comment(lib, "..\\..\\3rd\\install\\lib\\yaml-cpp.lib")
#pragma comment(lib, "..\\..\\3rd\\install\\lib\\g2o_types_slam3d.lib")
  • コンパイル&リンクがうまくいくことを確認

手順5: 動作確認

  • 必要なDLLを集める

    • Dependenciesを見ると下記のようになっているのでそのdllを集めます
    • FFMPEG(opencv_ffmpeg340_64.dll)は無くても起動でき、Pangolin表示で固まってしまうように見えるので必ず配置します image.png
  • 公式の通りに実行します

まとめ

  • g2oのビルドがめちゃくちゃ大変ですがそこさえキッチリ行えばビルドできます
  • 現状Track timeが100ms以降かかってしまっているのでSSEを有効にしたりFloatの精度を落としたりと工夫が必要そうです
  • パフォーマンスモニタを見ながら一つ一つ潰していけば良さそうです
11
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9