Compartilhamento de tecnologia

Problema de conflito entre opencv4.6 e opencv4.2 do qual cv_bridge depende ao executar vins-fusion

2024-07-12

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

O bug que foi ajustado por mais de um dia foi finalmente resolvido... e está postado para sua referência.

1. Para o problema de conflito entre a execução de opencv4.6 e cv_bridge chamando a versão 4.2 de vins-mono e vins-fusion, o processo de depuração é registrado da seguinte forma:

Graças a esse cara pelo seu código, todo o conteúdo pode ser aplicado corretamente: configuração do ubuntu20.04 vins-fusion+opencv4.6
Este artigo também é ótimo, você pode consultar: Erro ao executar lvi-sam no ubuntu20.04! Problema de conflito entre a biblioteca Opencv e o pacote cv_bridge

1. Instale o OpenCV 4.6.0

1. Baixe o código-fonte opencv, selecione a versão necessária opencv 4.6.0, a extensão correspondente opencv_contrib 4.6.0 e o cv_bridge usado para conectar ROS e opencv

Lançamento OpenCV 4.6.0 · opencv/opencv · GitHub
Versão 4.6.0 · opencv/opencv_contrib · GitHub
https://github.com/ros-perception/vision_opencv/tree/

1.1 Instale o opencv em /usr/local/opencv-4.6.0, mova o opencv e seus módulos de extensão e entre no diretório de trabalho
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

Insira a descrição da imagem aqui

1.2 Antes de compilar, determine o caminho de instalação do opencv Meu caminho de instalação é CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0.
1.3 Compile o opencv 4.6.0, no qual selecionei todas as opções relacionadas ao cuda como desativadas e não uso gpu por enquanto.
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 Se o desempenho do computador for bom, você pode usar make -j8 para compilar multi-core. Se ocorrerem erros de compatibilidade, é recomendado usar make, que é mais lento.
make -j8
sudo make install
  • 1
  • 2

2. Configure o pacote de funções cv_bridge

1 Como os dados opencv e os dados ROS precisam ser convertidos, é necessário usar a ferramenta de ponte cv_bridge. A seguir, apresentaremos como baixar, instalar e configurar seu próprio pacote de funções cv_bridge.

2. Primeiro crie um espaço de trabalho ros

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

3. Em seguida, baixe o código-fonte da versão correspondente. Por ser Ubuntu 20.04, baixe a versão noetic.

GitHub - ros-perception/vision_opencv em noetic

4. Após o download, extraia-o para o diretório ~/third/cv_bridge_ws/src/ Como só precisamos de cv_bridge, só precisamos manter a pasta cv_bridge, colocá-la em ~/third/cv_bridge_ws/src/ e então modificar a configuração. do documento cv_bridge.Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

4.1 Modifique o arquivo CMakeLists.txt: adicione seu caminho de instalação opencv na frente de set(_opencv_version 4), provavelmente na linha 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 Além disso, como o cv_bridge feito por mim corresponde ao pacote de funções da versão opencv 4.6.0, é melhor alterar o nome do pacote para my_cv_bridge aqui.
4.3 O conteúdo de todo o arquivo cmakelists é o seguinte;
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 Modifique package.xml e altere o nome do pacote de funções
<package format="2">
#  <name>cv_bridge</name>
  <name>my_cv_bridge</name>
  • 1
  • 2
  • 3
4.6 Compilar o pacote de funções cv_bridge
cd ~/cv_bridge_ws/
catkin_make
  • 1
  • 2
4.7 Se a compilação for bem-sucedida, a produção do pacote de funções my_cv_bridge será concluída, o que também significa que o opencv 4.6.0 foi instalado corretamente e o pacote de funções my_cv_bridge pode ser conectado corretamente à versão opencv instalada por nós mesmos. adicione o caminho deste pacote de funções à pasta ~/.bashrc, para que possamos chamar este pacote de funções my_cv_bridge ao compilar o vins-fusion posteriormente, abra a pasta ~/.bashrc e adicione o seguinte comando no final
source ~/cv_bridge_ws/devel/setup.bash
  • 1
4.8 Finalmente, forneça o caminho atual no terminal

fonte ~/.bas在这里插入代码片crf

3. Compilar vins-fusion

1. Entre no espaço de trabalho vins-fusion cd ~/vins-fusion

2. Modifique o arquivo vins_estimator/CMakeLists.txt

2.1 Altere cv_bridge para 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 Adicione o caminho do pacote de funções cv_bridge_460 e o caminho de 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 Certifique-se de que a biblioteca cv_bridge esteja instalada e vinculada corretamente
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1

3 Modifique loop_fusion

3.1 Arquivo 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 Adicione o caminho do pacote de funções cv_bridge_460 e o caminho de 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 Certifique-se de que a biblioteca cv_bridge esteja instalada e vinculada corretamente
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS}  ${EIGEN3_INCLUDE_DIR} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1
3.4 Arquivo cmakelist completo
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. Compilação bem-sucedida

Se a compilação for bem-sucedida e o pacote de funções my_cv_bridge em find_package puder ser identificado corretamente, os três arquivos acima podem ser obtidos no arquivo devel do vins-fusion.É o mesmo que instalar o cv_bridge oficial, exceto que o pacote oficial está em opt/ros/noetic/…
Insira a descrição da imagem aqui

5. No entanto, uma compilação bem-sucedida não significa uma operação bem-sucedida...

Insira a descrição da imagem aqui

Este erro ocorre. Bem, é um conflito entre opencv4.2 e 4.6, mas obviamente substituí cv_bridge e opencv pelos meus! ! Então. . . Eu verifiquei cv_bridge-extras.cmake em my_cv_bridge/cmake e descobri que ainda diz 4.2!!!

  1. Abaixo está a versão correta após a modificação
    a. (1) Altere a versão para 4.6.
    b. (2) opencv_config_path arquivo baixado em /usr/local/opencv-4.6.0/lib/cmake/opencv4
    Insira a descrição da imagem aqui

  2. Então abri /usr/local/opencv-4.6.0/lib/cmake/opencv4 e descobri que o conjunto (OpenCV_VERSION 4.2.0) na imagem abaixo dizia 4.2, não 4.6!!!

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

Insira a descrição da imagem aqui

  1. Em seguida, recompile o cv_bridge_ws acima e execute vins-fusion e ele funcionará normalmente.

6. Em relação ao problema de desinstalação da versão opencv4.2
  1. Para garantir que os arquivos de outras versões não sejam excluídos acidentalmente, você pode usar curingas para excluir todos os arquivos da biblioteca da versão 4.2:
sudo rm /usr/local/lib/libopencv_*4.2*
  • 1

Então pode haver arquivos relacionados em/var e usar o mesmo método de exclusão.
2. Verifique o caminho relacionado à biblioteca opencv. Os arquivos de link da biblioteca estão todos neste arquivo:

sudo find / -iname "*opencv*"
  • 1
  1. Atualizar cache da biblioteca de vínculo dinâmico
sudo ldconfig
  • 1
  1. Desinstale o cv_bridge original sudo apt-get remove ros-melodic-cv-bridge, baixe sua própria versão do cv_bridge correspondente ao ros e link para o opencv especificado [Isso pode ser desinstalado ou não? ? Eu removi isso]

7. Sobre o arquivo 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