［０から構築］仮想環境でORB-SLAM2の構築と任意の動画で軌跡推定［Window11］

特に何もしていないWindowsPCから、自己位置推定ツールであるORB-SLAM2の環境構築を目指します。ドドド素人しか見ないでくれ（）

![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573446/54459186-5844-3267-cb43-d992e7e1cfe8.png)

+ ORB-SLAM2

https://github.com/raulmur/ORB_SLAM2#2-prerequisites


# 1. 注意
ド素人が備忘録として投稿しています。
書き漏らし、間違った知識があれば指摘していただけると大変助かります。
また、この記事は2023年10月現在のものです。


# 2. PC環境
+  OS：Windows 11 Pro
+  CPU：12th Gen Intel(R) Core(TM) i7-1255U   1.70 GHz
+  RAM：16.0 GB 
+  GPU：GPU Intel(R) Iris(R) Xe Graphics
+  必要なストレージ量：　80GBくらいあればうれしい

# 3. 仮想環境の構築
ORB-SLAM2は基本的に無料OSのUbuntuで構築のため、Windowsのままでは難しいです。そのため、仮想環境ソフトを使用し、Ubuntuの使用を可能にします。

1. Windowの設定を変更する
コントロールパネル→プログラム→プログラムと機能→Windowsの機能の有効化または無効化と移動し
「Linux用Windowsサブシステム」
「仮想マシンプラットフォーム」
にチェックを入れる。
![画像2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573446/30ca051e-608f-0964-858b-40889b54d8c0.jpeg)

2.  仮想環境の導入
    今回はVMware17を使用します。サイトから「Workstation 17 Player for Windows」をクリックし、setupをダウンロードします。setupを起動後、「変更を許可しますか？」と出てきますので、特に問題なければすべて”はい”を選択します。サイトには以下のリンクから移動出来ます。
 +  VMware17

https://www.vmware.com/jp/products/workstation-player/workstation-player-evaluation.html

3\.  Ubuntu16.04をダウンロード
以下に挙げるサイトからUbuntu16.04のイメージファイル(約1.6GB)をダウンロードします。
PCに合わせて「Desktop image」の64-bit or 32-bitを選択してください。
少しバージョンが古いですが、これはORB-SLAM2側が指定しているため従います。18.04 ,20.04でも構築したことがありますが、16.04が一番エラー対処が簡単だと思います。
ダウンロード場所は任意ですが、この後の操作でディレクトリ（ファイルのある場所）を参照する操作を行います。「どこに入れたっけ」とならないよう注意しましょう。

 https://releases.ubuntu.com/16.04/

4\.  仮想マシンの作成
VMware Workstation17 playerを起動し、「新規仮想マシンの作成」を選択します。「参照」から、先ほどダウンロードしたUbuntuのイメージファイルを選択します。
写真のように「Ubuntu64ビット16.04.7が検出されました。」と表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573446/9b944097-b86c-b60f-079c-0420e593bf23.png)
次に進み、名前やパスワードを入力してください。指定はありません。
その次では、マシンの名前とファイル位置を指定することが出来ます。こちらも自由ですが、かなりの容量を確保する必要があるため、注意が必要です。
この後に「ディスク容量の指定」と出てきます。これは、80GB以上は割り当てて頂きたいです。環境にもよりますが、容量が少ないと後のUpdate作業でエラーが出ます。厳密にどこまで減らせるかは分かりませんが、35GBだとエラーが出ました。
RAMの割り当ては8GBまで上げるのが理想です。4GBはギリギリでした。
あとはUbuntu16.04の初期設定になります。名前とパスワード設定するだけで完了するはずです。

# 4. ORB-SLAM2の構築
ORB-SLAM2を動かすには、複数のアプリケーションが必要となります。以下の順番で構築しました。
今回は、すべてHome直下のディレクトリに置いて設定しています。

ターミナル（端末）と検索するか、`ctrl+Alt+t`でプロンプトを開きます。基本的に１行ごとにコマンドを入力していきます。

+ 構築に必須なものをインストール

```Diff 
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git
sudo apt-get install cmake
sudo apt install -y curl
````

+ OpenGL

```Diff 
sudo apt-get install libglu1-mesa-dev 
sudo apt-get install libglew-dev
````

+ LIBVIC

