LSD-SLAM源代碼是源代碼在ROS fuerte + Ubuntu 12.04和ROS indigo + Ubuntu 14.04,本次使運行在Ubuntu16.04 kinectic。
1.安裝ROS Kinetic
Ref : http://wiki.ros.org/kinetic/Installation/Ubuntu
a.安裝ubutnu系統(https://wiki.ubuntu.org.cn/%E9%A6%96%E9%A1%B5)
b.安裝對應ubuntu版本的ROS系統
注意:比如ubuntu14.04 對應ROS indigo, ubuntu16.04 對應ROS kinetic,本ppt以ROS kinetic爲例
1)添加ROS軟件源
$sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" /etc/apt/sources.list.d/ros-latest.list’
2)添加祕鑰
$sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
3)安裝
$sudo apt-get update
$sudo apt-get install ros-kinetic-desktop-full
4)初始化rosdep
$sudo rosdep init
$rosdep update
5)設置環境變量
$echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$source ~/.bashrc
6)安裝rosinstall
$sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
7)測試安裝 $roscore
2.LSD-SLAM安裝
1. 創建rosbuild工作空間:
sudo apt-get install python-rosinstall
mkdir ~/rosbuild_ws
cd ~/rosbuild_ws
rosws init . /opt/ros/kinetic
mkdir package_dir
rosws set ~/rosbuild_ws/package_dir -t .
echo "source ~/rosbuild_ws/setup.bash" >> ~/.bashrc
bash
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
rosmake lsd_slam
4.編譯報錯:
報錯1.編譯過程中出現錯誤:raise Exception(r"""quotes not allowed in description string '%s'""" % description)
分析:顧名思義,不應該在描述中出現引號(單引號或雙引號),可以通過查看錯誤內容得知需要修改的文件的名稱。
解決方法:
1) lsd_slam_viewer/cfg/LSDSLAMViewerParams.cfg
第20行scaledDepthVarTH:單詞 point's和keyframe's 中出現了單引號,刪除單引號
第21行absDepthVarTH:單詞 point's
第24行cutFirstNKf:單詞 keyframe's
2) lsd_slam_core/cfg/LSDDebugParams.cfg
第11行plotStereoImages:單詞 what's
第12行plotTracking:單詞 what's
第48行continuousPCOutput:單詞 Keyfram's
報錯2.編譯過程中出現錯誤:invalid initialization of non-const reference of type 'qreal& {aka double&}' from an rvalue of type 'qreal {aka double}'
分析:qt中的qreal表示小數,在Ubuntu14.04中qreal就是float,但是Ubuntu16.04中qreal變爲了double。錯誤中的變量x, y, z的類型是float,getPosition函數的形參類型是qreal,也就是double,所有x, y, z的值會自動轉型爲double,並存儲在一個臨時變量中,這會導致getPosition函數的實參變爲了右值,但是右值不能初始化非const的引用。
解決方法:
1) lsd_slam_viewer/src/PointCloudViewer.h
第135行:將float x, y, z修改爲qreal x, y, z或者double x, y, z
2) lsd_slam_viewer/src/PointCloudViewer.cpp
第325行:將float x, y, z修改爲qreal x, y, z或者double x, y, z
3).報錯: 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的最後加上:
#OpenCV3.4.3 我係統多opencv版本
set(OpenCV_DIR /usr/local/opencv-3.4.3/share/OpenCV)
find_package(OpenCV 3.4.3 REQUIRED)
include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS} /usr/local/opencv-3.4.3/include)
link_directories(${OpenCV_LIBRARY_DIRS} /usr/local/opencv-3.4.3/lib)
rosbuild_add_executable(videoStitch src/main_stitchVideos.cpp)
target_link_libraries(videoStitch ${OpenCV_LIBS})
3.報錯
解決:將文件lsd_slam_viewer/src/KeyFrameDisplay.cpp的頭文件:#include "opencv2/opencv.hpp"註釋掉
報錯4.報錯
解決:在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.報錯
$ rosmake lsd_slam
[rosmake-0] Finished <<< lsd_slam_viewer [FAIL] [ 2.87 seconds ] [ rosmake ] Halting due to failure in package lsd_slam_viewer.
解決方案是:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:"pwd"
https://github.com/tum-vision/lsd_slam/issues/316
報錯6.報錯
$ rosmake lsd_slam
錯誤信息:
[rosmake-3] Starting >>> lsd_slam_viewer [ make ]
[rosmake-3] Finished <<< lsd_slam_viewer [SKIP] No rule to make target None
viewer始終無法得出的可執行的二進制文件
解決方法是:
採用的qt4
報錯7.報錯
rosrun lsd_slam_core live_slam image:=/image_raw camera_info:=/camera_info
報錯:
*** Error in `/home/name/rosbuild_ws/package_dir/lsd_slam/lsd_slam_core/bin/live_slam': double free or corruption (out): 0x08f11900 ***
解決方案是採用eigen3.2.5,下載見 https://bitbucket.org/eigen/eigen/downloads/?tab=tags,詳情見https://github.com/tum-vision/lsd_slam/issues/208
本系統有兩個eigen3.2.9和3.2.5,實現版本切換可採用爲:https://blog.csdn.net/qq_36594547/article/details/102955881
6.編譯通過和運行結果
參考: