기술나눔

vins-fusion을 실행할 때 cv_bridge가 의존하는 opencv4.6과 opencv4.2 간의 충돌 문제

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

하루 넘게 조정되었던 버그가 드디어 해결되었습니다... 참고용으로 올려드립니다.

1. vins-mono 및 vins-fusion 버전 4.2를 호출하는 opencv4.6 및 cv_bridge 실행 간의 충돌 문제에 대해 디버깅 프로세스는 다음과 같이 기록됩니다.

이 사람의 코드 덕분에 모든 내용이 올바르게 적용될 수 있습니다: ubuntu20.04 구성 vins-fusion+opencv4.6
이 기사도 훌륭합니다. ubuntu20.04에서 lvi-sam을 실행할 때 오류가 발생했습니다!를 참조할 수 있습니다. Opencv 라이브러리와 cv_bridge 패키지 간의 충돌 문제

1. OpenCV 4.6.0 설치

1. opencv 소스 코드를 다운로드하고 필요한 버전 opencv 4.6.0, 해당 확장 opencv_contrib 4.6.0, ROS와 opencv를 연결하는 데 사용되는 cv_bridge를 선택합니다.

OpenCV 4.6.0 릴리스 · opencv/opencv · GitHub
릴리스 4.6.0 · opencv/opencv_contrib · GitHub
https://github.com/ros-perception/vision_opencv/tree/

1.1 /usr/local/opencv-4.6.0 아래에 opencv를 설치하고, opencv와 해당 확장 모듈을 이동하고 작업 디렉터리로 들어갑니다.
sudo mv ./opencv-4.6.0/ /usr/local/
sudo mv ./opencv_contirb-4.6.0/ /usr/local/
cd /usr/local/opencv-4.6.0/
  • 1
  • 2
  • 3

여기에 이미지 설명을 삽입하세요.

1.2 컴파일하기 전에 opencv의 설치 경로를 결정하십시오. 내 설치 경로는 CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0입니다.
1.3 cuda 관련 옵션을 모두 off로 선택하고 당분간 GPU를 사용하지 않는 opencv 4.6.0을 컴파일합니다.
sudo mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE 
        -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0 
        -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.6.0/modules 
        -D WITH_CUDA=OFF 
        -D ENABLE_FAST_MATH=OFF 
        -D CUDA_FAST_MATH=OFF 
        -D WITH_CUBLAS=ON 
        -D WITH_LIBV4L=ON 
        -D WITH_GSTREAMER=ON 
        -D WITH_GSTREAMER_0_10=OFF 
        -D WITH_QT=ON 
        -D WITH_OPENGL=ON 
        -D CUDA_NVCC_FLAGS="--expt-relaxed-constexpr" 
        -D WITH_TBB=ON 
        ..
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
1.4 컴퓨터 성능이 좋으면 make -j8을 사용하여 멀티코어를 컴파일할 수 있습니다. 호환성 오류가 발생하면 속도가 느린 make를 사용하는 것이 좋습니다.
make -j8
sudo make install
  • 1
  • 2

2. cv_bridge 함수 패키지 구성

1 opencv 데이터와 ROS 데이터를 변환해야 하기 때문에 cv_bridge 브리징 도구를 사용해야 합니다. 다음으로 자체 cv_bridge 함수 패키지를 다운로드하고 설치하고 구성하는 방법을 소개합니다.

2. 먼저 ros 작업공간을 생성하세요

mkdir -r ~/third/cv_bridge_ws/src/
cd ~/cv_bridge_ws/src/
  • 1
  • 2

3. 그런 다음 해당 버전의 소스 코드를 다운로드합니다. Ubuntu 20.04이므로 Noetic 버전을 다운로드합니다.

GitHub - noetic의 ros-perception/vision_opencv

4. 다운로드 후 ~/third/cv_bridge_ws/src/ 디렉터리에 추출합니다. cv_bridge만 필요하므로 cv_bridge 폴더만 보관하고 ~/third/cv_bridge_ws/src/에 넣은 다음 구성을 수정하면 됩니다. cv_bridge.문서입니다.여기에 이미지 설명을 삽입하세요.

여기에 이미지 설명을 삽입하세요.

4.1 CMakeLists.txt 파일 수정: set(_opencv_version 4) 앞에 opencv 설치 경로를 추가합니다. 아마도 20번째 줄에 있을 것입니다.
set(Opencv_DIR /usr/local/opencv-4.6.0/build)
set(_opencv_version 4)
find_package(OpenCV 4 QUIET)
  • 1
  • 2
  • 3
4.2 추가적으로 제가 직접 만든 cv_bridge는 opencv 4.6.0 버전의 함수 패키지에 해당하므로 여기서는 패키지명을 my_cv_bridge로 변경하는 것이 가장 좋습니다.
4.3 전체 cmakelists 파일의 내용은 다음과 같습니다.
cmake_minimum_required(VERSION 3.0.2)
project(my_cv_bridge)

