Κοινή χρήση τεχνολογίας

Πρόβλημα σύγκρουσης μεταξύ opencv4.6 και opencv4.2 από το οποίο εξαρτάται το cv_bridge κατά την εκτέλεση του vins-fusion

2024-07-12

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

Το σφάλμα που είχε προσαρμοστεί για περισσότερο από μια μέρα επιλύθηκε τελικά... και δημοσιεύτηκε για αναφορά σας.

1. Για το πρόβλημα της διένεξης μεταξύ εκτέλεσης opencv4.6 και cv_bridge που καλεί την έκδοση 4.2 του vins-mono και του vins-fusion, η διαδικασία εντοπισμού σφαλμάτων καταγράφεται ως εξής:

Χάρη σε αυτόν τον τύπο για τον κωδικό του, όλα τα περιεχόμενα μπορούν να εφαρμοστούν σωστά: διαμόρφωση ubuntu20.04 vins-fusion+opencv4.6
Αυτό το άρθρο είναι επίσης υπέροχο, μπορείτε να ανατρέξετε στο: Σφάλμα κατά την εκτέλεση του lvi-sam στο ubuntu20.04! Πρόβλημα σύγκρουσης μεταξύ της βιβλιοθήκης Opencv και του πακέτου cv_bridge

1. Εγκαταστήστε το OpenCV 4.6.0

1. Κατεβάστε τον πηγαίο κώδικα opencv, επιλέξτε την απαιτούμενη έκδοση opencv 4.6.0, την αντίστοιχη επέκταση opencv_contrib 4.6.0 και το cv_bridge που χρησιμοποιείται για τη γεφύρωση ROS και opencv

Κυκλοφορία OpenCV 4.6.0 · opencv/opencv · GitHub
Έκδοση 4.6.0 · opencv/opencv_contrib · GitHub
https://github.com/ros-perception/vision_opencv/tree/

1.1 Εγκαταστήστε το opencv στο /usr/local/opencv-4.6.0, μετακινήστε το 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 Μεταγλώττιση του opencv 4.6.0, στο οποίο επέλεξα όλες τις επιλογές που σχετίζονται με το cuda σε off και δεν χρησιμοποιώ gpu προς το παρόν.
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 - ros-perception/vision_opencv στο noetic

4. Μετά τη λήψη, εξαγάγετε τον στον κατάλογο ~/third/cv_bridge_ws/src/ Επειδή χρειαζόμαστε μόνο cv_bridge, χρειάζεται μόνο να διατηρήσουμε το φάκελο cv_bridge, να τον βάλουμε στο ~/third/cv_bridge_ws/src/ και στη συνέχεια να τροποποιήσουμε το cv_bridge. εγγράφου.Εισαγάγετε την περιγραφή της εικόνας εδώ

Εισαγάγετε την περιγραφή της εικόνας εδώ

4.1 Τροποποίηση του αρχείου CMakeLists.txt: προσθέστε τη διαδρομή εγκατάστασης του opencv μπροστά από το set(_opencv_version 4), πιθανώς στη γραμμή 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 που έχουμε εγκαταστήσει εμείς προσθέστε τη διαδρομή αυτού του πακέτου συναρτήσεων στον φάκελο ~/.bashrc, έτσι ώστε να καλέσουμε αυτό το πακέτο συναρτήσεων my_cv_bridge κατά τη μεταγλώττιση του vins-fusion αργότερα, ανοίξτε τον φάκελο ~/.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. Επιτυχής μεταγλώττιση

Εάν η μεταγλώττιση είναι επιτυχής και το πακέτο συναρτήσεων my_cv_bridge στο find_package μπορεί να αναγνωριστεί σωστά, τα παραπάνω τρία αρχεία μπορούν να ληφθούν στο αρχείο ανάπτυξης του vins-fusion.Είναι το ίδιο με την εγκατάσταση του επίσημου cv_bridge, με τη διαφορά ότι το επίσημο πακέτο είναι στο opt/ros/noetic/…
Εισαγάγετε την περιγραφή της εικόνας εδώ

5. Ωστόσο, επιτυχής μεταγλώττιση δεν σημαίνει επιτυχημένη λειτουργία...

Εισαγάγετε την περιγραφή της εικόνας εδώ

Αυτό το σφάλμα παρουσιάζεται, λοιπόν, είναι μια σύγκρουση μεταξύ opencv4.2 και 4.6, αλλά προφανώς έχω αντικαταστήσει τα cv_bridge και opencv με τα δικά μου! ! Επειτα. . . Έλεγξα το cv_bridge-extras.cmake κάτω από το my_cv_bridge/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.2, όχι 4.6

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 remove ros-melodic-cv-bridge, κατεβάστε τη δική σας έκδοση του cv_bridge που αντιστοιχεί στο ros και συνδέστε το στο καθορισμένο 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