问题猜测及解决:opencv版本兼容性
项目版本:ORB SLAM3 V1.0版本
CPU:13600K (大小核架构不知是否会影响)
电脑环境:ubuntu18.04 ROS运行
相机:D435 i
opencv版本:3.2 and 4.6
前提:编译无报错,即通过以下指令
./build.sh
./build_ros.sh
简单来说用opencv3.2
所以项目中两个CMakeLists.txt中find_package(OpenCV 3.2 QUIET),opencv设置为3.2即可运行
注意是两个CMakeLists.txt,一个在ORB_SALM3-master下,一个在ORB_SLAM3-master/Examples_old/ROS/ORB_SLAM3
find_package(OpenCV 3.2 QUIET)
以下是踩坑过程
项目中调用opencv 4.6
即两个CMakeLists.txt中find_package(OpenCV 4.6 QUIET)
在运行以下指令,启动realsense-ros包的D435 i节点,并运行ORB slam3中的双目模式居然正常运行!!(图就不附上了)
roslaunch realsense2_camera rs_camera.launch //D435i 启动ROS节点
rosrun ORB_SLAM3 Stereo /home/nico/ORBvoc.txt /home/nico/d435i.yaml flase //后续文件地址需修改
第一个段错误 (核心已转储)
但是运行其它ORB—SLAM3其它模式全部出现 段错误 (核心已转储)
在进去查看项目代码并调试发现:
运行代码后会声明命名空间在 src/System.cc文件中,并卡在这一行终端便出现 段错误 (核心已转储)。
这一行的功能是调用opencv的函数对相机内参文件的读取。
cv::FileStorage fsSettings(strSettingsFile.c_str(), cv::FileStorage::READ);
但是问题来了 为什么同样是声明命名空间,但是只有双目模式可以正常运行而其它不可以
随后检查主函数文件即ros_stereo.cc和ros_rgbd.cc(仅对比stereo 和 rgbd)
发现大体一致,但是有以下不同
ros_stereo.cc是这样定义的
class ImageGrabber
{
public:
ImageGrabber(ORB_SLAM3::System* pSLAM):mpSLAM(pSLAM){}
void GrabStereo(const sensor_msgs::ImageConstPtr& msgLeft,const sensor_msgs::ImageConstPtr& msgRight);
ORB_SLAM3::System* mpSLAM;
bool do_rectify;
cv::Mat M1l,M2l,M1r,M2r;
};
而ros_rgbd.cc是这样定义的
class ImageGrabber
{
public:
ImageGrabber(ORB_SLAM3::System* pSLAM):mpSLAM(pSLAM){}
void GrabRGBD(const sensor_msgs::ImageConstPtr& msgRGB,const sensor_msgs::ImageConstPtr& msgD);
ORB_SLAM3::System* mpSLAM;
};
对比显然是缺少
bool do_rectify;
cv::Mat M1l,M2l,M1r,M2r;
加上后居然可以解决第一个段错误 (核心已转储)(很扯但是事实上本人运行是这样的)(实际上加上 cv::Mat M1;也是可以的)
显然是opencv 版本兼容问题
但是随后遇到第二个段错误 (核心已转储)
显示了一下画面便退出了。终端显示
Loading ORB Vocabulary. This could take a while...
Vocabulary loaded!
Initialization of Atlas from scratch
Creation of new map with id: 0
Creation of new map with last KF id: 0
Seq. Name:
Camera Parameters:
- Camera: Pinhole
- Image scale: 1
- fx: 535.4
- fy: 539.2
- cx: 320.1
- cy: 247.6
- k1: 0
- k2: 0
- p1: 0
- p2: 0
- fps: 30
- color order: RGB (ignored if grayscale)
ORB Extractor Parameters:
- Number of Features: 1000
- Scale Levels: 8
- Scale Factor: 1.2
- Initial Fast Threshold: 20
- Minimum Fast Threshold: 7
There are 1 cameras in the atlas
Camera 0 is pinhole
Starting the Viewer
段错误 (核心已转储)
同样思考问题 为什么只有双目模式可以正常运行而其它不可以
随后参考建议opencv版本是3.2
所以项目中两个CMakeLists.txt中find_package(OpenCV 3.2 QUIET),opencv设置为3.2即可运行
注意是两个CMakeLists.txt,一个在ORB_SALM3-master下,一个在ORB_SLAM3-master/Examples_old/ROS/ORB_SLAM3
find_package(OpenCV 3.2 QUIET)
运行以下命令
roslaunch realsense2_camera rs_camera.launch
rosrun ORB_SLAM3 RGBD /home/nico/ORBvoc.txt /home/nico/d435i.yaml
运行正常
上图
文章出处登录后可见!