시작의 근원
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 CuDNN → Ubuntu 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 에러가 간혹 다음과 같이 뜰 때가 있다.

이럴 때는 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 모듈에서 에러가 나는 것을 볼 수 있다.

해결 못하다가
- Ceres Solver 빌드했던 bin에서
make clean /usr/local/include/Ceres를 강제로sudo rm -rf로 지우기- 그 후 재설치
하니 해결됐다. 설치할 때 명령어 차이라고는 원래는 스킵하던 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