前言
开始前先说一下大致的整个过程,各位dalao对应自己需要的部分去看就可以,也为我自己做一个记录。
-
我因为是之前在这个系统上跑过ORB-SLAM2,所以没有安装Pangolin、Eigen等库的过程,如有需要可以拜读其他dalao的文章
-
在NX上常规编译无法通过,经高人指点,我按照最普通的三部曲进行编译
-
经过漫长的编译后,非ROS下可以运行,ROS下直接报错:段错误(核心已转储)[图片太大、放不上来]。
-
删库重装,再进行一次。这次无论是否在ROS下都无法运行
-
开始找原因。这个error的本质原因:内存、源码、硬件,
常规处理方法:输出core文件,gdb调试慢慢一行行查。说实话,肯定不是配置问题,有人已经跑成功了,而且这么大的工程,我并不想去慢慢gdb查。 -
开始摸索,查找错误信息后:
① 有dalao指出:将所有CMakeLists文件中的-march=native
全删掉,然后重新编译。亲测,没用。
② github dalao指出:OpenCV版本的问题,换成3.2.0。我没试,因为动了原来的OpenCV版本,肯定会影响一些原来配置好的文件的。换了也不是百分百管用。
③ 又dalao指出:放两天就好了,玄学操作。亲测,没用(别问我为什么会试)。
最后搁置了几天,毕竟不想换OpenCV和gdb调试。
几天后,有交流学习的dalao亲测换了OpenCV版本确实不会出现段错误了,我去翻阅了作者github上的readme,发现作者确实只在OpenCV3.2和4.4上测试过,有可能真的是版本差异问题导致的。
于是,换OpenCV4.4.0,成功运行了。建议:① 装较高版本,高版本功能会更全,一劳永逸;② 原来的不要删,直接考虑多版本共存,理由见上。
ok,开始记录一下整个过程。
一、下载ORB-SLAM3库
-
直接下载压缩包,直接git clone可能有些文件会不一样。
github:https://github.com/UZ-SLAMLab/ORB_SLAM3 -
解压到/home目录下的一个文件夹中,我放在了
ORBSLAM3
里。
二、非ROS下编译
常规的方法是:修改作者编写好的脚本文件,然后运行即可。
但我这么做,直接卡死,可能最好还是得优化一下整个工程才适合放进ARM中。
1. 编译第三方库Thirdparty:
分别进入DBoW2词袋库和g2o优化库进行如下操作。
mkdir build
cd bulid
cmake ..
make -j4 # 按照自己的实际情况安排核数
2. 成功后,返回根目录(我的是ORBSLAM3
)下,重复上述操作进行编译
mkdir build
cd bulid
cmake ..
make -j4 # 按照自己的实际情况安排核数
此时就可以在非ROS环境下运行例程了(可以打开根目录下的XXX_examples.sh
文件查看例程运行的源码格式)
注:注意留意一下Vocabulary中的ORB字典是否已经解压。
3. 运行demo测试
我们测试一下EuRoC MH01数据集下的单目VIO模块:
回到根目录ORBSLAM3
下,打开终端:
命令格式如下:
模式 词库路径 该模式下的配置文件 数据库路径 数据库的时间戳与数据名
我的运行命令如下:
./Examples/Monocular-Inertial/monocular-inertial_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/EuRoC.yaml ~/Dataset/MH_01_easy ./Examples/Monocular-Inertial/EuRoC_TimeStamps/MH01.txt dataset-MH01_monoi
三、ROS环境下编译
1. 将ros工作空间路径加入.bashrc
文件中
我的是
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/nvidia/ORBSLAM3/Examples/ROS
source一下:source ~/.bashrc
2. 开始编译安装
当然,ros编译安装的脚本也是会卡崩。故
从根目录进入Examples-ROS-ORB_SLAM3中
mkdir build
cd bulid
cmake ..
make -j4 # 按照自己的实际情况安排核数
我在安装过程中出现了error:make: *** 没有指明目标并且找不到 makefile。 停止。
[rosbuild] Error from directory check:
/opt/ros/melodic/share/ros/core/rosbuild/bin/check_same_directories.py
/opt/ros/melodic/share/ORB_SLAM3 /home/nvidia/ORBSLAM3/Examples/ROS/ORB_SLAM3
一大段错误,其实应该是跟系统编译了多个ORB-SLAM3工程的原因,我之前重新安装完OpenCV后,直接把原来ORB-SLAM3工程全删了,原工程已经在/opt/ros/melodic/share
下建立了一个软连接,现在需要将这个同名软连接取消掉,再重新建立一个(你也可以换个名咯):
① 先到/opt/ros/melodic/share
目录下,删除原来的ORB_SLAM3软连接
sudo rm -r ORB_SLAM3
② 对当前工程在/opt/ros/melodic/share
目录下建立软连接
sudo ln -s /home/nvidia/ORBSLAM3/Examples/ROS/ORB_SLAM3 /opt/ros/melodic/share/ORB_SLAM3
最后重新编译一下。
3. 测试运行:
#第一个终端
roscore
#第二个终端
rosrun ORB_SLAM3 Mono_Inertial /home/nvidia/ORBSLAM3/Vocabulary/ORBvoc.txt /home/nvidia/ORBSLAM3/Examples/Monocular-Inertial/EuRoC.yaml true
#第三个终端
rosbag play /home/nvidia/Dataset/MH_01_easy.bag /cam0/image_raw:=/camera/left/image_raw /imu0:=/imu
第三个终端中输入的话题中,模式与包要相一致。
2022.01.24更新:
关于v1.0版本,用Opencv4.0+编译错误的解决方法
https://github.com/UZ-SLAMLab/ORB_SLAM3/issues/442
总结
其实就是OpenCV读矩阵函数因为版本不同导致运行不了,这篇单纯就是个记录吧。
如果碰到这个问题不想再装OpenCV可以尝试将OpenCV输出的格式换成你自己想要/算法要的那个格式,再导进去。
共勉。
Reference:
- https://blog.csdn.net/crp997576280/article/details/115690725
- https://blog.csdn.net/weixin_44401286/article/details/102752767
- 计算机视觉life