技術共有

vins-fusion の実行時に cv_bridge が依存する opencv4.6 と opencv4.2 の間の競合の問題

2024-07-12

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

1日以上調整されていたバグがようやく解決しましたので…参考までに掲載します。

1. opencv4.6 の実行と、vins-mono および vins-fusion のバージョン 4.2 を呼び出す cv_bridge の間の競合の問題については、デバッグ プロセスが次のように記録されます。

この人のコードのおかげで、すべての内容を正しく適用できます: ubuntu20.04 構成 vins-fusion+opencv4.6
この記事も素晴らしいです。参照してください: ubuntu20.04 で lvi-sam を実行するときにエラーが発生しました! Opencv ライブラリと cv_bridge パッケージ間の競合の問題

1. OpenCV 4.6.0をインストールする

1. opencv ソース コードをダウンロードし、必要なバージョン opencv 4.6.0、対応する拡張子 opencv_contrib 4.6.0、および ROS と opencv のブリッジに使用される cv_bridge を選択します。

OpenCV 4.6.0 をリリース · opencv/opencv · GitHub
リリース 4.6.0 · opencv/opencv_contrib · GitHub
参考:

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 関連のオプションをすべてオフに選択し、当面は 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 - noetic の ros-perception/vision_opencv

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 版の機能パッケージに相当するので、ここではパッケージ名を変更した方が良いと思います。
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 フォルダーに追加して、後で vins-fusion をコンパイルするときにこの my_cv_bridge 関数パッケージを呼び出せるようにします。 ~/.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 ループフュージョンを変更する

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. コンパイルが成功しました

コンパイルが成功し、find_package 内の my_cv_bridge 関数パッケージが正しく特定できれば、vins-fusion の devel ファイル内に上記 3 つのファイルが取得できます。公式パッケージが opt/ros/noetic/… にあることを除いて、公式 cv_bridge のインストールと同じです。
ここに画像の説明を挿入します

5. ただし、コンパイルが成功しても、操作が成功するとは限りません...

ここに画像の説明を挿入します

このエラーは、opencv4.2 と 4.6 の間で競合しますが、明らかに cv_bridge と opencv を自分のものに置き換えています。 !それから。 。 。 my_cv_bridge/cmake の下の cv_bridge-extras.cmake を確認したところ、まだ 4.2 と表示されていることがわかりました。

  1. 以下は修正後の正しいバージョンです
    a. (1) バージョンを 4.6 に変更します。
    b. (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.6 ではなく 4.2 と表示されていることがわかりました。修正して再コンパイルしてください。

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 replace ros-melodic-cv-bridge、ros に対応する独自のバージョンの cv_bridge をダウンロードし、指定された 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