시작의 근원

r3live를 돌려보려고 했는데, OpenCV We have successfully test our algorithm with version 3.3.1, 3.4.16, 4.2.1 and 4.5.3 라고 적혀있는 것을 확인하였다. 하지만 ROS를 설치할 때 자동으로 깔리는 버전이 3.2이기 때문에, 인위적으로 업데이트를 할 필요성을 느꼈다.

다들 알겠지만, 컴퓨터를 포맷한 후 설치하는 것은 그리 어렵지 않으나, 깔려져 있는 상태에서 제거 후 재설치를 하는 것은 쉽지 않다. 성공하기는 했는데 미래의 내가 분명히 다시 시행착오를 겪을 것 같아 미리 정리해둔다.

(Tips. 연구실 비전쟁이들에게 물어본 결과 Ubuntu 18.04에서는 3.4, Ubuntu 20.04에서는 4.2를 주로 사용한다고 한다.

응창이 형의 vins-application dependency 설치하는 것들이 아주 많이 도움이 되었다.

1. Version check & Remove existing OpenCV

아래의 명령어를 통해서 OpenCV의 버전 체크 가능

$ pkg-config --modversion opencv

확인 후, OpenCV를 전부다 지운다. 전부 지우는 명령어는 다음과 같다.

# In bash
$ sudo apt-get purge libopencv* python-opencv
# In zsh
$ sudo apt-get purge 'libopencv*' python-opencv

ROS가 깔려있는 상태에서는 수많은 패키지들이 OpenCV와 dependency가 있기 때문에, 잔여 패키지가 컴퓨터 내에 남게 된다.

과감히 다 제거해주자 (ROS를 다시 쓰는 데에는 크게 문제가 없다. 필요하면 나중에 다시 깔면 됨)

$ sudo apt autoremove
$ sudo apt update

2. Install CUDA, CuDNN, and Ceres Solver

그 후, 필요한 dependency들을 설치해야 한다. 그 중 좀 거대한(?) dependency로는 CUDA, Cudnn, 그리고 Ceres solver가 있다.

CUDA, CuDNN

CUDA와 CuDNN은 다른 사이트에 잘 나와있으니 설치 방법에 대해서는 생략. CUDA와 CuDNN은 Ceres Solver보다 먼저 설치하는 게 중요하다. 왜냐하면 Ceres Solver 빌드할 때도 CUDA dependency가 있는 부분이 있기 때문이다.

CUDA If you have an NVIDIA GPU then Ceres Solver can use it accelerate the solution of the Gauss-Newton linear systems using the CMake flag USE_CUDA. Currently this support is limited to using the dense linear solvers that ship with CUDA. As a result GPU acceleration can be used to speed up DENSE_QR, DENSE_NORMAL_CHOLESKY and DENSE_SCHUR. This also enables CUDA mixed precision solves for DENSE_NORMAL_CHOLESKY and DENSE_SCHUR. Optional.

필요 없어 보인다고 느낄 수 있지만, SLAM이나 VINS에서는 이 sparse matrix를 solve할 때 위의 해당하는 함수들이 사용된다. 따라서 순서를 지키자.

Ceres Solver

그 후, Ceres solver는 공식 사이트를 보고 설치하면 된다.

버전 2가 나오긴 했는데, 아직은 조심스러우니 1.14.0를 계속 사용하는 것 같다. 따라서 2.1.0 버전을 설치하지말고

$ wget http://ceres-solver.org/ceres-solver-1.14.0.tar.gz
``
로 1.14를 다운받자 (상세한 명령어는 [여기](http://ceres-solver.org/installation.html)).

### 3. Install other dependencies

그 후, 나머지 OpenCV를 위한 것과 r3live를 위한 패키지들을 설치하자.

무지성으로 install한 package들은 다음과 같다 (다 쓰임새가 있는 것은 아닌데, 처음에 한 번 실패하고 이것저것 추가로 apt-get install을 하니 빌드가 성공되었다. 본 글은 미래의 나를 위한 정리용이기 때문에 적절히 알아서 설치하면 된다.).

$ sudo apt-get install -y build-essential pkg-config
$ sudo apt-get install -y cmake libavcodec-dev libavformat-dev libavutil-dev \
    libglew-dev libgtk2.0-dev libgtk-3-dev libjpeg-dev libpng-dev libpostproc-dev \
    libswscale-dev libtbb-dev libtiff5-dev libv4l-dev libxvidcore-dev \
    libx264-dev qt5-default zlib1g-dev libgl1 libglvnd-dev pkg-config \
    libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev mesa-utils
$ sudo apt-get install libopenexr-dev
# 위의 명령어랑 중복되는 부분 있음 주의. 무지성 복붙 ㄱ ㄱ
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev v4l-utils libxvidcore-dev libx264-dev libxine2-dev
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
$ sudo apt-get install libgtk-3-dev
$ sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev
$ sudo apt-get install libatlas-base-dev gfortran libeigen3-dev
$ sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy
$ sudo apt-get install libgoogle-glog-dev
$ sudo apt install gcc-9 g++-9
$ sudo apt-get install libcgal-dev pcl-tools # For r3live

3. Build OpenCV

여기OpenCV with CUDA and CuDNNUbuntu 18.04 - this repo mainly targets ROS1 for Ubuntu 18.04를 참고했다.

처음에는 CUDA_nppicom_LIBRARY not found 에러가 났는데, 해당 문서에는 sudo-apt get install nvidia-cuda-toolkit을 치거나 opencv/cmake/OpenCVDetectCUDA.cmake를 수정하라고 되어 있는데, 예전에 toolkit 설치하다가 CUDA 관련 이슈로 포맷을 한 적이 있어서 후자를 택했다 (and it works).

주의할거는 cmake 옵션을 환경에 따라 적용해야 한다는 것이다. 내가 사용한 컴퓨터에서는 아래와 같이 수정하였다.

cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_C_COMPILER=gcc-7 \
      -D CMAKE_CXX_COMPILER=g++-7 \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D OPENCV_GENERATE_PKGCONFIG=YES \
      -D WITH_CUDA=ON \
      -D OPENCV_DNN_CUDA=ON \
      -D WITH_CUDNN=ON \
      -D CUDA_ARCH_BIN=7.5 \
      -D CUDA_ARCH_PTX=7.5 \
      -D ENABLE_FAST_MATH=ON \
      -D CUDA_FAST_MATH=ON \
      -D WITH_CUBLAS=ON \
      -D WITH_LIBV4L=ON \
      -D WITH_GSTREAMER=ON \
      -D WITH_GSTREAMER_0_10=OFF \
      -D WITH_CUFFT=ON \
      -D WITH_NVCUVID=ON \
      -D WITH_QT=ON \
      -D WITH_OPENGL=ON \
      -D WITH_IPP=OFF \
      -D WITH_V4L=ON \
      -D WITH_1394=OFF \
      -D WITH_GTK=ON \
      -D WITH_EIGEN=ON \
      -D WITH_FFMPEG=ON \
      -D WITH_TBB=ON \
      -D BUILD_opencv_cudacodec=OFF \
      -D CUDA_NVCC_FLAGS="--expt-relaxed-constexpr" \
      -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.1/modules \
      ../
  • CMAKE_C_COMPILER, CMAKE_CXX_COMPILER 부분을 gcc, g++ compiler 7로 변경 (the higher, the better 이지 않을까!? 하는 생각. 컴퓨터에 7.5 버전으로 깔려 있었음)
  • CUDA_ARCH_BIN, CUDA_ARCH_PTX 컴퓨터에 꽂혀있는 GPU에 따라 맞춰주기. 본 컴퓨터는 RTX2080Ti임. 여기에서 각 GPU의 generation을 알 수 있음.!

그 후,

make -j8
sudo make install

하면 OpenCV 설치가 완료된다.

4. Build CV-Bridge

그 후, ROS cv-bridge를 다시 설치해주어야 한다. 여기에 따르면, OpenCV를 수동으로 설치했으면 package로 빌드해야 한다고 한다 (하지만 테스트 해보진 않음).

$ cd ~/catkin_ws/src && git clone https://github.com/ros-perception/vision_opencv
# 기존 branch가 noetic이기 때문에, 각 컴퓨터에 맞는 버전으로 checkout 해주어야 함.
# 테스트한 컴퓨터는 Ubuntu 18.04어서 melodic을 설치함
$ cd vision_opencv && git checkout origin/melodic

그 후 catkin_make나 catkin build로 빌드하면 된다. VINS-application에서 명시한 것 처럼 CMakeLists를 고치지 않아도 잘 빌드됨을 확인했다.


혹시모를 팁 1

Ceres Solver 관련 cmake_device_link 에러가 간혹 다음과 같이 뜰 때가 있다.

cmake_device_link

이럴 때는 CMakeLists.txt에 아래와 같이 패키지 찾는 부분에 추가해주면 해결됐다.

option(USE_CUDA "Enable use of CUDA linear algebra solvers." ON)
option(LAPACK "Enable use of LAPACK directly within Ceres." ON)

if (USE_CUDA)
  find_package(CUDA QUIET)
  if (CUDA_FOUND)
    message("-- Found CUDA version ${CUDA_VERSION}: "
        "${CUDA_LIBRARIES};"
        "${CUDA_cusolver_LIBRARY};"
        "${CUDA_cusparse_LIBRARY}")
    enable_language(CUDA)
  else (CUDA_FOUND)
    message("-- Did not find CUDA library, disabling CUDA support.")
    update_cache_variable(USE_CUDA OFF)
    list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CUDA)
  endif (CUDA_FOUND)
else (USE_CUDA)
  message("-- Building without CUDA.")
  list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CUDA)
endif (USE_CUDA)
if (LAPACK)
  find_package(LAPACK QUIET)
  if (LAPACK_FOUND)
    message("-- Found LAPACK library: ${LAPACK_LIBRARIES}")
  else (LAPACK_FOUND)
    message("-- Did not find LAPACK library, disabling LAPACK support.")
    update_cache_variable(LAPACK OFF)
    list(APPEND CERES_COMPILE_OPTIONS CERES_NO_LAPACK)
  endif (LAPACK_FOUND)
else (LAPACK)
  message("-- Building without LAPACK.")
  list(APPEND CERES_COMPILE_OPTIONS CERES_NO_LAPACK)
endif (LAPACK)

혹시모를 팁 2

처음에 build할 때 opencv contrib 안에 있는 SfM 모듈에서 에러가 나는 것을 볼 수 있다.

opencv_sfm_error

해결 못하다가

  1. Ceres Solver 빌드했던 bin에서 make clean
  2. /usr/local/include/Ceres를 강제로 sudo rm -rf로 지우기
  3. 그 후 재설치

하니 해결됐다. 설치할 때 명령어 차이라고는 원래는 스킵하던 make test를 한 것밖에 없는데…흠…찜찜하지만 무사해결됐으니…

그 후 ROS package를 빌드하면

아마 기존의 많은 library들이 없어져 있을 것이다. sudo apt autoremove로 대다수의 이미지 관련 패키지들이 지워졌기 때문이다. (pcl-ros도 지워짐)

따라서 아래 명령어를 통해 catkin_make나 catkin build했을 때 없다고 뜨는 package를 설치해주면 된다.

sudo apt-get install ros-${ROS_VERSION}-${PACKAGE_NAME}
# e.g.
sudo apt-get install ros-melodic-pcl-ros