问题原因:
1.ubuntu20.04安装了ROS Noetic自带OpenCV 4,而VINS-Mono适配OpenCV 3,所以在编译过程中会产生诸如:error: ‘CV_BGR2GRAY’ was not declared in this scope等错误。为了解决OpenCV版本不一致所带来的问题,因此安装了OpenCV 3,编译顺利通过。
2.虽然编译通过,但是会有Warnings,提示opencv3的cv::bridge和opencv4的cv::bridge可能存在冲突。在涉及 ros 的算法中,涉及图像就必然要使用到 cv_bridge 这个包,而 cv_bridge 这个包默认使用的 ros 自带的 opencv 版本。因此,代码工程中同时使用了 2 个版本的 opencv,虽然编译能过,但是一旦运行就会冲突报错。
解决办法:
最好不要动已有的cv::bridge,使用适配OpenCV 3的cv::bridge是更好的选择,然后修改VINS-Mono中用到cv_bridge的CMakeLists
一、编译cv::bridge
1.新建ros工作空间cv_bridge_ws,将cv_bridge包克隆到src目录下
mkdir -p ~/cv_bridge_ws/src
cd cv_bridge_ws/src
git clone https://gitee.com/bingobinlw/cv_bridge.git
2.修改cv_bridge包中CMakeLists.txt OpenCV的路径
set(OpenCV_DIR "/home/hnu/software/opencv-3.3.0/build")
3.编译
catkin_make
4.可能存在的问题Could not find a package configuration file provided by “boost_python3" 将 CMakeLists.txt 中的如下语句:
if(NOT ANDROID)
find_package(PythonLibs)
if(PYTHONLIBS_VERSION_STRING VERSION_LESS 3)
find_package(Boost REQUIRED python)
else()
find_package(Boost REQUIRED python3)
endif()
else()
find_package(Boost REQUIRED)
endif()
修改为:
if(NOT ANDROID)
find_package(PythonLibs)
# if(PYTHONLIBS_VERSION_STRING VERSION_LESS 3)
find_package(Boost REQUIRED python)
# else()
# find_package(Boost REQUIRED python3)
# endif()
else()
find_package(Boost REQUIRED)
endif()
二、修改VINS-Mnon中使用cv_bridge的CMakeLists.txt
在ar_demo,feature_tracker,pose_graph,vins_estimator这四个包的CMakeLists.txt find_package()语句前加上下面的语句
set(cv_bridge_DIR "/home/hnu/cv_bridge_ws/devel/share/cv_bridge/cmake")
三、重新编译VINS-Mono
参考的解决方案:
ubuntu20.04下opencv版本不兼容问题 - 知乎
cv_bridge for melodic - 知乎
参考链接
发表评论