find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)

if(NOT ANDROID)
  find_package(PythonLibs)

  if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
    # Debian Buster
    find_package(Boost REQUIRED python37)
  else()
    # Ubuntu Focal
    find_package(Boost REQUIRED python)
  endif()
else()
find_package(Boost REQUIRED)
endif()

set(Opencv_DIR /usr/local/opencv-4.6.0/build)
set(_opencv_version 4)
find_package(OpenCV 4 QUIET)
if(NOT OpenCV_FOUND)
  message(STATUS "Did not find OpenCV 4, trying OpenCV 3")
  set(_opencv_version 3)
endif()

find_package(OpenCV ${_opencv_version} REQUIRED
  COMPONENTS
    opencv_core
    opencv_imgproc
    opencv_imgcodecs
  CONFIG
)

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES ${PROJECT_NAME}
  CATKIN_DEPENDS rosconsole sensor_msgs
  DEPENDS OpenCV
  CFG_EXTRAS cv_bridge-extras.cmake
)

catkin_python_setup()

include_directories(include ${Boost_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

if(NOT ANDROID)
add_subdirectory(python)
endif()
add_subdirectory(src)
if(CATKIN_ENABLE_TESTING)
  add_subdirectory(test)
endif()
# install the include folder
install(
  DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
4.5 package.xml 수정 및 함수 패키지 이름 변경
<package format="2">
#  <name>cv_bridge</name>
  <name>my_cv_bridge</name>
  • 1
  • 2
  • 3
4.6 cv_bridge 함수 패키지 컴파일
cd ~/cv_bridge_ws/
catkin_make
  • 1
  • 2
4.7 컴파일이 성공하면 my_cv_bridge 함수 패키지 제작이 완료된 것입니다. 이는 opencv 4.6.0이 올바르게 설치되었음을 의미하며 my_cv_bridge 함수 패키지가 직접 설치한 opencv 버전에 올바르게 연결될 수 있음을 의미합니다. 나중에 vins-fusion을 컴파일할 때 이 my_cv_bridge 함수 패키지를 호출할 수 있도록 이 함수 패키지의 경로를 ~/.bashrc 폴더에 추가하고 ~/.bashrc 폴더를 열고 마지막에 다음 명령을 추가합니다.
source ~/cv_bridge_ws/devel/setup.bash
  • 1
4.8 마지막으로 터미널에서 전류 경로를 소싱합니다.

소스 ~/.bas在这里插入代码片HRC는

3. vins-fusion 컴파일

1. vins-fusion 작업 공간으로 들어갑니다. cd ~/vins-fusion

2. vins_estimator/CMakeLists.txt 파일 수정

2.1 cv_bridge를 my_cv_bridge로 변경
find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
    geometry_msgs
    nav_msgs
    tf
    cv_bridge_460
    camera_models
    image_transport)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
2.2 cv_bridge_460 함수 패키지의 경로와 opencv-4.6.0의 경로를 추가합니다.
set(my_cv_bridge_DIR "/home/lemontech/thirdlib/cv_bridge_ws/devel/share/my_cv_bridge/cmake")

set(OpenCV_DIR "/usr/local/opencv-4.6.0/bulid/")
  • 1
  • 2
  • 3
2.3 cv_bridge 라이브러리가 올바르게 설치되고 링크되었는지 확인하세요.
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1

3 loop_fusion 수정

3.1 CMakeLists.txt 파일
find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
    nav_msgs
    camera_models
    my_cv_bridge
    roslib
    )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
3.2 cv_bridge_460 함수 패키지의 경로와 opencv-4.6.0의 경로를 추가합니다.
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/home/lemontech/thirdlib/cv_bridge_ws/devel")
set(my_cv_bridge_DIR "/home/lemontech/thirdlib/cv_bridge_ws/devel/share/my_cv_bridge/cmake")
#-DEIGEN_USE_MKL_ALL")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")

set(OpenCV_DIR "/usr/local/opencv-4.6.0/bulid/")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
3.3 cv_bridge 라이브러리가 올바르게 설치되고 링크되었는지 확인하세요.
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS}  ${EIGEN3_INCLUDE_DIR} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1
3.4 완전한 cmakelist 파일
cmake_minimum_required(VERSION 2.8.3)
project(loop_fusion)

set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++17")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/home/lemontech/thirdlib/cv_bridge_ws/devel")
set(my_cv_bridge_DIR "/home/lemontech/thirdlib/cv_bridge_ws/devel/share/my_cv_bridge/cmake")
#-DEIGEN_USE_MKL_ALL")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")

set(OpenCV_DIR "/usr/local/opencv-4.6.0/bulid/")

find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
    nav_msgs
    camera_models
    my_cv_bridge
    roslib
    )

find_package(OpenCV)


