ROS には OpenCV とローカル OpenCV バージョンの競合解決機能が付属しています

1. エラーメッセージ

まず、catkin_make による関数パッケージのコンパイルには問題がなく、ターゲット ファイルが 100% 生成されますが、警告が報告されます。ライブラリ ファイル libmyslam.so には libopencv_core.so.3.4 が必要であり、libopencv_core.so と競合する可能性があります。 3.2. エンジニアリングの経験によれば、警告を無視して直接実行してください。

[100%] Linking CXX executable /home/dzh/Demo/VO/devel/lib/ros_vo/run_vo
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by /home/dzh/Demo/VO/src/ros_vo/lib/libmyslam.so, may conflict with libopencv_core.so.3.2
/usr/bin/ld: warning: libopencv_imgcodecs.so.3.4, needed by /usr/local/lib/libopencv_highgui.so.3.4.5, may conflict with libopencv_imgcodecs.so.3.2
/usr/bin/ld: warning: libopencv_imgproc.so.3.4, needed by /usr/local/lib/libopencv_highgui.so.3.4.5, may conflict with libopencv_imgproc.so.3.2
[100%] Built target run_vo

roscoreとrosrunを実行すると、コアがダンプされたというエラーが発生します。検索のエラー分析は、cv_bridge がデフォルトで ros に付属する OpenCV バージョン 3.2.0 を呼び出すことです。OpenCV3.4.5 をローカルにインストールしましたが、関数パッケージの下の CMakeLists.txt にあるパッケージも 3.4.5 です。 cv_bridge はエラーを報告します。

OpenCV Error: Bad argument (Unknown interpolation method) in resize, 
file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/imgwarp.cpp, line 3367
terminate called after throwing an instance of 'cv::Exception'
what():  /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/imgwarp.cpp:3367: 
error: (-5) Unknown interpolation method in function resize
已放弃 (核心已转储)

2. 解決策

1. まず、 cv_bridgeプロジェクトをダウンロードする必要があります(cv_bridgeその中のフォルダーのみ)。

ここに画像の説明を挿入2. これをプロジェクトの src ディレクトリに置きます。これは関数パッケージに相当します。

cv_bridge/CMakeLists.txt ファイル内のプロジェクトの名前を変更します。

project(cv_bridge)   改为   project(cv_bridge_1) 

cv_bridge/package.xml のパッケージ名を変更します。

 <name>cv_bridge</name>  改为  <name>cv_bridge_1</name>

cv_bridge/CMakeLists.txt ファイルで必要な OpenCV バージョンをローカル バージョンに変更します。

find_package(OpenCV 3.4.5 REQUIRED
  COMPONENTS
    opencv_core
    opencv_imgproc
    opencv_imgcodecs
  CONFIG
)

3. 次に、catkin_make を実行して、プロジェクトのルート ディレクトリ/src にある関数パッケージをコンパイルします。

ここに画像の説明を挿入
4. libcv_bridge_1.so ファイルが devel/lib ディレクトリに生成されます。これが必要なライブラリ ファイルです。ros に付属の OpenCV は使用されなくなりました。

ここに画像の説明を挿入
独自の関数パッケージの下に新しい lib ディレクトリを作成し、上記の共有ライブラリを配置し、ヘッダー ファイルをlibcv_bridge_1.soinclude に配置します。cv_bridge

ここに画像の説明を挿入
5. 最も重要なことを開始します。独自の関数パッケージの下にある CMakeLists.txt を変更します。

  • 以前に検索した cv_bridge ライブラリを削除します。
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  sensor_msgs
  image_transport 
  message_generation
)
  • ヘッダー ファイル パス インクルードを追加
include_directories(
  include
  ${
    
    catkin_INCLUDE_DIRS}
)
  • ディレクトリ lib を含める
link_directories(
  lib
  ${
    
    catkin_LIB_DIRS}
)
  • リンクライブラリファイル libcv_bridge_1.so
target_link_libraries(run_vo
  ${
    
    catkin_LIBRARIES}
  ${
    
    OpenCV_LIBS}
  libcv_bridge_1.so
)

6. catkin_make を再実行すると、rosrun が正常に実行され、コア ダンプ エラーは発生しません。

ここに画像の説明を挿入

1 時間探索し、さまざまな方法を試した後、最終的に私自身の一連の方法をまとめました。

おすすめ

転載: blog.csdn.net/qq_42257666/article/details/131450279