漱石枕流

勉強、開発したことのメモ

JetsonTX2のセットアップの記録

JetsonTX2を搭載した移動ロボットを実験で使うので、ROSやOpenCV、ZEDステレオカメラ、rp-LiDARのセットアップの記録を残しておこうと思う。

- ホスト: Ubuntu16.04搭載のノートPC
- ターゲット: JetsonTX2

JetPack

JetPack-L4T-3.2.1を使った。ZEDのROS用ノードzed-ros-wrapperコンパイルする際に、SDK>=2.3を使う必要があるが、CUDA9.0に依存している。よってCUDAのバージョンが9.0以上であるかを確認する。

1回目のインストール

多分1回目ではOSしか入れないと思う。

リカバリーモード

一旦電源を切った後、再度電源を入れると同時に、リカバリーボタンとリセットボタンを同時に押す。2秒後にリセットボタンを外す。すると起動画面は現れないはず。その状態で付属のケーブルでJetsonのmini-USBとPCのUSBを接続し、lsusbNVIDIA corpのリストが表示されればOK。

パッケージ選択

ホスト側には何も入れる必要はない。必要最低限にしたいため(そしてROSのOpenCV3との互換性を憂慮して)Jetson側ではFlash OS Image、CUDA(9.0)、cuDNN(7.0)のみ選択した(OpenCV、VisionWorks、TensorRT、Multlmediaはno actionに)。ただし1回目のインストールではOSしか入れないので、他のパッケージはまだ関係なさそう。このまま続行すればインストールは10分ぐらいで終わった。

f:id:amazingsoblin:20181026174629p:plain
1回目のインストール

2回目のインストール

XTerm上のインストーラにfinishedと表示されたらCtr-Cで一旦終了する。Jetsonを起動して、WiFiに繋いで2回目に進む。

パッケージ選択

先ほどと同じ、必要なパッケージだけチェックを入れる。このときFlash OS Imageはno actionにしておく。

IPアドレスの確認

JetsonのIPアドレスを確認。ifconfigとかip addr showとか。このときJetson側でaptを使うコマンドがバックグランドで動いていて面倒なことがあったので、そのような場合は

sudo rm /var/lib/dpkg/lock

しておく。これで勝手に入るのでは。

f:id:amazingsoblin:20181026174732p:plain
2回目のインストール

自分がやった時に起きたエラー

インストールの最中にapt-get updateをやっているようなのだが、デフォルトのサーバーへの接続が遅すぎて、一旦アメリカのサーバーへと変更しようとした。だが何かエラーが起きたようで、インストールの途中でcudaが入っていないと怒られた(指定したはずなのに)。結局一旦中断して、手動(apt-get)でcuda-toolkit-9-0を入れるはめになった。するとスムーズに進んだ。

確認

以下のコマンドが出ればインストールはされていると思う。

which nvcc => /usr/local/cuda-9.0/bin/nvcc

ROSのインストール

ros-kinetic-ros-perceptionに含まれるパッケージの多くはOpenCVに依存しており、デフォルトではこれらをインストールしようとするとros-kinetic-opencv3が依存パッケージと入ってしまう。しかしその実体はOpenCV3のCUDA無しバージョンであるようで、自前でビルドしたOpenCVとの衝突を起こしてしまう。試行錯誤の結果、ros-kinetic-ros-perceptionは全て自前でローカル環境でビルドしたほうが良いと思う。なのでROSも必要最低限のパッケージのみ入れる。こちらスクリプトに従ってインストール。

sudo ./installROS.sh -p ros-kinetic-ros-base

ZEDのSDKのインストール

ここからSDKをダウンロード。自分はバージョン2.4を選んだ。次に以下のレポジトリをクローンしてzed_wrapperの部分だけcatkin_ws/src配下に移す。

github.com

CUDA>=9.0とSDKがきちんとインストールされていればcatkin_makeできるはず。

OpenCV3(.4)のインストール

現時点で最新のバージョン3.4をビルドする。ここの記事を参考にした。

contrib

opencvmodulesincludeと同じレベルのディレクトリに置いて、-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modulesを上の記事のCMakeコマンドに付け加えた。全体で1時間半程度でビルドできた。

ROSの画像処理関係(ros-perception)のビルド

CUDA有りでビルドしたOpenCV3を使ってimage_viewcv_bridgeをビルドしてしまう。

$ sudo apt-get install libyaml-cpp libgtk-2.0-dev ros-kinetic-eigen-conversion etc.

で依存関係を満たした後、以下のros-kinetic-image-commonros-kinetic-image-pipelineros-kinetic-vision-opencvをクローンしてビルドする。これでcv_bridgeimage_viewがローカルのOpenCV3を使ってくれるようになる。もしかしたらPoint Cloud LibraryもCUDA環境でビルドしたほうが速いのかも知れない。

