由于要学习下SLAM的知识,就决定在ubantu上运行一个SLAM框架,看了一些东西后,决定在orb_slam和 lsd_slam 这两个框架上进行运行。
首先开始运行lsd_slam,这里碰到了一些问题,以及找到的解决方法,在此记录下,以防以后找不到,也是对碰到这类问题的同行一些启发。
要向编译lsd_slam,首先安装ROS indigo,这个环境编译时,必须安装boost,我的电脑是ubuntu14.04,要求安装的boost1.54。
1:在安装boost时,碰到比较扯淡的事情,老是编译不过。
"error: 'uintptr_t' was not declared in this scope".
我找到的解决方法是修改boost/atomic/atomic.hpp中的代码
- || (defined(_XOPEN_UNIX) && (_XOPEN_UNIX+0 > 0) && !defined(__UCLIBC__)) \
+ || (defined(_XOPEN_UNIX) && (_XOPEN_UNIX+0 > 0) && !defined(__UCLIBC__) && !defined(__GLIBC__)) \
在编译时,可能还会碰到类似这个的错误,同样的在合适的文件中更改。
参考https://svn.boost.org/trac/boost/ticket/7979
2:然后安装ROS indigo,这里主要参考了http://blog.sina.com.cn/s/blog_7b83134b0102w4de.html
什么是ROS indigo?
ROS:Robot Operating System,机器人操作系统,ROS提供一些库和工具来帮助创建一些机器人的程序 (http://wiki.ros.org/cn),其目标是为了提高机器人领域的代码复用率,它是一个分布式框架,使可执行文件能够被单独地设计,然后松散耦合地执行(https://en.wikipedia.org/wiki/Robot_Operating_System),ROS Jade Turtle是目前的发行版本,ROS Indigo Igloo是ROS Jade Turtle前一个版本,在lsdslam中ROS仅用于输入和输出(https://github.com/tum-vision/lsd_slam)
如何在ubuntu14.04上安装ROS indigo?
http://wiki.ros.org/cn/indigo/Installation/Ubuntu
2.1 设置软件源
sudo sh -c ‘echo “deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main” > /etc/apt/sources.list.d/ros-latest.list’
2.2 添加密钥
sudo apt-key adv –keyserver hkp://pool.sks-keyservers.net –recv-key 0xB01FA116
说明:
apt-key是Debian软件包的安全管理工具。每个发布的deb包,都是通过密钥认证的,apt-key用来管理密钥。apt-key adv:导入密钥
2.3安装
2.3.1更新软件源:sudo apt-get update
2.3.2安装:sudo apt-get install ros-indigo-desktop-full
(桌面完整版安装太费时,以后可以看一下只安装lsdslam必要的一些ROS包)
2.5配置环境
echo “source /opt/ros/indigo/setup.bash” >> ~/.bashrc
source ~/.bashrc
说明:
ubuntu环境变量更改:当前用户:~/.bashrc 全局设置:/etc/profile系统设置
sudo vi /etc/enviroment
Source命令也称为“点命令”,也就是一个点符号(.),source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
2.6安装rosinstall
sudo apt-get install python-rosinstall
说明:rosinstall是一个命令行工具,帮助下载ROS软件包。
2.7创建ROS工作环境,如果没有rosbuild并且打算使用rosbuild空间的话,执行下列代码
mkdir ~/rosbuild_ws
cd ~/rosbuild_ws
rosws init . /opt/ros/indigo
mkdir package_dir
rosws set ~/rosbuild_ws/package_dir -t .
echo “source ~/rosbuild_ws/setup.bash” >> ~/.bashrc
bash
cd package_dir
这里能进入bash就说明安装ROS indigo成功,可以用一下测试
//安装uvc_camera (可选,适用于需要USB摄像头且没有安装过ROS摄像驱动的情况)
sudo apt-get install ros-indigo-uvc-camera
开启三个终端:
第一个启动ROS服务:
$ roscore
第二个启动驱动:
$ rosrun uvc_camera uvc_camera_node device:=/dev/video0
第三个启动视频窗口:
$ rosrun image_view image_view image:=/image_raw
如果正常显示摄像头视频即成功
2.8安装依赖项
sudo apt-get install ros-indigo-libg2o ros-indigo-cv-bridge liblapack-dev libblas-dev freeglut3-dev libqglviewer-dev libsuitesparse-dev libx11-dev
2.9
git clone https://github.com/tum-vision/lsd_slam.git lsd_slam
如果你需要openFabMap去闭环检测的话(可选)
在
lsd_slam_core/CMakeLists.txt
中去掉下列四行注释即可
#add_subdirectory(${PROJECT_SOURCE_DIR}/thirdparty/openFabMap)
#include_directories(${PROJECT_SOURCE_DIR}/thirdparty/openFabMap/include)
#add_definitions("-DHAVE_FABMAP")
#set(FABMAP_LIB openFABMAP )
需要注意openFabMap需要OpenCv nonfree模块支持,OpenCV3.0以上已经不包含,作者推荐2.4.8版本
其中nonfree模块可以由以下方式安装
$ sudo add-apt-repository --yes ppa:xqms/opencv-nonfree
$ sudo apt-get update
$ sudo apt-get install libopencv-nonfree-dev
2.10安装lsdslam
rosmake lsd_slam
在这里我的电脑出现了问题,说是QGLViewer.h中的getposition()函数调用不对,float不能转化成qreal类型,找了下发现我不知什么时候安装的QGLViewer在/usr/local/中,而在安装ROS indigo时也安装了一份QGLViewer在/usr/中,在/usr/中的那一份是对的,数据类型都是float的,在/usr/local中的那一份不对,我就把/usr/local中的那份删了,就没问题了。
还有就是在编译lsd_slam时可能有的Makefile中的调用路径有问题,一些boost库在指定路径中不能找到,索性我就把boost库复制到指定路径中,缺什么补什么,我这种方法只适合我自己使用吧……..
编译通过后,在http://vision.in.tum.de/research/vslam/lsdslam?redirect=1下载需要的测试数据库
运行LSD-SLAM
开启四个终端窗口
第一个启动ROS服务:
$ roscore
第二个启动摄像服务(USB摄像模式):
$ rosrun uvc_camera uvc_camera_node device:=/dev/video0
第三个启动LSD-viewer查看点云:
$ rosrun lsd_slam_viewer viewer
第四个启动LSD-core:
(1)数据集模式
$ rosrun lsd_slam_core dataset_slam _files:= _hz:= _calib:=
_files填数据集png包的路径,_hz表示帧率,填0代表默认值,_calib填标定文件地址
如:
$ rosrun lsd_slam_core dataset_slam _files:=/LSD_room/images _hz:=0 _calib:=/LSD_room/cameraCalibration.cfg
(2)USB摄像模式
$ rosrun lsd_slam_core live_slam /image:= _calib:=
_calib同上,/image选择视频流
如:
$ rosrun lsd_slam_core live_slam /image:=image_raw _calib:=/LSD_room/cameraCalibration.cfg
接下来将详细学习下代码,另外orb_slam2我也将运行并查看效果后,在二者之间选择一个进行详细剖析。