Condivisione della tecnologia

Problema di conflitto tra opencv4.6 e opencv4.2 da cui dipende cv_bridge quando si esegue vins-fusion

2024-07-12

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

Il bug che è stato sistemato per più di un giorno è stato finalmente risolto... e viene pubblicato per tuo riferimento.

1. Per il problema del conflitto tra l'esecuzione di opencv4.6 e cv_bridge che chiama la versione 4.2 di vins-mono e vins-fusion, il processo di debug viene registrato come segue:

Grazie a questo ragazzo per il suo codice, tutti i contenuti possono essere applicati correttamente: configurazione ubuntu20.04 vins-fusion+opencv4.6
Anche questo articolo è fantastico, puoi fare riferimento a: Errore durante l'esecuzione di lvi-sam su Ubuntu20.04! Problema di conflitto tra la libreria Opencv e il pacchetto cv_bridge

1. Installa OpenCV 4.6.0

1. Scarica il codice sorgente di opencv, seleziona la versione richiesta opencv 4.6.0, l'estensione corrispondente opencv_contrib 4.6.0 e cv_bridge utilizzato per collegare ROS e opencv

Rilascia OpenCV 4.6.0 · opencv/opencv · GitHub
Rilascio 4.6.0 · opencv/opencv_contrib · GitHub
https://github.com/ros-perception/vision_opencv/tree/

1.1 Installa opencv in /usr/local/opencv-4.6.0, sposta opencv e i suoi moduli di estensione e accedi alla directory di lavoro
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

Inserisci qui la descrizione dell'immagine

1.2 Prima della compilazione, determinare il percorso di installazione di opencv Il mio percorso di installazione è CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0
1.3 Compila opencv 4.6.0, in cui ho disattivato tutte le opzioni relative a cuda e non utilizzo la GPU per il momento.
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 le prestazioni del computer sono buone, è possibile utilizzare make -j8 per compilare multi-core. Se si verificano errori di compatibilità, si consiglia di utilizzare make, che è più lento.
make -j8
sudo make install
  • 1
  • 2

2. Configurare il pacchetto di funzioni cv_bridge

1 Poiché i dati opencv e ROS devono essere convertiti, è necessario utilizzare lo strumento di bridging cv_bridge Successivamente, introdurremo come scaricare, installare e configurare il proprio pacchetto di funzioni cv_bridge.

2. Per prima cosa crea uno spazio di lavoro ros

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

3. Quindi, scarica il codice sorgente della versione corrispondente. Poiché è Ubuntu 20.04, scarica la versione noetic.

GitHub - ros-perception/vision_opencv su noetic

4. Dopo il download, estrailo nella directory ~/third/cv_bridge_ws/src/ Poiché abbiamo solo bisogno di cv_bridge, dobbiamo solo conservare la cartella cv_bridge, inserirla in ~/third/cv_bridge_ws/src/ e quindi modificare la configurazione. del documento cv_bridge.Inserisci qui la descrizione dell'immagine

Inserisci qui la descrizione dell'immagine

4.1 Modifica il file CMakeLists.txt: aggiungi il percorso di installazione di opencv davanti a set(_opencv_version 4), probabilmente alla riga 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 Inoltre, poiché cv_bridge creato da me corrisponde al pacchetto di funzioni della versione opencv 4.6.0, è meglio cambiare il nome del pacchetto. L'ho cambiato in my_cv_bridge qui.
4.3 I contenuti dell'intero file cmakelists sono i seguenti;
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 Modificare package.xml e cambiare il nome del pacchetto funzioni
<package format="2">
#  <name>cv_bridge</name>
  <name>my_cv_bridge</name>
  • 1
  • 2
  • 3
4.6 Compilare il pacchetto di funzioni cv_bridge
cd ~/cv_bridge_ws/
catkin_make
  • 1
  • 2