```Diff 
sudo apt-get install libjpeg-dev
sudo apt-get install libusb-1.0-0-dev

cd ~
git clone https://github.com/ktossell/libuvc.git
cd libuvc
mkdir build && cd build
cmake ..
make
sudo make install
````

+ Pangolin

```DIff
sudo apt-get install libpython2.7-dev
sudo apt-get install libavcodec-dev libavutil-dev libavformat-dev libswscale-dev
sudo apt-get install libdc1394-22-dev libraw1394-dev
sudo apt-get install libpng12-dev libtiff5-dev libopenexr-de

cd ~
git clone https://github.com/zzx2GH/Pangolin.git
````
※注意
公式の`git clone https://github.com/stevenlovegrove/Pangolin.git`から
`git clone https://github.com/zzx2GH/Pangolin.git`に変更しています。自分の場合バージョン違いでエラーが出たため、古いやつを入れた格好になります。

エラー対処
このままcmakeすると、ORB-SLAM2の実行時にエラーが出る場合があるので書き換えます。(ただし、仮想環境でない場合は、この作業はいらないと思います。実機のUbuntu18.04で構築した時にはこのエラーが出ませんでした。)
`Pangolin/src/display/device`にある`「display_x11.cpp」`を開く。
123、124行目にある
```Diff_C
GLX_SAMPLE_BUFFERS     , glx_sample_buffers,
GLX_SAMPLES            , glx_sample_buffers > 0 ? glx_samples : 0,
````
をコメントアウト(or削除)
```Diff_C
//GLX_SAMPLE_BUFFERS   , glx_sample_buffers,
//GLX_SAMPLES          , glx_sample_buffers > 0 ? glx_samples : 0,
````
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573446/0e414ecb-04d8-753c-fc40-d5554f531f6c.png)

保存後cmake

```Diff
cd Pangolin
mkdir build
cd build
cmake ..
cmake --build .
sudo make install
````
make ..を実行後にテキストを編集した場合（エラーが出ることを確認した場合）は、Pangolin/buildファイル内をすべて消してからもう一度cmake ..を実行します。（重要）

+ Eigen3
```Diff
cd ~
wget https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz
tar xvf eigen-3.3.7.tar.gz
cd eigen-3.3.7
mkdir build && cd build
cmake ..
sudo make install
````
+ OpenCV
```Diff
sudo apt-get install build-essential
sudo apt-get install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libpng-dev libtiff-dev libjasper-dev

cd ~
wget https://github.com/opencv/opencv/archive/3.1.0.tar.gz
tar xvf 3.1.0.tar.gz
cd opencv-3.1.0
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4
sudo make install
````
make -J○は使用するRAM数を指定できます。仮想環境構築時にどの程度割り当てたかによって、適宜変更してください。（とても時間かかる）

cmake時のエラー対処
````
CMake Error at CMakeLists.txt:32 (find_package):
````
DBoW2/CMakeLists.txtの32行目に、
````
find_package(OpenCV REQUIRED)
````
とあります。その上の行に、
```
set(OpenCV_DIR "~/opencv-3.1.0/build")
```
を追加しました。
+ g2o
```Diff
cd ~
git clone https://github.com/RainerKuemmerle/g2o.git
cd g2o
mkdir build
cd build
cmake ..
make
sudo make install
```
※make時間かかります
cmakeのエラーが出てくる場合があります。
```
Cmake Error at Cmakelists.txt:1 (cmake_minimum_required):
cmake 3.14 or higher is required. You are runnninng version 3.5.1
````
・ エラー対処①
~/opencv-3.1.0/build/g2o/cmakeList.txtの一行目をVERSION3.14→3.5に書き換えました。

・ エラー対処②
````
CMake Error at g2o/core/CMakeLists.txt:46 (target_compile_features):
target_compile_features specified unknown feature "cxx_std_14" for target "core".
````

`g2o/g2o/core/CMakeLists.txt`の46行目の
```Diff_C
target_compile_features(core PUBLIC cxx_std_14)
````
を以下のように書き換えました。
```Diff_C
set (CMAKE_CXX_STANDARD 14)
````



+ ROS
Ubuntu16.04を使用しているので、ROSのバージョンはkineticです。

