JetsonTX2のセットアップの記録
JetsonTX2を搭載した移動ロボットを実験で使うので、ROSやOpenCV、ZEDステレオカメラ、rp-LiDARのセットアップの記録を残しておこうと思う。
- ホスト: Ubuntu16.04搭載のノートPC - ターゲット: JetsonTX2
- JetPack
- 1回目のインストール
- 2回目のインストール
- ROSのインストール
- ZEDのSDKのインストール
- OpenCV3(.4)のインストール
- ROSの画像処理関係(ros-perception)のビルド
- ROSの画像処理とOpenCV3+CUDA9.0の連携の確認
- PCLのビルド
- TODO?
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を接続し、lsusb
でNVIDIA corpのリストが表示されればOK。
パッケージ選択
ホスト側には何も入れる必要はない。必要最低限にしたいため(そしてROSのOpenCV3との互換性を憂慮して)Jetson側ではFlash OS Image、CUDA(9.0)、cuDNN(7.0)のみ選択した(OpenCV、VisionWorks、TensorRT、Multlmediaはno actionに)。ただし1回目のインストールではOSしか入れないので、他のパッケージはまだ関係なさそう。このまま続行すればインストールは10分ぐらいで終わった。
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
しておく。これで勝手に入るのでは。
自分がやった時に起きたエラー
インストールの最中に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
配下に移す。
CUDA>=9.0とSDKがきちんとインストールされていればcatkin_makeできるはず。
OpenCV3(.4)のインストール
現時点で最新のバージョン3.4をビルドする。ここの記事を参考にした。
contrib
opencvのmodules
やinclude
と同じレベルのディレクトリに置いて、-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules
を上の記事のCMakeコマンドに付け加えた。全体で1時間半程度でビルドできた。
ROSの画像処理関係(ros-perception)のビルド
CUDA有りでビルドしたOpenCV3を使ってimage_view
やcv_bridge
をビルドしてしまう。
$ sudo apt-get install libyaml-cpp libgtk-2.0-dev ros-kinetic-eigen-conversion etc.
で依存関係を満たした後、以下のros-kinetic-image-common
、ros-kinetic-image-pipeline
、ros-kinetic-vision-opencv
をクローンしてビルドする。これでcv_bridge
やimage_view
がローカルのOpenCV3を使ってくれるようになる。もしかしたらPoint Cloud LibraryもCUDA環境でビルドしたほうが速いのかも知れない。
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側に作って
- 動画読み込み
- GPUで処理
- 処理結果を可視化して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にする。
$ 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有りでビルドして、点群処理パッケージもローカルのものを使わせる。