Berbagi teknologi

Masalah konflik antara opencv4.6 dan opencv4.2 yang bergantung pada cv_bridge saat menjalankan vins-fusion

2024-07-12

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

Bug yang telah disesuaikan selama lebih dari sehari akhirnya diselesaikan... dan diposting untuk referensi Anda.

1. Untuk masalah konflik antara menjalankan opencv4.6 dan cv_bridge yang memanggil vins-mono dan vins-fusion versi 4.2, proses debugging dicatat sebagai berikut:

Terima kasih kepada orang ini atas kodenya, semua konten dapat diterapkan dengan benar: konfigurasi ubuntu20.04 vins-fusion+opencv4.6
Artikel ini juga bagus, Anda bisa merujuk ke: Kesalahan saat menjalankan lvi-sam di ubuntu20.04! Masalah konflik antara perpustakaan Opencv dan paket cv_bridge

1. Instal OpenCV 4.6.0

1. Unduh kode sumber opencv, pilih versi opencv 4.6.0 yang diperlukan, ekstensi yang sesuai opencv_contrib 4.6.0, dan cv_bridge yang digunakan untuk menjembatani ROS dan opencv

Rilis OpenCV 4.6.0 · opencv/opencv · GitHub
Rilis 4.6.0 · opencv/opencv_contrib · GitHub
https://github.com/ros-perception/vision_opencv/pohon/

1.1 Instal opencv di bawah /usr/local/opencv-4.6.0, pindahkan opencv dan modul ekstensinya dan masuk ke direktori kerja
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

Masukkan deskripsi gambar di sini

1.2 Sebelum kompilasi, tentukan jalur instalasi opencv. Jalur instalasi saya adalah CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.6.0
1.3 Kompilasi opencv 4.6.0, di mana saya memilih semua opsi terkait cuda untuk menonaktifkan dan tidak menggunakan GPU untuk saat ini.
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 Jika kinerja komputer bagus, Anda dapat menggunakan make -j8 untuk mengkompilasi multi-core. Jika terjadi kesalahan kompatibilitas, disarankan untuk menggunakan make, yang lebih lambat.
make -j8
sudo make install
  • 1
  • 2

2. Konfigurasikan paket fungsi cv_bridge

1 Karena data opencv dan data ROS perlu dikonversi, maka perlu menggunakan alat penghubung cv_bridge. Selanjutnya, kami akan memperkenalkan cara mengunduh, menginstal, dan mengkonfigurasi paket fungsi cv_bridge Anda sendiri.

2. Pertama buat ruang kerja ros

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

3. Kemudian, unduh kode sumber dari versi yang sesuai. Karena ini Ubuntu 20.04, unduh versi noetic.

GitHub - ros-perception/vision_opencv di noetic

4. Setelah didownload, ekstrak ke direktori ~/third/cv_bridge_ws/src/ Karena kita hanya membutuhkan cv_bridge, kita hanya perlu menyimpan folder cv_bridge, taruh di ~/third/cv_bridge_ws/src/ lalu modifikasi konfigurasinya. dari dokumen cv_bridge.Masukkan deskripsi gambar di sini

Masukkan deskripsi gambar di sini

4.1 Ubah file CMakeLists.txt: tambahkan jalur instalasi opencv Anda di depan set(_opencv_version 4), mungkin pada baris 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 Selain itu, karena cv_bridge yang saya buat sesuai dengan paket fungsi versi opencv 4.6.0, yang terbaik adalah mengubah nama paket di sini.
4.3 Isi seluruh file cmakelis adalah sebagai berikut;
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 Ubah package.xml dan ubah nama paket fungsi
<package format="2">
#  <name>cv_bridge</name>
  <name>my_cv_bridge</name>
  • 1
  • 2
  • 3
4.6 Kompilasi paket fungsi cv_bridge
cd ~/cv_bridge_ws/
catkin_make
  • 1
  • 2
