今天的工作需要自己录制的数据集来验证昨天的标定结果
用ORBSLAM3单目imu模式运行,mentor给的是一个rosbag格式的数据包,配置过程出了几个问题记录一下,沿配置流程写。
一.orbslam3编译安装
1.首先是安装各种依赖
这里不再赘述,网上参考博客非常多
2.下载orbslam3:
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git
3.编译:
修改下cmakelists.txt,因为是ubuntu18.04,ros为melodic,对应的opencv版本为3.2,所以将cmakelist.txt中设置为3.2,而且ros/orbslam3中的还有dbow中的都要一同设置
cd ORB_SLAM3
chmod +x build.sh
./build.sh
正常编译,哪里有问题改哪里,这个网上资料都很多
最终顺利结束
二.然后是ros接口的orbslam3
首先把anaconda环境退了
conda deactivate
然后修改build_ros.sh,将最下面make -j改成make -j12(自己选,对应自己电脑cpu性能就好),防止卡死。
然后执行
./build_ros.sh
这里会出一些问题了。
首先是因为没添加到环境变量中而导致找不到,这里添加就好:(这里是笔者自己的路径)
sudo gedit ~/.bashrc
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/shikai/cyber/ORB_SLAM3-master/Examples_old/ROS/ORB_SLAM3
source ~/.bashrc
然后编译:
cd Examples_old/ROS/ORB_SLAM3
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make -j4
最开始会报找不到sophus库头文件的错:fatal error: sophus/se3.hpp: 没有那个文件或目录
#include <sophus/se3.hpp>
这个去第三方库那个文件夹中,将sophus sudo make install就可以了
然后会报和ar相关的错,这里ar没什么用,直接在ros/orbslam3中的cmakelist.txt中将相关的删掉即可,然后重新执行编译,这次执行通过
注意,在这里有坑,笔者之前的电脑是opencv多版本共存的,也就是笔者安装了opencv3.4.5,此时可以看到:
/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
[ 80%] Built target Mono_Inertial
/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
虽然编译也通过,但是你会发现执行普通版的orbslam3是没问题的,但是执行ros接口的会报错:
ORB Extractor Parameters:
- Number of Features: 1000
- Scale Levels: 8
- Scale Factor: 1.2
- Initial Fast Threshold: 20
- Minimum Fast Threshold: 7
double free or corruption (out)
这个就很烦,是因为cv_bridge对opencv指向问题,cv_bridge默认指向ros安装自带的opencv3.2.0,就会与自己安装的opencv产生冲突。
笔者参考了好多帖子:
ROS1 Ubuntu系统运行ORB_SLAM3报段错误(核心已转储)
ORB SLAM3 ubuntu18.04 ROS 运行 段错误 (核心已转储) 踩坑及解决
等等,都很复杂不好操作,且感觉不一定好用,所以笔者这里采用暴力删除方法,直接将其他版本的opencv都卸载,并调整项目中的cmakelist.txt,将其都设置为find opencv 3.2,这样编译后
三.运行
然后就是跑rosbag,这里使用自己的rosbag,开启三个终端,第一个执行
roscore
然后开启orbslam3 单目+imu的ros节点:
rosrun ORB_SLAM3 Mono_Inertial /home/shikai/cyber/ORB_SLAM3-master/Vocabulary/ORBvoc.txt /home/shikai/cyber/ORB_SLAM3-master/Examples_old/ROS/zjbd_T265.yaml
这里使用的是自己标定的参数构成的yaml文件,读取对格式要求较为严格,如遇到这个问题:
terminate called after throwing an instance of 'cv::Exception' what(): OpenCV(3.4.5) /home/shikai/3rd/opencv-3.4.5/modules/core/src/persistence_c.cpp:1426: error: (-2:Unspecified error) The node does not represent a user object (unknown type?) in function 'cvRead',那就是yaml文件内部哪个地方格式有问题,自己找吧,调整好之后,可以看到节点被打开:
然后在第三个终端上执行:
rosbag play -r 0.5 --pause '/home/shikai/cyber/ORB_SLAM3-master/Examples_old/ROS/2024-11-04-17-01-19.bag' 后面对应自己的话题,一定要和节点要求的对应
(正常就可以看到轨迹和图像了,但笔者这里还有问题)
在这个后面加上自己的话题,这里不知道orbslam3 单目imu要什么话题可以输入这个命令查看:
rosnode info / Mono_Inertial
可以看到是这个话题:camera/image_raw,查看我自己rosbag,我们把image弄成压缩的了,但是orbslam3又识别不到,所以需要解压缩,这里使用image_transport这个工具,
rospack list | grep image_transport
查看一下自己是否有:
发现是有的,于是启动另一个节点:
rosrun image_transport replish compressed in:=/camera_chest/fisheye1/image_raw raw out:=/camera/image_raw
其中:/camera_chest/fisheye1/image_raw这是自己rosbag中压缩的图像话题,而 /camera/image_raw对应orbslam3 单目imu节点需要的话题,此时再次播放rosbag:
rosbag play -r 0.5 --pause '/home/shikai/cyber/ORB_SLAM3-master/Examples_old/ROS/2024-11-04-17-01-19.bag' /camera_chest/imu:=/imu --clock
按下空格键开始播放,可以看到有轨迹啦:(因数据涉密,只显示部分照片)
到这里就结束了,尽可能详细了,如小伙伴再有什么疑问,可以评论我