find_package(Ceres REQUIRED)

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
find_package(Eigen3)

include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS}  ${EIGEN3_INCLUDE_DIR} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
catkin_package()

add_executable(loop_fusion_node
    src/pose_graph_node.cpp
    src/pose_graph.cpp
    src/keyframe.cpp
    src/utility/CameraPoseVisualization.cpp
    src/ThirdParty/DBoW/BowVector.cpp
    src/ThirdParty/DBoW/FBrief.cpp
    src/ThirdParty/DBoW/FeatureVector.cpp
    src/ThirdParty/DBoW/QueryResults.cpp
    src/ThirdParty/DBoW/ScoringObject.cpp
    src/ThirdParty/DUtils/Random.cpp
    src/ThirdParty/DUtils/Timestamp.cpp
    src/ThirdParty/DVision/BRIEF.cpp
    src/ThirdParty/VocabularyBinary.cpp
    )

target_link_libraries(loop_fusion_node ${catkin_LIBRARIES}  ${OpenCV_LIBS} ${CERES_LIBRARIES}) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

4. 컴파일 성공

컴파일이 성공하고 find_package의 my_cv_bridge 함수 패키지가 올바르게 식별될 수 있다면 위의 세 파일은 vins-fusion의 devel 파일에서 얻을 수 있습니다.공식 패키지가 opt/ros/noetic/…에 있다는 점을 제외하면 공식 cv_bridge를 설치하는 것과 동일합니다.
여기에 이미지 설명을 삽입하세요.

5. 그러나 성공적인 컴파일이 성공적인 작업을 의미하지는 않습니다...

여기에 이미지 설명을 삽입하세요.

이 오류는 opencv4.2와 4.6 사이의 충돌이지만 분명히 cv_bridge와 opencv를 내 것으로 대체했습니다! ! 그 다음에. . . my_cv_bridge/cmake 아래에서 cv_bridge-extras.cmake를 확인했는데 여전히 4.2라고 나와 있는 것을 발견했습니다!!!

  1. 아래는 수정 후 올바른 버전입니다.
    (1) 버전을 4.6으로 변경합니다.
    나. (2)opencv_config_path를 /usr/local/opencv-4.6.0/lib/cmake/opencv4로 설정합니다.
    여기에 이미지 설명을 삽입하세요.

  2. 그런 다음 /usr/local/opencv-4.6.0/lib/cmake/opencv4를 열었고 아래 그림의 세트(OpenCV_VERSION 4.2.0)가 4.6이 아닌 4.2라고 되어 있는 것을 발견했습니다. 수정하고 다시 컴파일하세요!!!

rm -rf build
mkdir build && cd build
cmake ..
make -j8
  • 1
  • 2
  • 3
  • 4

여기에 이미지 설명을 삽입하세요.

  1. 그런 다음 위의 cv_bridge_ws를 다시 컴파일한 다음 vins-fusion을 실행하면 정상적으로 실행됩니다.

6. opencv4.2 버전의 제거 문제에 대해
  1. 다른 버전의 파일이 실수로 삭제되지 않도록 하려면 와일드카드를 사용하여 모든 4.2 버전 라이브러리 파일을 삭제할 수 있습니다.
sudo rm /usr/local/lib/libopencv_*4.2*
  • 1

그러면 /var에 관련 파일이 있을 수 있으며 동일한 삭제 방법을 사용합니다.
2. opencv 라이브러리와 관련된 경로를 확인하세요. 라이브러리 링크 파일은 모두 다음 파일 아래에 있습니다.

sudo find / -iname "*opencv*"
  • 1
  1. 동적 링크 라이브러리 캐시 업데이트
sudo ldconfig
  • 1
  1. 원래 cv_bridge를 제거합니다. sudo apt-get 제거 ros-melodic-cv-bridge를 제거하고 ros에 해당하는 cv_bridge의 자체 버전을 다운로드하고 지정된 opencv에 연결합니다. [이것을 제거할 수 있습니까? ? 삭제했어요]

7. cmakelist 파일 정보

set(CMAKE_CXX_FLAGS "-std=c++17")指定了c++17标准进行编译
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/home/lemontech/thirdlib/cv_bridge_ws/devel") 这个设置将/home/lemontech/thirdlib/cv_bridge_ws/devel路径添加到cmake的前缀路径中,以便CMake可以在路径中找到依赖项和包
set(my_cv_bridge_DIR "/home/lemontech/thirdlib/cv_bridge_ws/devel/share/my_cv_bridge/cmake")设置置顶了my_cv_bridge包的CMake配置文件路径,以便CMake可以找到并使用这个包
find_package(catkin REQUIRED COMPONENTS
my_cv_bridge
roscpp
)用于查找并配置指定的catkin包和组件,catkin是ros的构建系统,REQUIRED表示这些组件是必须的,如果缺少,会报错)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7