目录
一、简介
特点
• 首个支持单目,双目和RGB-D相机的完整的开源SLAM方案,能够实现地图重用,回环检测和重新定位的功能。
• 能够在CPU上进行实时工作,比如手机、无人机、汽车。
• 特征点法的巅峰之作,定位精度极高。
• 能够实时计算出相机的位姿,并生成场景的稀疏三维重建地图。
• 代码非常整洁,包含很多实际应用中的技巧,非常实用。
• 支持仅定位模式,该模式适用于轻量级以及在地图已知情况下长期运行,此时不使用局部建图和回环检测的线程
• 双目和RGB-D相对单目相机的主要优势在于,可以直接获得深度信息,不需要像单目情况中那样做一个特定的SFM初始化。
原理
二、目标
- 为Xavier配置好ORB_SLAM2
- 跑通数据集
- 实现本地usb_cam实时运行
- 调用本地视频
三、安装配置
设备
硬件设备配置:
- Jetson Xavier 一台
- 海康威视USB摄像头 一台
软件
- Ubuntu18.04
- ROS Melodic
配置步骤
1.Jetson AGX Xavier部署ROS
通过ROSXavier脚本安装
git clone https://github.com/jetsonhacks/installROSXavier.git
cd installROSXavier
./installROSXavier #好像这句没意义,不清楚
#默认安装base版本,通过下面这条语句可设置安装版本,本人安装桌面完整版
./installROS.sh -p ros-melodic-desktop-full
安静地等待n分钟…
创建ROS工作空间
#[optionalWorkspaceName]是自己设置的文件夹名,
运行完成后会生成该文件夹,如果省略,默认的文件
夹名是catkin_ws
特别注意,会在home下创建!!!
./setupCatkinWorkspace.sh [optionalWorkspaceName]
建议在Jetson AGX Xavier挂载的SD卡里创建,如我的/media/nvidia/samsung-SD2/catkin_ws_lwl
#进入SD卡,右键‘Open in Terminal’
mkdir -p catkin_ws_lwl/src
cd catkin_ws_lwl/src
catkin_init_workspace
cd ..
catkin_make
source ~/catkin-ws/devel/setup.bash
安装一些依赖包
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
初始化rosdep
sudo rosdep init
如果出现sudo rosdep:找不到命令提示,需要执行如下命令:
sudo apt install python-rosdep
再次执行初始化sudo rosdep init,如果出现错误:
ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.
这是因为该网址被墙,无法访问。解决办法是让该网址可以访问。该网址被墙的原因是dns污染,将下面的内容添加到/etc/hosts中。
192.30.253.118 gist.github.com
185.199.110.153 github.io
151.101.113.194 github.global.ssl.fastly.net
52.216.227.168 github-cloud.s3.amazonaws.com
52.74.223.119 github.com
199.232.28.133 avatars1.githubusercontent.com
199.232.28.133 avatars2.githubusercontent.com
199.232.28.133 avatars0.githubusercontent.com
199.232.28.133 avatars3.githubusercontent.com
199.232.28.133 raw.githubusercontent.com
199.232.28.133 user-images.githubusercontent.com
199.232.28.133 avatars.githubusercontent.com
199.232.28.133 github.map.fastly.net
199.232.28.133 avatars7.githubusercontent.com
# Amazon AWS Start
54.239.31.69 aws.amazon.com
54.239.30.25 console.aws.amazon.com
54.239.96.90 ap-northeast-1.console.aws.amazon.com
54.240.226.81 ap-southeast-1.console.aws.amazon.com
54.240.193.125 ap-southeast-2.console.aws.amazon.com
54.239.54.102 eu-central-1.console.aws.amazon.com
177.72.244.194 sa-east-1.console.aws.amazon.com
176.32.114.59 eu-west-1.console.aws.amazon.com
54.239.31.128 us-west-1.console.aws.amazon.com
54.240.254.230 us-west-2.console.aws.amazon.com
54.239.38.102 s3-console-us-standard.console.aws.amazon.com
54.231.49.3 s3.amazonaws.com
52.219.0.4 s3-ap-northeast-1.amazonaws.com
54.231.242.170 s3-ap-southeast-1.amazonaws.com
54.231.251.21 s3-ap-southeast-2.amazonaws.com
54.231.193.37 s3-eu-central-1.amazonaws.com
52.218.16.140 s3-eu-west-1.amazonaws.com
52.92.72.2 s3-sa-east-1.amazonaws.com
54.231.236.6 s3-us-west-1.amazonaws.com
54.231.168.160 s3-us-west-2.amazonaws.com
52.216.80.48 github-cloud.s3.amazonaws.com
54.231.40.3 github-com.s3.amazonaws.com
52.216.20.171 github-production-release-asset-2e65be.s3.amazonaws.com
52.216.228.168 github-production-user-asset-6210df.s3.amazonaws.com
再次执行初始化命令,可能会失败,多试几次。
执行rosdep update更新
rosdep update
添加ros环境变量
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
运行小乌龟,检验是否成功
第一个终端运行如下命令:
roscore
新建一个终端运行如下命令:
rosrun turtlesim turtlesim_node
再建一个终端运行如下命令:
rosrun turtlesim turtle_teleop_key
按方向键,看是否乌龟会动
歇一歇,好好玩儿一会儿吧,哈哈
2.更新apt库
sudo apt-get update
3.安装依赖
sudo apt install gcc g++
sudo apt install build-essential cmake git pkg-config libgtk-3-dev libcanberra-gtk*
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev
sudo apt install libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev opencl-headers
sudo apt install python3-dev python3-numpy libtbb2 libtbb-dev libdc1394-22-dev
4.安装Pangolin
#安装依赖
sudo apt-get install libglew-dev libboost-dev libboost-thread-dev libboost-filesystem-dev libpython2.7-dev
#下载Pangolin
git clone https://github.com/stevenlovegrove/Pangolin.git
#编译安装
cd Pangolin
mkdir build
cd build
cmake ..
make –j #根据自己设备,调整‘-j’为‘-j4’等,以防卡死,后边同理
sudo make install
5.安装Eigen3
sudo apt-get install libeigen3-dev
6.查看Opencv版本,看是否需要安装
pkg-config opencv --modversion
如果显示4.x.x,建议卸载,更换成3.4.x(我是这样实现的,其他版本应该也可以,但没有尝试)
卸载现有Opencv
sudo apt-get purge libopencv*
sudo apt autoremove
sudo apt-get update
下载安装Opencv3.4.1
安装依赖
sudo apt install gcc g++
sudo apt install build-essential cmake git pkg-config libgtk-3-dev libcanberra-gtk*
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev
sudo apt install libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev opencl-headers
sudo apt install python3-dev python3-numpy libtbb2 libtbb-dev libdc1394-22-dev
安装Opencv
1.通过脚本安装
git clone https://github.com/jetsonhacks/buildOpenCVXavier.git
cd buildOpenCVXavier
#修改脚本,安装自己所需版本
git checkout v1.0
./buildOpenCV.sh
2.下载安装包安装
- 安装依赖项
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
- 下载安装包
我的网络太慢,官网下载到一半总会断,推荐百度‘Opencv国内镜像’资源下载。
进入安装包
cd opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4
sudo make install
时间非常漫长,请耐心等待(我用了一个多小时)
- 配置环境
sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
sudo vim /etc/bash.bashrc
在打开的文件最后添加下面两句话:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
执行:
source /etc/bash.bashrc
#####安装DBoW2和g2o
无需安装DBoW2和g2o,ORB_SLAM2包里的Thirdparty文件夹就包含了。
四、编译安装ORB-SLAM2
无ROS单目
-
下载
再次,我的网速感人,借用‘码云’个人仓库进行下载,速度很快。 -
编译
将下载好的包放在之前创建好的ROS工作空间文件夹里,如我的catkin_ws_lwl/src/里。
$ cd ORB_SLAM2
$ chmod +x build.sh #此命令是为了给build.sh执行权限,对应有chmod -x命令
$ ./build.sh
如果不出意外,编译会出错,哈哈
恭喜,你的Debug时间到
会报错:‘usleep’,不慌,只需要在报错文件里面添加一个头文件:
#include <unistd.h>
需要增加unistd.h的文件还有:
Examples/Monocular/mono_euroc.cc
Examples/Monocular/mono_kitti.cc
Examples/Monocular/mono_tum.cc
Examples/RGB-D/rgbd_tum.cc
Examples/Stereo/stereo_euroc.cc
Examples/Stereo/stereo_kitti.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/System.cc
src/Tracking.cc
src/Viewer.cc
后续可能还会有哦,期待哈哈
其他的问题请自行百度吧,写下去篇幅不可控啦
没事儿就单纯加一个框,假设你不报错了,恭喜,你已经成功一半了!!!
- 下载数据集
#单目:
(1)TUM数据集:http://vision.in.tum.de/data/datasets/rgbd-dataset/download
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER
(2)KITTI数据集:http://www.cvlibs.net/datasets/kitti/eval_odometry.php
./Examples/Monocular/mono_kitti Vocabulary/ORBvoc.txt Examples/Monocular/KITTIX.yaml PATH_TO_DATASET_FOLDER/dataset/sequences/SEQUENCE_NUMBER
(3)EuRoc数据集:http://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
./Examples/Monocular/mono_euroc Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml PATH_TO_SEQUENCE_FOLDER/mav0/cam0/data Examples/Monocular/EuRoC_TimeStamps/SEQUENCE.txt
#双目:
(1)KITTI数据集:http://www.cvlibs.net/datasets/kitti/eval_odometry.php
./Examples/Stereo/stereo_kitti Vocabulary/ORBvoc.txt Examples/Stereo/KITTIX.yaml PATH_TO_DATASET_FOLDER/dataset/sequences/SEQUENCE_NUMBER
(2)EuRoc数据集:http://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml PATH_TO_SEQUENCE/mav0/cam0/data PATH_TO_SEQUENCE/mav0/cam1/data Examples/Stereo/EuRoC_TimeStamps/SEQUENCE.txt
#RGBD深度
TUM数据集:http://vision.in.tum.de/data/datasets/rgbd-dataset/download
#需要使用associate.py文件关联RGB图像和深度图像,associate.py链接:http://vision.in.tum.de/data/datasets/rgbd-dataset/tools
python associate.py PATH_TO_SEQUENCE/rgb.txt PATH_TO_SEQUENCE/depth.txt > associations.txt
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUMX.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE
注:具体./Examples/…中的PATH_TO_SEQUENCE_FOLDER是你自己的数据集下载后的位置,如我的:/media/nvidia/samsung-SD2/rgbd_dataset_freiburg1_xyz
ROS本地摄像头
- 下载安装usb_cam包
最好将它放在ROS空间的src文件夹下,方便管理
git clone https://github.com/bosch-ros-pkg/usb_cam.git usb_cam
cd usb_cam
mkdir build
cd build
cmake ..
make
- 测试USB摄像头
新建一个终端
roscore
进入/media/nvidia/samsung-SD2/catkin_ws_lwl/src/usb_cam/文件夹,开启新的终端
cd launch
roslaunch usb_cam usb_cam-test.launch
usb_cam-test.launch文件里默认是这样的,根据自己的情况改变设备号。
- 添加环境变量
将包含Examples/ROS/ORB_SLAM2的路径添加到ROS_PACKAGE_PATH环境变量中。打开.bashrc文件并在最后添加以下行:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM2/Examples/ROS
其中PATH为你的ORB_SLAM2路径,如我添加的是:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/media/nvidia/samsung-SD2/catkin_ws_lwl/src/ORB_SLAM2/Examples/ROS
同时也要写入:
source /media/nvidia/samsung-SD2/catkin_ws_lwl/devel/setup.sh
最终在终端里执行:
source ~/.bashrc
- 编译ROS下面的ORB_SLAM2
ORB-SLAM默认订阅的话题为/camera/image_raw,而usb_cam节点发布的话题为/usb_cam/image_raw,因此需要在ros_mono.cc中修改订阅的话题。
更改后进入/media/nvidia/samsung-SD2/catkin_ws_lwl/src/ORB_SLAM2文件夹,打开终端进行编译:
$ chmod +x build_ros.sh
$ ./build_ros.sh
可能还会报错,例如:
/media/nvidia/samsung-SD2/catkin_ws_lwl/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/…/…/…/Thirdparty/g2o/g2o/types/…/core/openmp_mutex.h:30:10: fatal error: …/…/config.h: No such file or directory
#include “…/…/config.h”
解决办法:
尝试将Thirdparty文件夹或Thirdparty / g2o文件夹添加到CMakeLists.txt中的包含目录列表中。https://github.com/raulmur/ORB_SLAM2/issues/399
如果你成功的走到了现在,那么恭喜你,接近成功啦!
- 运行单目节点
打开一个终端
roscore
打开一个新的终端
roslaunch usb_cam usb_cam-test.launch
再打开一个新的终端
rosrun ORB_SLAM2 Mono PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE
其中PATH_TO_VOCABULARY和PATH_TO_SETTINGS_FILE根据自己的情况调整,如我的PATH_TO_VOCABULARY为/media/nvidia/samsung-SD2/catkin_ws_lwl/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/ORBvoc.txt,PATH_TO_SETTINGS_FILE为/media/nvidia/samsung-SD2/catkin_ws_lwl/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/myvideo.yaml,其中myvideo.yaml为我的相机标定结果。如果简单想跑起来,直接调用文件夹里的Asus.yaml就可以。
rosrun ORB_SLAM2 Mono /media/nvidia/samsung-SD2/catkin_ws_lwl/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/ORBvoc.txt /media/nvidia/samsung-SD2/catkin_ws_lwl/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/myvideo.yaml
注意:当ORB SLAM2初始化的时候,请不要直接开始旋转或者运动速度过猛烈,先左右平移运动让SLAM系统成功初始化然后进行的。
来看看结果吧!
五、结果
图中左侧窗口中的绿色小方块为提取的图像ORB特征,右侧窗口中的绿线代表相机的运动轨迹,蓝色方框代表相机运动过程中的空间位置(即关键帧),黑点和红点代表环境的稀疏地图(黑色代表历史路标,红色表示当前路标)。
参考文献:
- https://blog.csdn.net/learning_tortosie/article/details/79881165
- https://blog.csdn.net/radiantjeral/article/details/82193370
- https://blog.csdn.net/wyy13273181006/article/details/108789594
- https://blog.csdn.net/chengmo123/article/details/104902199
- https://blog.csdn.net/radiantjeral/article/details/82193370
- https://blog.csdn.net/ykwjt/article/details/88090748
- https://blog.csdn.net/caomicm/article/details/83994962
- https://blog.csdn.net/learning_tortosie/article/details/79879575
- https://blog.csdn.net/weixin_44436677/article/details/105587986
- 10.https://www.cnblogs.com/gloria-zhang/p/13825287.html