Jetson NanoでORB_SLAM2を使う

#最初に
自律移動ロボットを開発するためにROSやVisualSLAMについて勉強し始めた筆者ですが、まだまだ何も分からない状態です。
今回は備忘録としてJetson NanoでORB_SLAM2使う方法を残しておきます。

#構成

Jetson Nano
Ubuntu 18.04LTS
Ros melodic
カメラRealsense r200,バッファローBSWHD06M

# ORB_SLAM2をインストールする前に
##ROSインストール
ROSをインストールしましょう。
https://qiita.com/karaage0703/items/aa54e086f0a2f165d3e9
から揚げさんの記事通りにすればインストールすることが出来ます。
##スワップ領域を拡張
ORB_SLAM2をインストールする際にメモリ不足でビルドに失敗しますので、先にスワップ領域を確保しましょう。

```
$ git clone https://github.com/JetsonHacksNano/installSwapfile
$ cd installSwapfile
$ ./installSwapfile.sh
```

## カメラのインストール
###realsense r200を使う場合
こちらを参考にパッケージをインストールします。
https://qiita.com/h_tajiri/items/3709333223778b749130

###USBウェブカメラを使う場合
以下を実行してください。

```
sudo apt install ros-melodic-usb-cam
```

# ORB_SLAM2のインストール
こちらの記事を参考にさせていただきました。
基本的にはこの記事と同じようにやればインストールできます。
https://qiita.com/yamakentoc/items/1e340b238e215646cd84

##依存パッケージのインストール

```
$ sudo apt-get install python-rosinstall
$ sudo apt-get install libglew-dev
$ sudo apt-get install libeigen3-dev
$ sudo apt-get install cmake
$ sudo apt-get install libpython2.7-dev
$ sudo apt-get install libjpeg-dev libpng-dev libtiff5-dev libopenexr-dev
$ sudo apt-get install libegl1-mesa-dev libwayland-dev libxkbcommon-dev wayland-protocols
```

##Pangolinのインストール

```
$ cd
$ git clone https://github.com/stevenlovegrove/Pangolin.git
$ cd Pangolin
$ mkdir build
$ cd build
$ cmake ..
$ make -j
$ sudo make install
```

##ORB_SLAM2のインストール
まずクローンします。

```
mkdir ~/orb_slam2_ws
cd ~/orb_slam2_ws
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
```

次に以下のディレクトリのファイルに`#include "unistd.h"`を加えます。
nanoやviやテキストエディタ等で加えましょう。

`~/orb_slam2_ws/ORB_SLAM2/src/LocalMapping.cc
~/orb_slam2_ws/ORB_SLAM2/src/LoopClosing.cc
~/orb_slam2_ws/ORB_SLAM2/src/System.cc
~/orb_slam2_ws/ORB_SLAM2/src/Tracking.cc
~/orb_slam2_ws/ORB_SLAM2/src/Viewer.cc
~/orb_slam2_ws/ORB_SLAM2/Examples/Monocular/mono_euroc.cc
~/orb_slam2_ws/ORB_SLAM2/Examples/Monocular/mono_kitti.cc
~/orb_slam2_ws/ORB_SLAM2/Examples/Monocular/mono_tum.cc
~/orb_slam2_ws/ORB_SLAM2/Examples/RGB-D/rgbd-tum.cc
~/orb_slam2_ws/ORB_SLAM2/Examples/Stereo/stereo_euroc.cc
~/orb_slam2_ws/ORB_SLAM2/Examples/Stereo/stereo_kitti.cc
~/orb_slam2_ws/ORB_SLAM2/Example/ROS/ORB_SLAM2/src/AR/ViewerAR.cc
`
出来たらビルドしてインストールします。

```
$ cd ORB_SLAM2
$ chmod +x build.sh
$ ./build.sh
```
かなり時間が掛かりますが気長に頑張ってください。

##ORB_SLAM2のROSパッケージをインストール

`~/orb_slam2_ws/ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt`をnanoやviで開いて-lboost_systemを加えます。

```
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
)
```

次に以下を実行してインストール

```
$ sudo ln -s /home/(自身のhomeの名前)/orb_slam2_ws/ORB_SLAM2/Examples/ROS/ORB_SLAM2 /opt/ros/melodic/share/ORB_SLAM2
$ chmod +x build_ros.sh
$ ./build_ros.sh
```
また少し時間が掛かります。
これでインストールが完了します。

# ORB_SLAM2を起動する
##USBwebカメラの場合

```
ターミナル1
roscore
ターミナル2
rosrun usb_cam usb_cam_node /usb_cam/image_raw:=/camera/image_raw
ターミナル3
cd ~/orb_slam2_ws/ORB_SLAM2
rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml
```

##realsense r200の場合
```
ターミナル1
roscore
ターミナル2
roscd realsense_camera
roslaunch realsense_camera r200_nodelet_rgbd.launch
ターミナル3
cd ~/orb_slam2_ws/ORB_SLAM2
rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml /camera/rgb/image_raw:=/camera/rgb/image_rect_color /camera/depth_registered/image_raw:=/camera/depth/image_raw
```

起動できれば画面が立ち上がります。
realsesneは色んなトピックがパブリッシュされているのですが、どれを使ったらよいのか正直よくわかっておりませんが、とりあえずrgbとdepthのトピックを使いました。

#参考文献
https://qiita.com/karaage0703/items/aa54e086f0a2f165d3e9
https://qiita.com/yamakentoc/items/1e340b238e215646cd84
https://qiita.com/h_tajiri/items/3709333223778b749130