시작의 근원

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