備注:2023.7.4修改,如果是ros空間,可以在工作空間中使用單獨(dú)cv_bridge的方式?。?!比較簡(jiǎn)單,是我目前常用的方式。放在文章最后。
由于ROS Melodic自帶的是Opencv3.2.0,而我自己下載的是opencv3.4.5,所以需要將cv_bridge的指向改為我自己安裝的opencv。
全篇很長(zhǎng),建議看完后操作,不要跟著做。
一開始我參考了這個(gè)博主的文章
Ubuntu18.04 ros-melodic opencv版本沖突問題解決_一抹煙霞的博客-CSDN博客_rosopencv版本
但是在編譯ORB-SLAM3(beta0.4)時(shí)報(bào)錯(cuò),在/usr/lib/x86_64-linux-gnu/中找不到libopencv_core.so.3.4.5、libopencv_imgproc.so.3.4.5和libopencv_imgcodecs.so.3.4.5
于是我在上面博主修改的基礎(chǔ)上做了如下修改:(沒有加入/usr/include)
sudo gedit /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake
###作出如下修改
?
if(NOT "include;/usr/include;/usr/include/opencv " STREQUAL " ")
set(cv_bridge_INCLUDE_DIRS "")
#set(_include_dirs "include;/usr/include;/usr/include/opencv")
set(_include_dirs "include;/usr/local/lib;/usr/local/include/opencv;/usr/local/include/opencv2;/usr/local/include;")
以及
set(libraries "cv_bridge;/usr/local/lib/libopencv_core.so.3.4.5;/usr/local/lib/libopencv_imgproc.so.3.4.5;/usr/local/lib/libopencv_imgcodecs.so.3.4.5")
然后再修改文件
sudo gedit /opt/ros/melodic/share/cv_bridge/cmake/cv_bridge-extras.cmake
###作出如下修改
set(OpenCV_VERSION 3.4.5)
set(OpenCV_VERSION_MAJOR 3)
set(OpenCV_VERSION_MINOR 4)
set(OpenCV_VERSION_PATCH 5)
?以及
cd /opt/ros/melodic/lib/
sudo gedit pkgconfig/cv_bridge.pc
##做如下修改
Libs: -L${prefix}/lib -lcv_bridge /usr/local/lib/libopencv_core.so.3.4.5 /usr/local/lib/libopencv_imgproc.so.3.4.5 /usr/local/lib/libopencv_imgcodecs.so.3.4.5
?這個(gè)時(shí)候編譯ORB-SLAM3可以通過了,但是運(yùn)行rosrun ORB-SLAM3時(shí)候會(huì)出現(xiàn)段錯(cuò)誤,然后退出。我將所有的cmakelist中的opencv都改成opencv 3.4.5后重新編譯依舊不行。
接著我把他放一邊嘗試使用Vins-fusion,編譯到最后的時(shí)候報(bào)警告
/usr/bin/ld: warning: libopencv_imgcodecs.so.3.2, needed by /opt/ros/melodic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.3.4
/usr/bin/ld: warning: libopencv_core.so.3.2, needed by /opt/ros/melodic/lib/libcv_bridge.so, may conflict with libopencv_core.so.3.4
同時(shí)rosrun vins_node 運(yùn)行閃退,根據(jù)警告是動(dòng)態(tài)連接庫(kù)libcv_brdge.so問題
然后我在vins_fusion的catkin_ws文件夾中運(yùn)行查看連接庫(kù)
ldd devel/lib/libvins_lib.so | grep opencv
輸出:
libopencv_core.so.3.4 => /usr/local/lib/libopencv_core.so.3.4 (0x00007f7b2d122000)
libopencv_imgproc.so.3.4 => /usr/local/lib/libopencv_imgproc.so.3.4 (0x00007f7b2a304000)
libopencv_imgcodecs.so.3.4 => /usr/local/lib/libopencv_imgcodecs.so.3.4 (0x00007f7b29a6e000)
libopencv_video.so.3.4 => /usr/local/lib/libopencv_video.so.3.4 (0x00007f7b27ce3000)
libopencv_calib3d.so.3.4 => /usr/local/lib/libopencv_calib3d.so.3.4 (0x00007f7b27955000)
libopencv_imgcodecs.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_imgcodecs.so.3.2 (0x00007f7b262d8000)
libopencv_imgproc.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.3.2 (0x00007f7b25a7f000)
libopencv_core.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_core.so.3.2 (0x00007f7b25644000)
libopencv_features2d.so.3.4 => /usr/local/lib/libopencv_features2d.so.3.4 (0x00007f7b21d25000)
libopencv_flann.so.3.4 => /usr/local/lib/libopencv_flann.so.3.4 (0x00007f7b21acd000)
可以看到其中有三個(gè)連接庫(kù)出問題了。
cd /opt/ros/melodic/lib/
ldd libcv_bridge.so | grep opencv
##如下輸出
libopencv_imgcodecs.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_imgcodecs.so.3.2 (0x00007fd8d2bed000)
libopencv_imgproc.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.3.2 (0x00007fd8cfac7000)
libopencv_core.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_core.so.3.2 (0x00007fd8ce7a9000)
原來是這個(gè)出問題了,我只好下載了vision_opencv,鏈接如下:
GitHub - ros-perception/vision_opencv
進(jìn)入cv_bridge后
mkdir build && cd build
cmake ..
make
cd devel/lib/
sudo rm /opt/ros/melodic/lib/libcv_bridge.so
sudo cp libcv_bridge.so /opt/opt/ros/melodic/lib/
終于一切恢復(fù)了正常,經(jīng)過了一番折騰,不知道后續(xù)是否還會(huì)有問題。所以我還是用源碼的cv_bridge
cd cv_bridge/build/
sudo make install
然后將vins和orb中需要opencv的CMakerlist中在find_package之前加入
set(cv_bridge_DIR /usr/local/share/cv_bridge/cmake)
然后重新編譯工程,完美通過。使用也沒問題。然后刪除原來的cv_bridge
sudo apt remove ros-melodic-cv-bridge
然后使用ORB和vins沒有問題。
后記:
后來我嘗試不做上述修改(刪除ros重新裝了,好累。。。),然后刪除了工程中的build文件夾重新嘗試了一次,編譯ORB-SLAM3的ros包時(shí)候報(bào)錯(cuò)
[rosbuild] Building package ORB_SLAM3
Failed to invoke /opt/ros/melodic/bin/rospack deps-manifests ORB_SLAM3
[rospack] Error: package 'ORB_SLAM3' depends on non-existent package 'cv_bridge' and rosdep claims that it is not a system dependency. Check the ROS_PACKAGE_PATH or try calling 'rosdep update'
CMake Error at /opt/ros/melodic/share/ros/core/rosbuild/public.cmake:129 (message):
Failed to invoke rospack to get compile flags for package 'ORB_SLAM3'.
Look above for errors from rospack itself. Aborting. Please fix the
broken dependency!
Call Stack (most recent call first):
/opt/ros/melodic/share/ros/core/rosbuild/public.cmake:207 (rosbuild_invoke_rospack)
CMakeLists.txt:4 (rosbuild_init)
大概就是找不到ros的cv_bridge,也找不到我安裝的cv_bridge,我也嘗試rosdep update,但是沒什么用,所以我將在/usr/local/share/中的cv_bridge文件夾復(fù)制到/opt/ros/melodic/share/中,然后再次./build_ros.sh就可以通過了。
分析:我覺得一開始我使用的是原本的cv_bridge來進(jìn)行編譯的,經(jīng)過修改后可以使用,然后我將cv_bridge用apt刪除后,系統(tǒng)自動(dòng)在/usr/local/中找到了我安裝的cv_bridge,所以也可以正常使用。但是后來嘗試從新開始,ros中不做修改,編譯ORB-SLAM3會(huì)有警告,說明用的還是ros安裝時(shí)候自帶的cv_bridge,刪除自帶的以后編譯又找不到我自己安裝的,就會(huì)報(bào)找不到cv_bridge,這個(gè)時(shí)候我把我安裝的cv_bridge復(fù)制到ros中就可以編譯通過了。
總結(jié)方法:
1、修改ros的cv_bridge
2、不刪除原來的cv_bridge,安裝源碼的cvbridge,然后在cmakelist中修改,編譯完成后apt刪除原來的bridge。
3、刪除原來的cv_bridge,安裝源碼bridge,然后cmakelist中修改,并復(fù)制/usr/local/share中的bridge到ros路徑中(上面有寫)。
因?yàn)閛pencv和cv_bridge指向的問題,如果是一個(gè)ros工程,有一個(gè)ros空間,那么我們可以下載cv_bidge到工作空間的src文件夾中。其中opencv3用melodic,opencv4用noetic。一個(gè)工程一個(gè)cv_bridge(井水不犯河水)
GitHub - ros-perception/vision_opencv
1、為了防止沖突將cv_bridge下 CMakeLists.txt 文件中 project 名稱修改為 my_cv_bridge:
project(my_cv_bridge)
修改:
find_package(OpenCV 4.2.0 QUIET)
并修改 package.xml 中包的名稱:
<name>my_cv_bridge</name>
2、編譯cv_bridge
到工作空間的根目錄,執(zhí)行?catkin_make
可能會(huì)報(bào)錯(cuò):
Could not fild the following Boost libraries:
boost_python37
解決:
修改cv_bridge的CMAKELIST中
...
if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
# Debian Buster
find_package(Boost REQUIRED python36)
...
還有錯(cuò):
/usr/include/python2.7/numpy/__ multiarray_api.h:1537:144:error:return-statement with ∩o
value,in function returning 'void*' [ -fpermissive ]
解決:
修改 cv_bridge/src/module.hpp 文件下
void* do_numpy_import()函數(shù)改為:
static void do_numpy_import( )
{
import_array( );
}
編譯通過了。
3、使用文章來源:http://www.zghlxwxcb.cn/news/detail-605273.html
在你的工程cmakelist中
find_package(my_cv_bridge)
同時(shí)修改 package.xml 文件:
...
<build_depend>my_cv_bridge</build_depend>
...
<exec_depend>my_cv_bridge</exec_depend>
...
再次編譯即可了。文章來源地址http://www.zghlxwxcb.cn/news/detail-605273.html
到了這里,關(guān)于Ubuntu18.04 ROS Melodic的cv_bridge指向問題(四種方式,包括opencv4)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!