4.7 Se la compilazione ha esito positivo, la produzione del pacchetto di funzioni my_cv_bridge è completata, il che significa anche che opencv 4.6.0 è stato installato correttamente e che il pacchetto di funzioni my_cv_bridge può essere collegato correttamente alla versione di opencv installata da noi stessi aggiungi il percorso di questo pacchetto di funzioni alla cartella ~/.bashrc, in modo che possiamo chiamare questo pacchetto di funzioni my_cv_bridge quando compileremo vins-fusion in un secondo momento, apri la cartella ~/.bashrc e aggiungi il seguente comando alla fine
source ~/cv_bridge_ws/devel/setup.bash
  • 1
4.8 Infine, genera il percorso corrente nel terminale

origine ~/.bas在这里插入代码片HRc-dipendente

3. Compilare vins-fusion

1. Accedere al cd dell'area di lavoro vins-fusion ~/vins-fusion

2. Modificare il file vins_estimator/CMakeLists.txt

2.1 Cambia cv_bridge in 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 Aggiungere il percorso del pacchetto funzioni cv_bridge_460 e il percorso di 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 Assicurarsi che la libreria cv_bridge sia installata e collegata correttamente
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1

3 Modificare loop_fusion

3.1 File 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 Aggiungi il percorso del pacchetto funzioni cv_bridge_460 e il percorso di 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 Assicurarsi che la libreria cv_bridge sia installata e collegata correttamente
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS}  ${EIGEN3_INCLUDE_DIR} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1
3.4 File 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. Compilazione riuscita

Se la compilazione ha esito positivo e il pacchetto di funzioni my_cv_bridge in find_package può essere identificato correttamente, i tre file precedenti possono essere ottenuti nel file devel di vins-fusion.È come installare il cv_bridge ufficiale, tranne per il fatto che il pacchetto ufficiale si trova in opt/ros/noetic/...
Inserisci qui la descrizione dell'immagine

5. Tuttavia, una compilazione riuscita non significa un'operazione riuscita...

Inserisci qui la descrizione dell'immagine

Si verifica questo errore. Beh, è ​​un conflitto tra opencv4.2 e 4.6, ma ovviamente ho sostituito cv_bridge e opencv con i miei! ! Poi. . . Ho controllato cv_bridge-extras.cmake sotto my_cv_bridge/cmake e ho scoperto che dice ancora 4.2!!!

  1. Di seguito è riportata la versione corretta dopo la modifica
    a. (1) Modificare la versione in 4.6
    B. (2) Il percorso opencv_config_path è /usr/local/opencv-4.6.0/lib/cmake/opencv4
    Inserisci qui la descrizione dell'immagine

  2. Quindi, ho aperto /usr/local/opencv-4.6.0/lib/cmake/opencv4 e ho scoperto che il set (OpenCV_VERSION 4.2.0) nell'immagine sotto diceva 4.2, non 4.6 Correggi e ricompila

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

Inserisci qui la descrizione dell'immagine

  1. Quindi ricompila cv_bridge_ws sopra, quindi esegui vins-fusion e funzionerà normalmente.

6. Per quanto riguarda il problema della disinstallazione della versione opencv4.2
  1. Per garantire che i file di altre versioni non vengano eliminati accidentalmente, è possibile utilizzare i caratteri jolly per eliminare tutti i file della libreria della versione 4.2:
sudo rm /usr/local/lib/libopencv_*4.2*
  • 1

Quindi potrebbero esserci file correlati in /var e utilizzare lo stesso metodo di eliminazione.
2. Controlla il percorso relativo alla libreria opencv. I file di collegamento alla libreria si trovano tutti in questo file:

sudo find / -iname "*opencv*"
  • 1
  1. Aggiorna la cache della libreria di collegamento dinamico
sudo ldconfig
  • 1
  1. Disinstallare il cv_bridge originale sudo apt-get rimuovi ros-melodic-cv-bridge, scaricare la propria versione di cv_bridge corrispondente a ros e collegarsi all'opencv specificato [Può essere disinstallato o no? ? L'ho rimosso]

7. Informazioni sul file 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