github.com

github.com

github.com

ros-kinetic-opencv3をインストールするべきでない理由

cv_bridge(apt-getでインストールしたもの、ros-kinetic-opencv3を利用する)とcv::cuda::を両方使用するノードをリンクするときに、${catkin_LIBRARIES}${OpenCV_LIBRARIES}をtarget_link_librariesに指定した。またここの記事を参考にCMakeLists.txtでOpenCVを使い分けさせ、以下のようにきちんと2つのOpenCV両方にリンクされていることを確認した。

$cd ~/catkin_ws/devel/lib/HogeHogePackage/
$ ldd HogeHogeNode
=> /usr/local/libopencv3.・・・
=> /opt/ros/kinetic/lib/libopencv3.・・・

しかしどうやっても実行時にcv::cuda::へのリンクエラーが出てしまう。ros-kinetic-opencv3はCUDAに対応していないこと、cv_bridgeは(ローカル環境であれros-kinetic-opencv3であれ)OpenCVが使えればそれで良いことを考えて、今回の結論に至った。

ROSの画像処理とOpenCV3+CUDA9.0の連携の確認

以下のようなノードをJetson側に作って

  1. 動画読み込み
  2. GPUで処理
  3. 処理結果を可視化してpublish

ノートPC側でimage_viewで確認するというもの。

PCLのビルド

以下によるとPCLはBoost、Eigen、FLANN、VTK、QHULLに依存するようである。FLANNはまだインストールしていないのでapt-getしようかと思ったが、FLANNもCUDA有りでビルドできるようである。

Point Cloud Library 1.8.0 has been released – Summary?Blog

FLANNのビルド

以下のレポジトリからクローンしてきて、バージョンを1.9.1にする。

github.com

$ git checkout 1.9.1

CUDAを使うため、CMakeLists.txtを以下のように変更する。

option(BUILD_C_BINDINGS "Build C bindings" ON)
option(BUILD_PYTHON_BINDINGS "Build Python bindings" ON)
option(BUILD_MATLAB_BINDINGS "Build Matlab bindings" OFF) <===
option(BUILD_CUDA_LIB "Build CUDA library" ON) <===
option(BUILD_EXAMPLES "Build examples" ON)
option(BUILD_TESTS "Build tests" ON)
option(BUILD_DOC "Build documentation" OFF) <===
option(USE_OPENMP "Use OpenMP multi-threading" ON)
option(USE_MPI "Use MPI" ON) <===

謎のエラー

自分の環境ではこれでMakefileは生成された。もしかしたらこれは環境依存なのかもしれないが、ビルドの際に以下のようなエラーが出たので、

/home/nvidia/builds/flann/src/cpp/flann/algorithms/kdtree_cuda_3d_index.cu(764): error: namespace "thrust" has no member "gather"

1 error detected in the compilation of "/tmp/tmpxft_0000106b_00000000-6_kdtree_cuda_3d_index.cpp1.ii".
CMake Error at flann_cuda_s_generated_kdtree_cuda_3d_index.cu.o.cmake:266 (message):
  Error generating file
  /home/nvidia/builds/flann/build/src/cpp/CMakeFiles/flann_cuda_s.dir/flann/algorithms/./flann_cuda_s_generated_kdtree_cuda_3d_index.cu.o


src/cpp/CMakeFiles/flann_cuda_s.dir/build.make:63: recipe for target 'src/cpp/CMakeFiles/flann_cuda_s.dir/flann/algorithms/flann_cuda_s_generated_kdtree_cuda_3d_index.cu.o' failed
make[2]: *** [src/cpp/CMakeFiles/flann_cuda_s.dir/flann/algorithms/flann_cuda_s_generated_kdtree_cuda_3d_index.cu.o] Error 1
CMakeFiles/Makefile2:240: recipe for target 'src/cpp/CMakeFiles/flann_cuda_s.dir/all' failed
make[1]: *** [src/cpp/CMakeFiles/flann_cuda_s.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 64%] Linking CXX executable ../bin/flann_example_cpp
[ 64%] Built target flann_example_cpp
[ 70%] Linking CXX static library ../../lib/libflann_s.a
[ 70%] Built target flann_s
Makefile:149: recipe for target 'all' failed
make: *** [all] Error 2

問題のあったソースファイルsrc/cpp/flann/algorithms/kdtree_cuda_3d_index.cu#include <thurst/gather.h>を追加するとビルドできた。

PCLのビルド

$ sudo apt-get install ros-kinetic-pcl-msgs ros-kinetic-tf ros-kinetic-tf2-eigen etc.

TODO?

Point Cloud LibraryもCUDA有りでビルドして、点群処理パッケージもローカルのものを使わせる。