4.7 Jika kompilasi berhasil, produksi paket fungsi my_cv_bridge selesai, yang juga berarti opencv 4.6.0 telah diinstal dengan benar, dan paket fungsi my_cv_bridge dapat dihubungkan dengan benar ke versi opencv yang kami instal tambahkan path paket fungsi ini ke folder ~/.bashrc, sehingga kita dapat memanggil paket fungsi my_cv_bridge ini saat mengkompilasi vins-fusion nanti, buka folder ~/.bashrc, dan tambahkan perintah berikut di akhir
source ~/cv_bridge_ws/devel/setup.bash
  • 1
4.8 Terakhir, sumber jalur saat ini di terminal

sumber ~/.bas在这里插入代码片jam kerja

3. Kompilasi vins-fusion

1. Masuk ke ruang kerja vins-fusion cd ~/vins-fusion

2. Ubah file vins_estimator/CMakeLists.txt

2.1 Ubah cv_bridge menjadi 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 Tambahkan jalur paket fungsi cv_bridge_460 dan jalur 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 Pastikan perpustakaan cv_bridge diinstal dan ditautkan dengan benar
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1

3 Ubah loop_fusion

3.1 berkas 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 Tambahkan jalur paket fungsi cv_bridge_460 dan jalur 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 Pastikan perpustakaan cv_bridge diinstal dan ditautkan dengan benar
include_directories(${catkin_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS}  ${EIGEN3_INCLUDE_DIR} ${my_cv_bridge_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
  • 1
3.4 File cmakelist lengkap
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. Kompilasi berhasil

Jika kompilasi berhasil dan paket fungsi my_cv_bridge di find_package dapat diidentifikasi dengan benar, ketiga file di atas dapat diperoleh di file pengembangan vins-fusion.Sama halnya dengan menginstal cv_bridge resmi, hanya saja paket resminya ada di opt/ros/noetic/…
Masukkan deskripsi gambar di sini

5. Namun, kompilasi yang berhasil tidak berarti operasi yang sukses...

Masukkan deskripsi gambar di sini

Kesalahan ini terjadi. Ya, ini adalah konflik antara opencv4.2 dan 4.6, tapi saya jelas telah mengganti cv_bridge dan opencv dengan milik saya sendiri! ! Kemudian. . . Saya memeriksa cv_bridge-extras.cmake di bawah my_cv_bridge/cmake dan ternyata masih tertulis 4.2!!!

  1. Di bawah ini adalah versi yang benar setelah modifikasi
    a.(1) Ubah versi menjadi 4.6
    B. (2)opencv_config_path menggunakan perintah/usr/local/opencv-4.6.0/lib/cmake/opencv4
    Masukkan deskripsi gambar di sini

  2. Kemudian, saya membuka /usr/local/opencv-4.6.0/lib/cmake/opencv4 dan menemukan bahwa set (OpenCV_VERSION 4.2.0) pada gambar di bawah mengatakan 4.2, bukan 4.6!!! Benar dan kompilasi ulang

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

Masukkan deskripsi gambar di sini

  1. Kemudian kompilasi ulang cv_bridge_ws diatas, lalu jalankan vins-fusion dan akan berjalan normal.

6. Mengenai masalah uninstall versi opencv4.2
  1. Untuk memastikan bahwa file versi lain tidak terhapus secara tidak sengaja, Anda dapat menggunakan wildcard untuk menghapus semua file perpustakaan versi 4.2:
sudo rm /usr/local/lib/libopencv_*4.2*
  • 1

Lalu mungkin ada file terkait di/var dan menggunakan metode penghapusan yang sama.
2. Periksa jalur yang terkait dengan perpustakaan opencv. Semua file tautan perpustakaan ada di bawah file ini:

sudo find / -iname "*opencv*"
  • 1
  1. Perbarui cache perpustakaan tautan dinamis
sudo ldconfig
  • 1
  1. Hapus instalan cv_bridge asli sudo apt-get delete ros-melodic-cv-bridge, unduh cv_bridge versi Anda sendiri yang sesuai dengan ros dan tautkan ke opencv yang ditentukan [Bisakah ini dihapus atau tidak? ? saya menghapusnya]

7. Tentang 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