基本操作之甩锅先:……(你懂得)
编译环境:Ubuntu14.04 LTS(64位),ROS Indigo,OpenCV2.4.9
这次给出 64位 这个信息,有没有感到困惑?其实真正原因是,我之前编译总是失败以至于都怀疑是不是只有32位的才可以。实践证明,64也是可以哒,放心撒~~~
同理也给出了OpenCV的版本,这是因为我在编译的时候遇到了ROS找不到Opencv的问题,其实,在安装ROS的时候由于安装的是 full 版所以 OpenCV 自然也是已经安装上了,但是安装路径我却没有查到。Indigo 默认的安装的 OpenCV 版本是 2.4.8,然而我电脑上自己自定义路径安装了 OpenCV2.4.9 等版本,没有 2.4.8。反正不管怎么说,就是ROS找不到OpenCV,于是我就把 2.4.9 版本的手动移到了 /usr/include 下,然后,,然后竟然通过了(即使不是2.4.8版本)。
已经安装了 ROS 的朋友们自己看看在 /usr/include 下是不是有 opencv 这个文件夹,如果没有编译的时候可能会出错。反正我的是没有,也不知道是不是自己之前不小心删掉了,没有也没关系,下面会给出相应的解决方法。
还有一点,按照原作者网页编译了N次,均告失败。翻了各种帖子,最终只有这一篇让我解决了大部分问题,是用 catkin_make 编译的,然后又综合别的网页最后总算是成功了。
还要说明的一点是,需要把之前编译 ORB 时设置的环境变量注释掉,否则不能运行这个,可能会提示找不到启动文件。不只是这次,以后每次重新编译slam程序时,只要涉及到了修改 ~/.bashrc 中的环境变量都需要把以前的 ROS_PACKAGE_PATH 之类的都注释掉。运行哪个 slam 程序就取消哪个注释,不用的都要注释掉。
下面是具体步骤:
1、创建工作空间并获取源码
打开终端窗口,输入:
mkdir -p ~/lsd-slam_ws/src
初始化工作空间:
cd ~/lsd-slam_ws
catkin_make
source devel/setup.bash
下载源码:
cd src
git clone https://github.com/tum-vision/lsd_slam.git
下载完后大概这样:
然后切换分支:
cd lsd_slam
git checkout catkin
效果如下:
然后下载用到的数据包,链接在此,下载好后移到 ~/lsd-slam_ws 下。
2、安装依赖项及更改文件
首先安装依赖项,(为了避免输出看起来太乱,建议新开一个窗口执行):
sudo apt-get install ros-indigo-libg2o ros-indigo-cv-bridge liblapack-dev libblas-dev freeglut3-dev libqglviewer-dev libsuitesparse-dev libx11-dev
安装好后修改 lsd_slam/lsd_slam_viewer 下的 package.xml
以及修改 lsd_slam/lsd_slam_core 下的 package.xml
在文件上右键选择 open-with - - gedit 编辑即可,两个文件中都添加内容:
<build_depend>cmake_modules</build_depend>
<run_depend>cmake_modules</run_depend>
保存退出,
然后编辑 lsd_slam_core 下的 CMakeLists.txt 文件,11行左右添加:
set(OpenCV_DIR ~/opencv-2.4.9/share/OpenCV)
include_directories(~/opencv-2.4.9/include)
find_package(cmake_modules REQUIRED)
然后在 102、108和113行左右的 target_link_libraries 的括号里最后面添加 X11 库:
保存退出。这里啰嗦一下,由于之前我安装的 OpenCV2.4.9 路径不是默认路径,而是自己定义的 ~/opencv-2.4.9/share/OpenCV(为了方便版本切换),所以这里的路径才是这样的,同时也要将OpenCV的环境变量也从 2.4.13 切换成 2.4.9(切换环境变量后新开的窗口才会更新变量,原来已开的窗口保存的是更新前的变量,这个上篇文章也说过了) 。多版本 OpenCV 的安装,环境变量的配置与切换可以参考我上篇编译 ORB 的文章,这里就不再赘述了。
然后编辑 lsd_slam_viewer 下的 CMakeLists.txt 文件,11行左右添加:
set(OpenCV_DIR ~/opencv-2.4.9/share/OpenCV)
include_directories(~/opencv-2.4.9/include)
find_package(cmake_modules REQUIRED)
与刚才不同的是,这里我们要再多修改一个地方,在第 73 行下插入一行:
add_dependencies(viewer lsd_slam_viewer_generate_messages_cpp)
之前我没有添加这句,结果出现了这种错误:
In file included from /home/gao/lsd-slam_ws/src/lsd_slam/lsd_slam_viewer/src/main_viewer.cpp:25:0:
/home/gao/lsd-slam_ws/src/lsd_slam/lsd_slam_viewer/src/PointCloudViewer.h:30:41: fatal error: lsd_slam_viewer/keyframeMsg.h: No such file or directory
#include "lsd_slam_viewer/keyframeMsg.h"
然后在 target_link_libraries 的括号里最后面添加 X11 库 (79 行左右):
保存退出。
3、编译
把依赖装好,并且更改为文件后,回到原来的窗口,然后开始编译(如果不回到原来窗口而是新开窗口编译的话,别忘了先source相关的setup文件,前面的文章已经说过了):
cd ~/lsd-slam_ws
catkin_make
然后我最开始提到的问题就出现了,找不到 opencv ,如图:
怎么办呢?没有就给它弄过去呗,首先进入 opencv2.4.9 的安装文件夹,我的是 ~/opencv-2.4.9,然后进入 include 文件夹,就可以看到 opencv 文件夹了:
然后把这个 opencv 文件夹拷到 /usr/include 下
然后重新 catkin_make,最后结果如图:
4、运行
新开窗口启动 ROS:
roscore
新开窗口,运行 viewer:
cd ~/lsd-slam_ws
source devel/setup.bash
rosrun lsd_slam_viewer viewer
然后会弹出一个名称为 PointCloud Viewer 的窗口,由于没有数据输入,故黑屏。
新开窗口,运行 core:
cd ~/lsd-slam_ws
source devel/setup.bash
rosrun lsd_slam_core live_slam image:=/image_raw camera_info:=/camera_info
然后显示 “WAITING for ROS camera calibration!”
注:要尽快运行数据包,否则程序长时间检测不到输入就会自动停止,就需要重新启动了。
在新开窗口运行数据包:
cd ~/lsd-slam_ws
rosbag play LSD_room.bag
效果如图:
当你“看完了所有的帖子”,“尝试了所有的方法之后”还是解决不了问题,但这并不代表没有办法可以解决这个问题,只是你看的还不够多,做的还不够多。你以为你看了所有,尝试了所有,事实是你忽略了太多东西。
这是这次我最大的收获,共勉!!