<先看后面的重要提醒!!!!!!>
运行单目+IMU案例
1.第一个终端:
roscore
2.第二个终端:
在SLAM3工程文件夹下进入终端:
rosrun ORB_SLAM3 Mono_Inertial Vocabulary/ORBvoc.txt Examples_old/Monocular-Inertial/EuRoC.yaml true
查询原因说是cv_bridge对opencv指向问题,cv_bridge默认指向ros安装自带的opencv3.2.0,就会与自己安装的opencv产生冲突
**
cv_bridge与opencv指向解决方法:
**
- 第一种:
修改ros安装路径中的cv_bridge相关文件的路径,指向自己安装的opencv
sudo gedit /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake
使用sudo apt install ros-melodic-desktop-full安装的ros,会默认安装opencv3.2.0版本到/usr/include,/usr/lib,/usr/share三个目录。
但是如果自己从opencv官网源码编译安装的,opencv会默认安装到usr/local下对应的三个子目录。
将路径改成自己安装opencv默认的对应的子目录。
sudo gedit /opt/ros/melodic/share/cv_bridge/cmake/cv_bridge-extras.cmake
将版本号改为自己安装的版本号
cd /opt/ros/melodic/lib/
sudo gedit pkgconfig/cv_bridge.pc
同样,将相关路径改成自己的
最后catkin_make项目即可。
但在实操中,还是警告了
发现还是关联到ros默认的安装版本,感觉应该是重新编译ros才生效,然后再重新catkin_make项目。
- 第二种:
下载cv_bridge包编译
下载网址:https://gitee.com/bingobinlw/cv_bridge
mkdir -p cv_bridge_ws/src
cd cv_bridge_ws/src
git clone https://gitee.com/bingobinlw/cv_bridge //此链接适用于18.04
cd ..
将自己安装的opencv编译生成的build文件路径加入CMakeLists.txt
修改为
编译cv_bridge包:
catkin_make
最后,在所需要使用cv_bridge的ros包里的CMakeLists.txt文件中添加opencv路径以及cv_bridge路径
set(OpenCV_DIR "your-path/opencv-x.x.x/build")
set(cv_bridge_DIR your-path/cv_bridge_ws/devel/share/cv_bridge/cmake)
例如:此处修改SLAM3中ros包中slam3的CMakeLists.txt
删除之前编译产生的文件,重新编译项目。真是很糟糕,白忙活一场,这方法对我的还是不起效果,还是报如下错误。
- 第三种:
卸载ROS自动安装的cv_bridge,重新安装
1)卸载原版本cv_bridge
sudo apt-get remove ros-melodic-cv-bridge
2)下载新版本cv_bridge
网址:https://github.com/ros-perception/vision_opencv
选择melodic对应的cv_bridge
3)修改cv_bridge中的cmakelists.txt
将find_package(OpenCV 3.4.5 REQUIRED中的版本号改成你安装的版本号
4)cmake单独编译cv_bridge
在cv_bridge文件夹下,进入终端
mkdir build
cd build
cmake ..
make
sudo make install
5)在项目中需要的cmaklist.txt中添加cv_bridge的cmake路径
set(cv_bridge_DIR /usr/local/share/cv_bridge/cmake) //在find_package前面
我在以下三个CMakeLists.txt都添加了cv_bridge的cmake路:
/home/fei/ORB_SLAM3/CMakeLists.txt
/home/fei/ORB_SLAM3/Thirdparty/DBoW2/CMakeLists.txt
/home/fei/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt
6)重新编译ros版本的ORB_SLAM3
编译时报错:
– Configuring incomplete, errors occurred!
See also “/home/fei/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/build/CMakeFiles/CMakeOutput.log”.
make: *** 没有指明目标并且找不到 makefile。 停止.
首先,我在.bashrc文件添加了该ROS项目的路径,所以不是该原因造成的。
应该是删除了ROS自安装的cv_bridge,而在编译时,系统还是自动从ROS路径查找,所以,将自己的安装的cv_bridge包复制粘贴到ROS的安装对应路径下。
根目录无法复制文件夹,所以终端输入:
sudo nautilus
在弹出的文件界面将/usr/local/share/中的cv_bridge
复制到/opt/ros/melodic/share中
删除刚编译产生的文件,再次编译:
chmod +x ./build_ros.sh
./build_ros.sh
没有再报版本冲突警告
继续前面的案例运行到第二个终端:
测试其他项目是否正常
测试ORB_SLAM2:
第一个终端:roscore
第二个终端:roslaunch usb_cam usb_cam-test.launch
果然报错,解决方案依次运行以下指令:
sudo apt-get install ros-melodic-usb-cam
sudo apt-get install ros-melodic-camera-calibration
sudo apt-get install ros-melodic-image-view
第三个终端:
rosrun ORB_SLAM2 Mono /home/fei/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/fei/ORB_SLAM2/ost.yaml
结果正常。
测试VINs_Mono:结果也正常
但是我返回来测试ORB_SLAM3时又不行了,又是冲突,核心已转储。原因是为解决相机问题安装的三个包,又再一次装回了原来的cv_bridge。
- 第四种:
前言:不用卸载ros自安装的cv_bridge,按照上述第三种中cv_bridge安装方法编译,或者这里可以参考下面的安装方法,两种方法随便一种都可以。
另一种cv_bridge安装编译方法:
(1)下载安装包
网址:https://github.com/ros-perception/vision_opencv
选择对应ros版本的vision_opencv
(2)修改cv_bridge的CMakeLists.txt
在vision_opencv/cv_bridge中打开CMakeLists.txt,将其中的opencv版本改成自己安装的版本
(3)编译
在cv_bridge文件夹下进入终端:
mkdir build
cd build
cmake ..
make
sudo make install
(4)覆盖ros默认安装的libcv_bridge.so
终端输入sudo nautilus
将我们刚安装的cv_bridge中产生的libcv_bridge.so复制,粘贴到ros该lib的路径中,覆盖原来的libcv_bridge.so
该方法是在各种尝试后,又返回警告,仔细观察:
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
usr/bin/ld: warning: libopencv_imgproc.so.3.2, needed by /opt/ros/melodic/lib/libcv_bridge.so, may conflict with libopencv_imgproc.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
把需要的这几个libopencv_core.so.3.4、libopencv_imgproc.so.3.4、libopencv_imgproc.so.3.4放入跟3.2一样的路径中,再把第一种方法中的cv_bridgeConfig.cmake文件只修改set_libraries中的版本号,重新编译slam3项目还是报一样的错误。随后根据/opt/ros/melodic/lib/libcv_bridge.so,将其覆盖成自己安装的libcv_bridge.so,重新编译slam3通过了。
(5)测试
重新编译slam3 ros版本
chmod +x ./build_ros.sh
./build_ros.sh
没有警告,运行带imu的也没有报核心已转储。
测试ORB_SLAM2和VINs_Mono也没有任何问题。
重要提醒:
不是前三种对我不行,而是项目的CMakeLists.txt中引用ROS的方式不一样。
1)如果是:
则使用第四种方法有效
2)如果是:
则前三种都有效
3.第三个终端:
在有目标数据包文件夹下进入终端:
rosbag play MH_01_easy.bag /cam0/image_raw:=/camera/image_raw /imu0:=/imu