Xavier中orb Slam的研究

Xavier中orb_slam

安装ORB_SLAM3

ORB-SLAM3是西班牙萨拉戈萨大学于2020年7月中旬开源的作品,与ORB-SLAM、ORB-SLAM2一脉相承,是一个能够使用单目、立体、RGB-D相机,兼容针孔及鱼眼相机模型进行视觉、视觉+惯导和多地图的综合性SLAM方案。

ORB3的主要创新:

  1. 实现了基于视觉与IMU的紧耦合SLAM系统,该系统完全依赖最大似然估计(即便在初始化阶段也是如此)。该方案无论在小型或者大型室内室外环境中都能够稳定的运行,并且比以前的方法精确了2-5倍。
  2. 多地图系统。依赖于一种新的位置识别和改进的回环检测,能够保证ORB3能够长时间在特征缺失环境下有效运行,当它跟丢时会重新启动一个新的地图,当检测到回环之后系统能够无缝拼接多个地图。
  3. 第一个能在算法阶段重用所有历史信息的系统,包含了共视帧之间的捆集调整(BA),即使共视帧在时间上相差甚远,甚至来自不同的地图。 实验表明,在所有的传感器配置中,ORB3与文献中最好的系统一样鲁棒,且更准确。双目惯性SLAM在EuRoC数据集上的平均精度为3.6厘米,在TUM-VI数据集(AR/VR场景的一个典型场景)中,快速手持式移动时的平均精度为9毫米。

下载源码: git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git

使用C++11编译器

安装Pangolin

git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build
cd build
cmake ..
cmake --build .

ORB3编译运行

cd ORB_SLAM3/
chmod +x ./build.sh
./build.sh

测试ORB3的相机和IMU的效果 下载数据集 https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets 在ORB3的根目录下打开终端,运行

  1. 单目相机+IMU ./Examples/Monocular-Inertial/mono_inertial_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/EuRoC.yaml /home/yikang/Downloads/MH_05 ./Examples/Monocular-Inertial/EuRoC_TimeStamps/MH05.txt

  2. 仅单目相机 ./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml /home/yikang/Downloads/MH_05 ./Examples/Monocular/EuRoC_TimeStamps/MH05.txt

kitti2bag 的使用

kitti2bag是把kitti的数据转换成rosbag的工具

地址如下: https://github.com/tomas789/kitti2bag

安装kitti2bag

pip install kitti2bag

下载kitti数据,使用raw data的数据 data_drive_tracklets.zip是涉及标注信息

运行kitti2bag

2011_09_26是解压后的文件夹名称,0096是第几次drive的idx,raw_synced是几个指令中的一个.是指加载的文件是raw_data的意思 kitti2bag -t 2011_09_26 -r 0096 raw_synced

  • 可以利用rosbag来测试结果 rosbag info xxx

  • 运行ros,并rviz可视化

roscore
rviz
rosbag play -l kitti_2011_09_26_drive_0096_synced.bag

在rviz的Fixed Frame中选择base_link; 在add->By topic,选择下图中的PointCloud2添加雷达图像,再添加Image

修改Topic

将PointCloud2的Topic修改为"kitti/velo/pointcloud" 将Image的Topic修改为"/kitti/camera_color_left/image_raw"

返回终端播放

终端里空格键可以用来暂停和播放 返回rviz可以观察到点云和图像

Q1

当时遇到了一个问题,执行kitti2bag命令时,显示command not found

然后在kitti2bagissue20上找到了答案:

pip uninstall kitti2bag

sudo pip install kitti2bag

问题解决!

ORB-SLAM2_ROS编译安装及跑kitti数据集

###Q2 问题困扰了很久

  • 主要是没有理解ORB-SLAM2-ROS是在ORB-SLAM2上编译完成的 对CMakeList修改的路径不明晰.导致修改中产生错误 或顺序不对 无法产生依赖包 编译不下去
  • g2o和DBow2两个依赖库不用提前安装 ORB-SLAM2中带有相应的安装文件 会随着编译安装完成.

安装过程

  1. 下载KITTI-grayscale数据集

  2. 编译安装ROS版本的ORB-SLAM2

  • 使用ROS创建workspace
mkdir -p ~/catkin_orb_slam2_ws/src
cd ~/catkin_orb_slam2_ws/
catkin_make
mkdir ORB_SLAM2
  • 下载ORB-SLAM2: git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
  1. 安装编译:
cd ORB_SLAM2
chmod +x build.sh
vim build.sh

Q1

编译构建的过程中出现error:usleep()函数未定义的错误 需要在system.h中增加#include<stdlib.h>的头文件

Q2

CMakeFiles/ORB_SLAM2.dir/build.make:134: recipe for target 'CMakeFiles/ORB_SLAM2.dir/src/LoopClosing.cc.o' failed
make[2]: *** [CMakeFiles/ORB_SLAM2.dir/src/LoopClosing.cc.o] Error 1

