我在研0阶段接到的实验室的第一个项目,是和本校的另外一个实验室的合作项目,分给我的第一阶段的任务是对一个简单的室内环境进行三维重建。经过一些自己的调研和向一位远在日本从事SLAM研究的老师的请教,最后决定用V-SLAM的方法来实现第一阶段的任务。经过一段时间的钻研,我个人决定用ORBSLAM2。因为整个项目从头到尾都是我一个人做,摸索了很多,进了很多坑,最后终于跑通了,决定把这整个过程
记录下来。
我最开始的系统是win8(legacy)。所以本文从安装ubuntu开始。
一、安装ubuntu14.04
ubuntu 14.04.1 with ROS indigo
ubuntu的安装没什么好多说的,装个10几次自然就会了。这里的链接是集成了ROS indigo的版本,免去了自己安装ROS的麻烦。另外建议非linux老鸟不要把/usr从根目录里面单独挂载出来,因为很容易一个chmod 777你的sudo就不能用了。另外legacy启动的系统可以挂载ubuntu的GRUB,在windows系统下用EasyBCD修复ubuntu的启动项即可。
二、ubuntu下一些必备的包的安装
0.换源:
更换常规源
更换ROS源:
sudo sh -c 'echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-get update
1.openCV
先安装依赖项
sudo apt-get update
# Ubuntu 14.04
sudo apt-get install --fix-missing build-essential libgtk2.0-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev
# Ubuntu 16.04
sudo apt-get install --fix-missing build-essential libgtk2.0-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev cmake python-dev python-numpy python-tk libtbb-dev libeigen2-dev yasm libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev libqt4-dev libqt4-opengl-dev sphinx-common texlive-latex-extra libv4l-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev
然后去官网下载源码openCV源码下载。推荐下载2.4.*系列。3.0系列据说还不是很完善,一些接口和现在用2.4系列的程序可能也对不上。
然后解压下载的源码包,终端进入解压后的文件夹。
git clone https://gitee.com/linsibo/opencv.git
cd opencv/
git checkout 2.4.13
mkdir build
cd build
cmake ..
make
sudo make install
make消耗的时间会比较长,如果你有勇气的话可以用make -j替换make,速度会快不少,但不能保证稳定性
2.PCL
下载的ubuntu是集成了PCL1.7的,所以就不用再去纠结PPA链接不上的问题了。如果你已经有ubuntu系统不想重装决定自己装ROS以及这些包。那么
# Ubuntu 14.04
sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get install libpcl-all
# Ubuntu 16.04
sudo apt-get install libpcl1.7
校园网经常出现PPA连不上的情况,可以去PCL找源码下载安装,步骤基本同openCV。
3.g2o
安装依赖项
sudo apt-get install --fix-missing libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-dev
源码包建议使用ORBSLAM2项目里ThirdParty下的g2o,里面有作者新添加的一些点和边的定义。
4.Pangolin
依赖项
就一个sudo apt-get install libglew-dev
然后
git clone https://github.com/zzx2GH/Pangolin.git
cd Pangolin
修改 Pangolin/src/display/device/display_x11.cpp文件,
注释掉 staticint visual_attribs[]={…}里的GLX_SAMPLE_BUFFERS这一行和GLX_SAMPLES这一行。
mkdir build
cd build
cmake ..
make -j
非常简单。
三、安装ORBSLAM2
终于进入正题了。这里有两个版本的ORBSLAM2提供选择。第一个是官方版的ORBSLAM2,不带点云,重建的是单目的稀疏特征点地图。官方版 第二个是清华的高翔博士修改的版本,可以显示点云地图。高博点云版 官方版自带了详细的使用教程,所以我就不说了。我自己把这两个版本整理了一下:
git clone https://gitee.com/qq184861643/ORBSLAM2_PCL.git
然后:
cd ORBSLAM2_PCL/ORB_SLAM2_modified
./build.sh #运行这一步之前先把build.sh里所有的make -j改为make
cd /Examples/ROS/ORB_SLAM2/
打开当前目录下的CMakeList.txt,找到语句find_package(Pangolin REQUIRED)
,在下一行插入find_package(PCL REQUIRED)
;
找到语句${Pangolin_INCLUDE_DIRS}
,在下一行插入${PCL_INCLUDE_DIRS}
;
找到语句${Pangolin_LIBRARIES}
,在下一行插入${PCL_LIBRARIES}
;
将${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
改为g2o_core g2o_types_slam3d g2o_solver_csparse g2o_stuff g2o_csparse_extension g2o_types_sim3 g2o_types_sba
。
修改完成之后
cd ../../../..
将文件夹ORB_SLAM2_modified改名为ORB_SLAM2
然后
(1)打开ORB_SLAM2\Examples\ROS\ORB_SLAM2\src\ros_rgbd.cc
,在83行左右main函数的SLAM.SaveKeyFrameTrajectoryTUM("KeyFrameTrajectory.txt");
语句下面添加SLAM.SavePointCloud("/home/exbot/ROSExample.pcd");
括号里为点云文件保存的位置和文件名,可以修改。
(2)打开ORB_SLAM2\src\pointcloudmapping.cc
,在文件的最后添加一个方法
#include
#include
void PointCloudMapping::savePointCloud(const string &filename)
{
globalMap->clear();
for(size_t i=0;iswap( *tmp );
cout<<"Saving Point Cloud as PCD File ..."<
(3)打开ORB_SLAM2\src\System.cc
,在namespace ORB_SLAM2{}
的作用域里(一般是最后一个大括号之前)添加一个方法:
void System::SavePointCloud(const string &filename)
{
mpPointCloudMapping->savePointCloud(filename);
}
四、配置ROS工作环境
1.构建工作环境
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
source devel/setup.bash
echo "source /home/exbot/catkin_ws/devel/setup.bash" >> ~/.bashrc
echo "export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/exbot/catkin_ws/src/ORB_SLAM2/Examples/ROS" >> ~/.bashrc
source ~/.bashrc
之后将改好名的ORB_SLAM2复制到catkin_ws/src/目录下。
之后
cd catkin_ws/src/ORB_SLAM2
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
cd ../Examples/ROS/ORB_SLAM2/
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make
如果在make的过程中提示找不到pcl的头文件,请自行修改cmakeList文件,或者像我一样做个体力活,把/usr/include/pcl-1.7/目录下的所有头文件里的#include语句都改成绝对路径。。。
2.kinect 驱动的安装
sudo apt-get install ros-indigo-openni-* ros-indigo-openni2-* ros-indigo-freenect-*
rospack profile
3.实现
先插上kinect。然后打开三个终端,分别输入:
roscore
roslaunch freenect_launch freenect-registered-xyzrgb.launch
rosrun ORB_SLAM2 RGBD /home/exbot/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/exbot/catkin_ws/src/ORB_SLAM2/Examples/RGB-D/TUM1.yaml
自行将第三条命令里的路径换成自己的绝对路径即可。
五、win10(UEFI)下安装ubuntu
UEFI启动的机器是不能使用EasyBCD的,也最好不要强行使用。实际上安装ubuntu的时候将GRUB安装到win10 boot loader的同一硬盘下(可以在不同分区)即可,然后进入UEFI将ubuntu的启动优先级提到win10之前就可以了,比legacy系统更加简单,因为legacy启动的BIOS的启动顺序不能细分到同一硬盘下,最多只能选择不同的硬盘哪一个更先启动。
python associate.py ${Data_Path}/rgb.txt ${Data_Path}/depth.txt > ${Data_Path}/association.txt
Example/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Example/RGB-D/TUM1.yaml ${Data_Path} ${Data_Path}/association.txt