0、前置准备工作
首先需要有以下几个库,opencv4.2.0、pangolin0.5、eigen3、CMake等等,查询电脑上是否已安装的命令可以参考以下链接:
Linux系统下查看各种库版本的命令、解压缩的命令等_linux 查看库版本-CSDN博客
还需要检查一下是否有g2o库,没有的话需要自行安装编译一下。我的电脑上有高博的视觉slam14讲,里面自带了g2o的库,之前编译过,因此不受影响。
得到g2o的源码后,进入文件夹下
cd g2o_ws
mkdir build
cd build
cmake ..
make -j6
sudo make install
1、 ORB-SLAM3编译
1.1 普通编译准备:
通过以下命令git源代码到自己创建的文件夹下:
mkdir -p orb_ws
cd orb_ws
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git
这里,需要修改一下CMakeLists文件,
/home/jetson/orb_ws/ORB_SLAM3/CMakeLists.txt
因为我使用的是opencv4.2.0,并且自己选择了安装的地址,因此需要在该文件下添加set语句给定opencv4.2.0安装的地址,并将find_package改称4.2.0 REQUIRED
set(OpenCV_DIR "/usr/local/opencv420/lib/cmake/opencv4")
find_package(OpenCV 4.2.0 REQUIRED)
然后在orb_ws下进行编译:
cd ORB_SLAM3
chmod +x build.sh
./build.sh
编译完成后:
1.2 ROS环境准备:
在1.1完成之后,同样在orb_ws下进行如下操作:
cd ORB_SLAM3
chmod +x build_ros.sh
./build_ros.sh
编译完成后:
2、ORB-SLAM3运行数据集
目前我的ros版本无法运行,普通版本是可以运行的。猜测ros版本无法运行是因为Example中没有ROS功能包,即使是讲Example_old中的ROS功能包复制过来重新用ROS编译也不行。
我这边选择从可知性文件的角度出发运行ORBSLAM3,首先代码如下:
2.1 Euroc数据集
以Euroc数据集为例,双目惯性:
./Examples/Stereo-Inertial/stereo_inertial_euroc 词库文件.txt 配置文件.yaml 数据集序列 数据集对应时间戳.txt
./Examples/Stereo-Inertial/stereo_inertial_euroc ./Vocabulary/ORBvoc.txt /home/jetson/ORB_SLAM3/Examples/Stereo-Inertial/EuRoC.yaml /home/jetson/MH_01_easy/ ./Examples/Stereo-Inertial/EuRoC_TimeStamps/MH01.txt
注意这里,第四个参数是数据集路径,我们需要从Euroc官网上下载对应的数据集的ASL格式,然后解压缩。我这里解压缩后对应的数据集路径为/home/jetson/。
如果运行成功但是没有显示画面,则需要修改对应文件下的内容:
这里我们用的是双目+imu。
有的情况比如纯单目,需要修改对应文件。比如纯单目中需要将ORB_SLAM3/Examples/Monocular/mono_euroc.cc中的83行左右的,如下代码中的false改成true:
ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR, **false**);
之后编译ORBSLAM3,运行./build.sh
这里只以纯单目为例,如果想要运行Mono+IMU或者Stereo+IMU,也需要修改对应.cc文件中的false改成true。
就可以看到运行成功的画面了。
2.2 TUM数据集
这里以双目IMU为例,需要写入命令的参数很多:
前面的命令与euroc差不多,这里需要注意,需要将读入图片序列精确到对应的文件路径下:
./Examples/Stereo-Inertial/stereo_inertial_euroc 词库文件.txt 配置文件.yaml 数据集序列 数据集对应时间戳.txt 数据集序列数据集对应IMU时间戳.txt 轨迹存储路径(自定义)
./Examples/Stereo-Inertial/stereo_inertial_tum_vi ./Vocabulary/ORBvoc.txt /home/jetson/ORB_SLAM3/Examples/Stereo-Inertial/TUM-VI.yaml /home/jetson/vins_ws/data/tum/dataset-room1_512_16/mav0/cam0/data /home/jetson/vins_ws/data/tum/dataset-room1_512_16/mav0/cam1/data ./Examples/Stereo-Inertial/TUM_TimeStamps/dataset-room1_512.txt ./Examples/Stereo-Inertial/TUM_IMU/dataset-room1_512.txt /home/jetson/11
运行效果如下:
2.3 D455相机
由于我的板子无法编译通过ros版本的orbslam3,因此我这里选择非ros版本的运行方式。
参考官方readme.txt,可以看到运行命令如下(以d435i相机,单目imu为例):
d435i与d455相机应该只差相机参数的问题,因此这里暂时使用d435i的yaml运行。
./Examples/Monocular-Inertial/mono_inertial_realsense_D435i Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/RealSense_D435i.yaml
直接运行会出现第一个报错,报错内容如下:
这是因为相机设备不支持,代码中的 AUTO_EXPOSURE
相关选项导致的。
因此,需要在stereo_inertial_realsense_D435i.cc文件中修改如下:
注释掉含有AUTO_EXPOSURE的这两行,再次编译运行(记得先保存):
chmod +x ./build.sh
./build.sh
./Examples/Monocular-Inertial/mono_inertial_realsense_D435i Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/RealSense_D435i.yaml
运行效果如下:
这里暂时效果不是很好,虽然可以运行,因此推测是yaml文件中参数的问题。我先复制了原文件夹中d435i.yaml文件,并命名为d455.yaml
并根据自己标定的相机结果修改其中的内参数。
暂时还未能解决运行过程中只有十个关键帧左右就重新规划轨迹的情况。