````
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt install curl # if you haven't already installed curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt-get install python-rosinstall
````
+ ORB-SALM2
````
cd ~
git clone https://github.com/raulmur/ORB_SLAM2.git
cd ORB_SLAM2
chmod +x build.sh
./build.sh
````
build時のエラー対処①
````
error: ‘usleep’ was not declared in this scope
````
'usleep'を定義するヘッダー『#include "unistd.h"』を以下のディレクトリに追加しました。
`~/ORB_SLAM2/src/LocalMapping.cc`
`~/ORB_SLAM2/src/LoopClosing.cc`
`~/ORB_SLAM2/src/System.cc`
`~/ORB_SLAM2/src/Tracking.cc`
`~/ORB_SLAM2/src/Viewer.cc`
`~/ORB_SLAM2/Examples/Monocular/mono_euroc.cc`
`~/ORB_SLAM2/Examples/Monocular/mono_kitti.cc`
`~/ORB_SLAM2/Examples/Monocular/mono_tum.cc`
`~/ORB_SLAM2/Examples/RGB-D/rgbd-tum.cc`
`~/ORB_SLAM2/Examples/Stereo/stereo_euroc.cc`
`~/ORB_SLAM2/Examples/Stereo/stereo_kitti.cc`
`~/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/AR/ViewerAR.cc`

build時のエラー②
````
fatal error: Eigen/Core: そのようなファイルやディレクトリはありません
````
ORB_SLAM2の ~/ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt を書き換えます。
```
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/../../../
${PROJECT_SOURCE_DIR}/../../../include
${Pangolin_INCLUDE_DIRS}
)
```
最後のPangolin~の下に次のように ${EIGEN3~ ...
```
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/../../../
${PROJECT_SOURCE_DIR}/../../../include
${Pangolin_INCLUDE_DIRS}
${EIGEN3_INCLUDE_DIR}
)
```
を追加しました。

build時のエラー③
```
/usr/bin/ld: CMakeFiles/RGBD.dir/src/ros_rgbd.cc.o: シンボル '_ZN5boost6system15system_categoryEv' への未定義参照です
/usr/lib/x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
````
先ほどのエラー②と同じファイルの下の部分に
```
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
)
```
一行加え、
```
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
-lboost_system
)
```
として、`-lboost_system`を追加しました。

+ ORB-SLAM2単体での実行（任意）

buildが通れば、単体での実行が可能になります。
````
cd ~
mkdir ~/dataset
cd ~/dataset
wget https://vision.in.tum.de/rgbd/dataset/freiburg1/rgbd_dataset_freiburg1_xyz.tgz
tar -zxf rgbd_dataset_freiburg1_xyz.tgz
cd ~/ORB_SLAM2
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml ../dataset/rgbd_dataset_freiburg1_xyz
````
PCデスク周りを縦横無尽に動く動画（）と緑色の点群が表示されていれば成功です。
# 動画を認識させる
動画（カメラ映像）から軌跡推定を行うには、ROSを使用する必要があります。
+ ROS上でのビルド
````
cd ~/ORB_SLAM2
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/ORB_SLAM2/Examples/ROS
chmod +x build_ros.sh
./build_ros.sh

cd ~/ORB_SLAM2/Examples
rosws init . /opt/ros/kinetic
rosws set ./ROS -t . 
echo "source ~/ORB_SLAM2/Examples/setup.bash" >> ~/.bashrc
bash
cd ~/ORB_SLAM2/Examples/ROS
rosmake ORB_SLAM2
````
ミスった場合
`bash`を実行したときにエラーが出てしまうと、パスが通っていないので`echo "source ~`の手順をやり直します。（ファイルの位置が間違っていないか再度確認）
![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573446/f30484e5-bd62-87ed-9398-d4c3ca811ebd.png)
この操作ミスをすると、新しくターミナルを開いたときエラー文が出るようになります。
これを消すには`vi`を開いてこの文章を消さなければいけません。
この`vi`はややこしいので、他のサイトを見ながら慎重に進めましょう。
間違えると最悪初期化です。
他に良い方法がある気がします。誰か教えてください()
~~`Vi .bashrc`で`vi`を開いて`xキー`で当該パスを削除して大文字`ZZ`で保存すればエラー文は消え~~
+ video_stream_opencv

動画をORB-SLAM2側にリアルタイム映像として認識させるためのツールです。
````
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make_isolated
source devel_isolated/setup.bash
cd ~/catkin_ws/src

