JetsonNano ORB_SLAM2 - eiichiromomma/CVMLAB GitHub Wiki

JetsonNano ORB_SLAM2

使うイメージ

今回テストしたのはJetBot 0.4.3

↓が2GBのイメージ(JetPackは4.5らしい)

これを焼く。 基本的に ここの内容なのだが,罠もあるので注意。

注意点

Swapを作っておけばコンパイルできるような記載があちこちにあるが,Swapは本体のメモリ(作業領域)が不足したときにファイルシステムをメモリ代わり(退避先)に使うもので,SDカードを使うようなJetson nanoでSwapをフルに使うような事態になるとクソ遅くなるというかほぼ死ぬ。あくまで保険で使わないに越した事はない。

なぜビルド中にSwapが必要な状況になるかと言うと

make -j

という記述があちこちにあるから。 -jはコンパイルを並列で実行する命令で通常-j [並列に実行する数]のように数字を付けて制御するが,数字無しで実行すると自動で豪快に並列コンパイルを始める。コンパイル作業自体がメモリも食うのでそれが並列になるからSwapを使う羽目になる。なので,実行する.shファイルの中身等も確認してmake -jの記述があったら

make -j 2

あたりにしておけばそれなりにスムーズに終わる。

ROSのJetson nanoへのインストール

からあげ氏のスクリプトを使う。Jetbotで必要な道具は揃っている筈なので

git clone https://github.com/karaage0703/jetson-nano-tools
cd jetson-nano-tools
./install-ros-melodic.sh

で放置しておけば入る。 あと

sudo apt install libogg-dev libtheora-dev
sudo apt install -y ros-melodic-image-proc
sudo apt install ros-melodic-usb-cam

でUSBカメラも使える

Python3対応

ここらへんは結構微妙。ORB_SLAM2だけ動かしたいならパスしてSwapの話へ。

OpenCV 4問題

mkdir -p cv_bridge_ws
mkdir -p cv_bridge_ws/src
cd cv_bridge_ws/src/
git clone https://github.com/BrutusTT/vision_opencv.git
git clone https://github.com/ros-perception/image_transport_plugins
cd ..
catkin build

ここの情報通りにPython3でもROSが使えるようにする。 ここも。

sudo pip3 install rospkg catkin_pkg
sudo apt-get install python-catkin-tools python3-dev python3-numpy
mkdir ~/catkin_build_ws && cd ~/catkin_build_ws
catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m -DPYTHON_LIBRARY=/usr/lib/aarch64-linux-gnu/libpython3.6m.so
catkin config --install
mkdir src
cd src
git clone -b melodic https://github.com/ros-perception/vision_opencv.git

catkin_build_ws/src/vision_opencv/cv_bridge/CMakeLists.txtを書き換えて,OpenCVの3必須を4必須にする。 具体的には

find_package(OpenCV 4 REQUIRED
  COMPONENTS
    opencv_core
    opencv_imgproc
    opencv_imgcodecs
  CONFIG
)

とする。

cd ~/catkin_build_ws
catkin build cv_bridge
source install/setup.bash --extend

Swapの拡張(やらなくても大丈夫かも?)

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

ORB_SLAMのインストール

依存ファイルのインストール

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

Pangolinのインストール

そこらの解説だとmake -jしてるので注意

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

ORB_SLAM2のビルド

本家からインストールする解説が殆どだが,OpenCVのバージョンが古くて死ぬ。 全部OpenCV4用に書き換えてくれた方が居るのでそっちを使う。sedコマンドはファイルの先頭にinclude文を埋め込んでいる。

cd
mkdir orb_slam2_ws; cd orb_slam2_ws
git clone https://github.com/Windfisch/ORB_SLAM2.git
sed -i '1s/^/#include "unistd.h"\n /' ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/AR/ViewerAR.cc
cd ORB_SLAM2
chmod +x build.sh

で,gedit等でbuild.shとbuild_ros.shを開き,

make -j

となっているところ全てを

make -j 2

に書き換える。

その後で

./build.sh

でビルド開始。暫く放置。

ROSパッケージのビルド

まず,パッケージの場所を明示する必要がある。 .bashrcファイルを開いて最後の行に

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/orb_slam2_ws/ORB_SLAM2/Examples/ROS

と書き加える。

echo "export ROS_PACKAGE_PATH=\${ROS_PACKAGE_PATH}:~/orb_slam2_ws/ORB_SLAM2/Examples/ROS" >> ~/.bashrc

を実行しても良い。その後で

source ~/.bashrc

として反映される。

export

と実行してズラっと並ぶ一覧にROS_PACKAGE_PATHがあり,その最後に上で指定した~/orb_slam2_ws/ORB_SLAM2/Examples/ROSが追加されてれば成功。

次いで「boost_systemが無い」とエラーになるので~/orb_slam2_ws/ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txtを開き,

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
)

のように一行加える。 あとは

chmod +x build_ros.sh
./build_ros.sh
```bash
でビルドが始まる。

## 確認
```bash
cd ~/orb_slam2_ws
wget http://vmcremers8.informatik.tu-muenchen.de/lsd/LSD_room.bag.zip
unzip LSD_room.bag.zip 

別のターミナルで

roscore

別のターミナルで

cd orb_slam2_ws/ORB_SLAM2/
rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml

別のターミナルで

cd orb_slam2_ws
rosbag play LSD_room.bag /image_raw:=/camera/image_raw

確認 (JetsonのCSIカメラ)

jetson-interface


sudo apt-get install ros-melodic-vision-msgs ros-melodic-image-transport ros-melodic-image-publisher
sudo apt-get install ros-melodic-image-view
cd
git clone --recursive https://github.com/dusty-nv/jetson-inference
cd jetson-inference/
git submodule update --init
mkdir build
cd build/
cmake ..
make -j 4
sudo make install

でjetbot_rosを入れる

mkdir -p catkin_build_ws/src
cd catkin_build_ws/src
git clone https://github.com/dusty-nv/jetbot_ros
cd ../
catkin_make
rosrun jetbot_ros jetbot_camera

確認は別のウィンドウで

rosrun image_view image_view image:=/jetbot_camera/raw 

image-transportでORB_SLAM2に渡す

rosrun image_transport republish raw in:=/jetbot_camera/raw out:=/camera/image_raw

で渡るのだがキャリブレーションしないとダメっぽい。

USB Cameraで妥協

ls /dev/video*

でvideo0 video1とか出てきた場合は,おそらくvideo1がUSBカメラ。

rosparam set usb_cam/video_device "/dev/video1"

としてから↓

rosrun usb_cam usb_cam_node /usb_cam/image_raw:=/camera/image_raw