ubuntu16.04下跑通LSD-SLAM的过程记录
第一步:首先安装ROS kinetic:
参考:https://blog.csdn.net/softimite_zifeng/article/details/78632211
https://blog.csdn.net/xuehuafeiwu123/article/details/52549872
1. 配置Ubuntu的资源库:"restricted","universe"和"multiverse"
打开系统设置->软件与更新:
确保"restricted","universe"和"multiverse"这三个选项被勾选。
然后更改download from:在下拉框中选择其他站点->选择最佳服务器->选择服务器。
2. 设置软件源:sources.list
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
3. 设置 keys
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
4. 更新软件及安装
1 sudo apt-get update 2 sudo apt-get install ros-kinetic-desktop-full
注意区分大小写,如果不小心写成sudo apt-get install ros-Kinetic-desktop-full,解决方法如下:
1)报错:E: 无法定位软件包 ros-Kinetic-desktop-full 解决:后来发现应该是sudo apt-get install ros-kinetic-desktop-full.怎么样,有没有发现什么?把‘k’敲成‘K’啦.
重新输入:sudo apt-get install ros-kinetic-desktop-full
2)报错:下列软件包有未满足的依赖关系:
ros-kinetic-desktop-full : 依赖: ros-kinetic-desktop 但是它将不会被安装
依赖: ros-kinetic-perception 但是它将不会被安装
依赖: ros-kinetic-simulators 但是它将不会被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
解决:
1 sudo apt-get update 2 sudo apt-get install ros-kinetic-desktop 3 sudo apt-get install ros-kinetic-simulators
再输入:
sudo apt-get install ros-kinetic-desktop-full
5. 安装完可以查看可用的package(有什么用呢??)
apt-cache search ros-kinetic
6. 初始化 rosdep
1 sudo rosdep init 2 rosdep update
3)报错:Traceback (most recent call last):
File "/usr/bin/rosdep", line 3, in <module>
from rosdep2.main import rosdep_main
ImportError: No module named 'rosdep2'
解决:将python的默认版本设为2
sudo update-alternatives --config python
选择1
7. 环境配置
1 echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc 2 source ~/.bashrc
4)报错:bash:/opt/ros/Kinect/setup.bash:没有那个文件或目录
错误原因:还是这个K!!!
解决:在终端输入:gedit ~/.bashrc
在打开文件的最后找到bash: /opt/ros/Kinetic/setup.bash将Kinetic的K改成小写即可,删除重复的多余配置
8. 安装building package的依赖
sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential
9. 测试ROS安装是否成功
roscore
出现这样的结果,说明安装成功。
第二步:安装LSD-SLAM
参考:https://blog.csdn.net/softimite_zifeng/article/details/78632653
1. 创建rosbuild工作空间:
1 sudo apt-get install python-rosinstall
2 mkdir ~/rosbuild_ws
3 cd ~/rosbuild_ws
4 rosws init . /opt/ros/kinetic
5 mkdir package_dir
6 rosws set ~/rosbuild_ws/package_dir -t .
7 echo "source ~/rosbuild_ws/setup.bash" >> ~/.bashrc
8 bash
9 cd package_dir
2. 安装依赖
sudo apt-get install ros-kinetic-libg2o ros-kinetic-cv-bridge liblapack-dev libblas-dev freeglut3-dev libsuitesparse-dev libx11-dev
sudo apt install libqglviewer-dev-qt4
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libQGLViewer-qt4.so libQGLViewer.so.2
3.获取LSD-SLAM
git clone https://github.com/tum-vision/lsd_slam.git lsd_slam
4. 编译
rosmake lsd_slam
由于原版本支持的系统是ubuntu12.04和14.04,直接在16.04的版本上编译,会报错。可以直接下载运行我已经修改好的代码https://github.com/Chatoyant19/LSD-SLAM
或者根据报错提示自己修改:
1)报错:ERROR [gendeps] 1 Finding dependencies for /home/cc/rosbuild_ws/package_dir/lsd_slam/lsd_slam_viewer/cfg/LSDSLAMViewerParams.cfg
解决:删除lsd_slam_viewer/cfg/LSDSLAMViewerParams.cfg和lsd_slam_core/cfg/LSDDebugParams.cfg两个文件中出现的单引号
lsd_slam_viewer/cfg/LSDSLAMViewerParams.cfg:
第20行scaledDepthVarTH:单词 point's和keyframe's 中出现了单引号,删除单引号
第21行absDepthVarTH:单词 point's
第24行cutFirstNKf:单词 keyframe's
lsd_slam_core/cfg/LSDDebugParams.cfg
第11行plotStereoImages:单词 what's
第12行plotTracking:单词 what's
第48行continuousPCOutput:单词 Keyfram's
2)报错:
main_stitchVideos.cpp:(.text+0xd65c):对‘cv::imshow(cv::String const&, cv::_InputArray const&)’未定义的引用
main_stitchVideos.cpp:(.text+0xd668):对‘cv::String::deallocate()’未定义的引用
main_stitchVideos.cpp:(.text+0xd672):对‘cv::waitKey(int)’未定义的引用
main_stitchVideos.cpp:(.text+0xd715):对‘cv::fastFree(void*)’未定义的引用
main_stitchVideos.cpp:(.text+0xd7b5):对‘cv::fastFree(void*)’未定义的引用
main_stitchVideos.cpp:(.text+0xd84d):对‘cv::fastFree(void*)’未定义的引用
main_stitchVideos.cpp:(.text+0xd8e5):对‘cv::fastFree(void*)’未定义的引用
main_stitchVideos.cpp:(.text+0xd985):对‘cv::fastFree(void*)’未定义的引用
CMakeFiles/videoStitch.dir/src/main_stitchVideos.cpp.o:main_stitchVideos.cpp:(.text+0xda25): 跟着更多未定义的参考到 cv::fastFree(void*)
…
解决:在lsd_slam_viewer中的CMAKELISTS.txt的最后加上:
find_package(OpenCV REQUIRED)
rosbuild_add_executable(videoStitch src/main_stitchVideos.cpp)
target_link_libraries(videoStitch ${OpenCV_LIBS})
3)报错:
解决:lsd_slam_viewer/src/PointCloudViewer.h中,第135行:将float x, y, z修改为qreal x, y, z
lsd_slam_viewer/src/PointCloudViewer.cpp中,第326行:将float x, y, z修改为qreal x, y, z
4)报错:
解决:将文件lsd_slam_viewer/src/KeyFrameDisplay.cpp的头文件:#include "opencv2/opencv.hpp"注释掉
5)报错:
解决:在lsd_slam_core中的CMAKELISTS.txt的最后增加boost_system库的链接:
find_package(OpenCV REQUIRED)
# build live ros node
rosbuild_add_executable(live_slam src/main_live_odometry.cpp)
target_link_libraries(live_slam lsdslam boost_system ${OpenCV_LIBS})
# build image node
rosbuild_add_executable(dataset_slam src/main_on_images.cpp)
target_link_libraries(dataset_slam lsdslam boost_system ${OpenCV_LIBS})
终于,编译通过!!!
5. 运行LSD-SLAM
5.1 下载数据集并解压:http://vmcremers8.informatik.tu-muenchen.de/lsd/LSD_room.bag.zip
5.2 打开终端输入命令:roscore
5.3 另打开一个新的终端,输入命令:rosrun lsd_slam_viewer viewer
1)报错:rospack: error while loading shared libraries: librospack.so: cannot open shared object file: No such file or directory
解决:首先我们要先确定操作系统里面是否包含了这个共享库:在终端中输入命令:
sudo updatedb
locate rospack
可以看到librospack.so所在的地址:
将共享库目录添加到共享库配置文件/etc/ld.so.conf中
由于权限问题,需要在root下输入以下命令:
cat /etc/ld.so.conf
echo "/opt/ros/kinetic/lib" >> /etc/ld.so.conf
ldconfig
5.4 再打开一个新的终端,输入命令:rosrun lsd_slam_core live_slam image:=/image_raw camera_info:=/camera_info
5.5 再打开一个新的终端,cd到解压后的数据集LSD_room.bag所在的目录下,输入命令:rosbag play ./LSD_room.bag
弹出的DebugWindow DEPTH窗口不能正常显示。
解决方法一:将lsd_slam/lsd_slam_core/src/util/settings.cpp的第38行更改为:bool displayDepthMap = false;//true
此时DebugWindow DEPTH窗口不再显示。
解决方法二:修改lsd_slam/lsd_slam_core/src/IOWrapper/OpenCV/ImageDisplay_OpenCV.cpp:在line 73增加
cv::imshow(displayQueue.back().name, displayQueue.back().img);
cv::waitKey();
displayQueue.pop_back();
点云窗口只显示相机的移动不显示点云地图的解决方法:在lsd_slam/lsd_slam_core/src/IOWrapper/OpenCV/ImageDisplay_OpenCV.cpp中的lines 119 and 125
用 'return 1'替换cv::waitKey(milliseconds)
重新编译lsd_slam(rosmake lad_slam),然后重新执行步骤2~5,就可在PointCLoud Viewer中查看得到的环境的点云信息。