git clone https://github.com/ros-drivers/video_stream_opencv.git
rosdep update
rosdep install --from-path ~/dev/catkin_ws/src/video_stream_opencv --ignore-src
cd ~/catkin_ws
catkin_make_isolated
echo "source ~/catkin_ws/devel_isolated/setup.bash" >> ~/.bashrc
bash
````
以下の操作はお好みです。
````
cd ~/dataset
cp ~/catkin_ws/src/video_stream_opencv/launch/video_file.launch ./
mv video_file.launch my_video_file.launch
````
以下の`nano`コマンドで、動画とfpsの指定を行います。
※任意の動画をWindowsから取り込む方法（ファイル共有）については後述
````
nano my_video_file.launch
````
```Diff_C
<launch>
   <!-- launch video stream -->
   <include file="$(find video_stream_opencv)/launch/camera.launch" >
   		<!-- node name and ros graph name -->
	  	<arg name="camera_name" value="camera" />//←ここのvalueをcameraに変える（マスト）
	  	<!-- full path to the video file　） -->
    	  	<arg name="video_stream_provider" value="/home/user/dataset/IMG.mp4" //←ここに動画のパスを入れる（フルパスです）
	  	<!-- throttling the querying of frames to -->
	  	<arg name="fps" value="30" />//←動画のfpsに合わせて変更する
	  	<!-- setting frame_id -->
	  	<arg name="frame_id" value="videofile_frame" />
	  	<arg name="camera_info_url" value="" />
	  	<!-- flip the image horizontally (mirror it) -->
	  	<arg name="flip_horizontal" value="false" />
	  	<!-- flip the image vertically -->
	  	<arg name="flip_vertical" value="true" />
	  	<!-- visualize on an image_view window the stream generated -->
	  	<arg name="visualize" value="true" />
   </include>
</launch>
````
`ctrl + x`でモード終了。名前変更するか聞かれるのでそれは任意で。
単体で`roslaunch video_file.launch`を実行することで、動画が認識されているか確認できます。

# 動画から軌跡推定
いよいよ実行です。ターミナル（端末）を三つ開いて、各コマンドを実行させていきます。

Terminal1
````
roscore
````
Terminal2
````
cd ~/ORB_SLAM2
rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml 
````
Terminal3
````
cd ~/dataset
roslaunch video_file.launch
````
1.2.3の順で実行してください。2の`rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml `はかなりラグいかもしれません。
`TUM1.yaml`などのキャリブレーション用ファイルを弄って調整する必要がありますが、緑の線みたいなのが認識していれば成功です。

※注意
このまま仮想環境を再起動すると、`rosrun ORB_SLAM2`のコマンドでエラーが出ます。（ROSが設定を記憶していないため）設定するかROSビルドの`echo`からやり直すかの手順を踏んでください。

# Windowsとのファイル共有
VMware17の設定を開きます。
Player→管理→仮想マシン設定→オプション→共有フォルダ→有効
として、共有フォルダの追加をしてください。
フォルダの追加は仮想マシンを起動しないと無理です。

次に、仮想マシン内での作業です。
````
sudo apt-get install open-vm-tools
sudo mkdir /mnt/hgfs
sudo /usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse,allow_other
````
再起動するとマウントの設定消えてしまうので、`sudo /usr/bin/vmhgfs-fuse～`は起動するたびにコマンド実行するか、vimで共有フォルダfstabに`.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,auto_unmount,defaults 0 0`を追加してください。(追加してもたまにエラーでて打ち直すんやけどなぁ)

これで、コンピュータ/mnt/hgfs内に、先ほど指定したwindowsフォルダが表示されているハズです。これで、好きな動画やデータを行き来することが出来ます。

# おわりに
初投稿でした。勉強がてら記述したのでおかしいところは多分にあると思われます。すいません。
実はORB-SLAM3も構築したのですが、エラー多すぎて脳死で構築したためメモがない。。
もう二度と構築できない気がします。。。
+ ORB-SLAM3

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

# 参考にさせて頂いたサイト

http://h91015b.livedoor.blog/archives/9982162.html

https://ensekitt.hatenablog.com/entry/visualslam5

https://wiki.ros.org/ja/kinetic/Installation/Ubuntu