打开LoopClosing.h,将:

typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
        Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;

#更改为:
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
        Eigen::aligned_allocator<std::pair<KeyFrame *const, g2o::Sim3> > > KeyFrameAndPose;

重新编译即可通过.

这将在lib文件夹中创建libORB_SLAM2.so,并在Examples文件夹中创建可执行文件mono_tum,mono_kitti,rgbd_tum,stereo_kitti,mono_euroc和stereo_euroc。 这个很重要

  1. 然后利用build_ros.sh安装ros

Q3

rosbuild] rospack found package "ORB_SLAM" at "", but the current
directory is "/home/josh/Desktop/ORB_SLAM". You should double-check your
ROS_PACKAGE_PATH to ensure that packages are found in the correct
precedence order.

需要在ROS下添加ROS_PACKAGE_PATH

  • 添加环境变量
echo "source ~/catkin_orb_slam2_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
  • 运行build.sh
sudo gedit ~/.bashrc
  • 修改环境变量(user就是用户的名字,把它改成你自己的路径名字,ORB-SLAM2/Examples/ROS所在的完整路径。)
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/(user)/catkin_orb_slam2_ws/ORB_SLAM2/Examples/ROS
  • 编译安装ROS版本的ORB-SLAM2
cd ORB_SLAM2
chmod +x build_ros.sh
./build_ros.sh

Q4

在编译时出现库的错误

错误信息

error:
0%] Built target rosbuild_precompile
make[2]: *** No rule to make target '/opt/ros/kinetic/lib/libopencv_calib3d3.so.3.2.0', needed by '../Mono'. Stop.
CMakeFiles/Makefile2:718: recipe for target 'CMakeFiles/Mono.dir/all' failed
make[1]: *** [CMakeFiles/Mono.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
make[2]: *** No rule to make target '/opt/ros/kinetic/lib/libopencv_calib3d3.so.3.2.0', needed by '../RGBD'. Stop.
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/RGBD.dir/all' failed
make[1]: *** [CMakeFiles/RGBD.dir/all] Error 2
make[2]: *** No rule to make target '/opt/ros/kinetic/lib/libopencv_calib3d3.so.3.2.0', needed by '../Stereo'. Stop.
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/Stereo.dir/all' failed
make[1]: *** [CMakeFiles/Stereo.dir/all] Error 2
make[2]: *** No rule to make target '/opt/ros/kinetic/lib/libopencv_calib3d3.so.3.2.0', needed by '../MonoAR'. Stop.
CMakeFiles/Makefile2:820: recipe for target 'CMakeFiles/MonoAR.dir/all' failed
make[1]: *** [CMakeFiles/MonoAR.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

要在/Examples/ROS/ORB-SLAM2/CMakeLists.txt文件下修改 加上 -lboost_system

set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
#加上这一句
-lboost_system
)

之前理解有误 耽误了很多时间


ROS之环境变量PATH小结

  1. 新建一个工作空间后,编译后需要设置一下环境变量,不然在其他终端运行不了或者找不到相应功能包等。 vim ~/.bashrc

  2. 在里面添加一句:source ~/工作空间/devel/setup.bash

3. 这里的my_catkin是我的工作空间,相应更改你的工作空间的名字即可。这里也可以直接一句命令搞定,不用进来文件添加。 export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/my_catkin/ 4. 接下来 刷新 source ~/.bashrc 5. 之后可以利用以下命令来查看你是否设置成功。 echo $ROS_PACKAGE_PATH


环境变量处理的一些操作

查看环境变量

export

echo $PATH

暂时加入环境变量

export PATH=/lib/bin:$PATH

永久加入环境变量

针对当前用户
vim ~/.bashrc 或 vim ~/.profile
export PATH="/lib/bin:$PATH"
针对所有用户
vim /etc/profile
export PATH="/lib/bin:$PATH"

修改后可以使用命令使其立即生效 source ~/.bashrc

配置~/.bashrc后下次登录shell无效问题

vim ~/.profile
加入:
if [ -s ~/.bashrc ]; then
    source ~/.bashrc;
fi

或

source ~/.bashrc

orb-slam2_ros单目摄像头运行和kitti

安装usb_cam编译

要运行monoslam的demo要修改一下 需要修改ORB_SLAM2/src下的ros_mono.cc,将程序里面的topic改为/usb_cam/image_raw. 通过rviz工具选择image通过订阅/usb/image_raw/确认是否OK. **更改后需要重新build_ros.sh.

运行测试demo

rosrun ORB_SLAM2 Mono ~/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt  ~/catkin_ws/src/ORB_SLAM2/Examples/Monocular/TUM1.yaml 

利用kitti

./Examples/Monocular/mono_kitti Vocabulary/ORBvoc.txt Examples/Monocular/KITTI00-02.yaml ../dataset/sequences/00/
updatedupdated2020-11-032020-11-03