Обмен технологиями

Проблема конфликта между 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, и пока не использую графический процессор.
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, загрузите ноэтическую версию.

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在这里插入代码片хрс

3. Компилируем вин-фьюжн

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. Измените цикл_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