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の話へ。
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