首先感謝CSDN上的大佬們,在大佬們的幫助下我終於在Jetson TX2上成功安裝的LSD-SLAM,因此記錄下辛酸的安裝過程。
平臺:NVIDIA Jetson TX2
系統:ubuntu16 + ROS kinetic
LSD-SLAM官網:https://vision.in.tum.de/research/vslam/lsdslam
LSD-SLAM github:https://github.com/tum-vision/lsd_slam
在LSD-SLAM官網上介紹了ubuntu12和ubuntu14環境下的,但是ubuntu16的不太一樣,下面開始安裝過程。
一、安裝依賴項
1. 安裝 ROS Kinetic
LSD-SLAM的運行是基於ROS的,因此必須先安裝 ROS,安裝教程可以參考ROS官網,或者是 這個教程
2. 安裝其他依賴項
sudo apt-get install ros-kinetic-libg2o ros-kinetic-cv-bridge liblapack-dev libblas-dev freeglut3-dev libsuitesparse-dev libx11-dev
注意:LSD-SLAM官方安裝的依賴項中有libqglviewer-dev,LSD-SLAM依賴的是qt4,但是在ubuntu16下用這個命令安裝的是qt5,因此上面的命令中我刪掉了
3. 安裝libqglviewer-dev-qt4
3.1 刪除libqglviewer-dev
sudo apt remove libqglviewer-dev
3.2 安裝libqglviewer-dev-qt4,並創建相關鏈接
sudo apt install libqglviewer-dev-qt4
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libQGLViewer-qt4.so libQGLViewer.so
二、安裝 LSD-SLAM
1. 創建工作空間
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
上面的過程是在根目錄下創建了一個 rosbuild_ws 的工作空間,需要注意的是第7行的命令需要根據自己工作空間的地址來修改
2. 獲取LSD-SLAM
獲取LSD-SLAM源碼有兩種,第一種是獲取官方的源碼,命令如下,但是在編譯的過程中會報錯
git clone https://github.com/tum-vision/lsd_slam.git lsd_slam
第二種是獲取被修正過的源碼,命令如下:(感謝大佬)
git clone https://github.com/gjgjh/lsd-slam.git lsd_slam
按理說直接用修改過的編譯不會出錯,但是我在jetson TX2上面編譯lsd_slam_core的時候報錯了,解決辦法見下 問題3.1
3. 編譯
cd package_dir
rosmake lsd_slam
出現下面的結果表示全部編譯完成,看到:
Finished <<< lsd_slam_viewer [PASS] [ 8.93 seconds ] [ 4 warnings ] 和 Finished <<< lsd_slam_core [PASS] [ 473.94 seconds ] [ 1 warnings ]
更加詳細的結果如下:
[ rosmake ] /home/nvidia/.ros/rosmake/rosmake_output-20200104-144823/lsd_slam_viewer/build_output.log
[rosmake-0] Finished <<< lsd_slam_viewer [PASS] [ 8.93 seconds ] [ 4 warnings ]
[rosmake-0] Starting >>> lsd_slam_core [ make ]
^[`[ rosmake ] [ make ] [ lsd_slam_core: 11.9 sec ] [ 1 Active 47/48 Complet[ rosmake ] Output from build of package lsd_slam_core written to: [ 1 Active 47/48 Complete ]
[ rosmake ] /home/nvidia/.ros/rosmake/rosmake_output-20200104-144823/lsd_slam_core/build_output.log
[rosmake-0] Finished <<< lsd_slam_core [PASS] [ 473.94 seconds ] [ 1 warnings ]
[ rosmake ] Results:
[ rosmake ] Built 48 packages with 0 failures.
[ rosmake ] Summary output to directory
[ rosmake ] /home/nvidia/.ros/rosmake/rosmake_output-20200104-144823
4. 測試
4.1 下載數據集,不過這個數據集比較難下載,因此可以從這個鏈接下載:https://download.csdn.net/download/sunshinefcx/12080535
4.2 打開一個termial,輸入以下命令:
roscore
4.3 打開一個新的termial,輸入以下命令,將會彈出PointCloud Viewer窗口:
rosrun lsd_slam_viewer viewer
4.4 再打開一個新的termial,輸入以下命令:
rosrun lsd_slam_core live_slam image:=/image_raw camera_info:=/camera_info
4.5 再打開一個新的termial,輸入以下命令:
rosbag play ./LSD_room.bag
./LSD_room.bag 需要換成自己平臺上數據集所在的路徑
三、問題彙總
首先想要安裝LSD-SLAM,在編譯的過程中必須將 lsd_slam_viewer 和 lsd_slam_core都編譯通過,我在編譯完成lsd_slam_viewer之後,在編譯lsd_slam_core的時候報錯了,報錯內容如下所示:
問題3.1
_mm_store_ps(SSEData+4*11, _mm_add_ps(_mm_load_ps(SSEData+4*11),_mm_mul_ps(J3w,J3)));
^
/home/nvidia/jc-lsd-slam/rosbuild_ws/package_dir/lsd_slam/lsd_slam_core/src/Tracking/LGSX.h:356:11: error: expected ‘;’ before ‘J4w’
__m128 J4w = _mm_mul_ps(J4,weight);
^
/home/nvidia/jc-lsd-slam/rosbuild_ws/package_dir/lsd_slam/lsd_slam_core/src/Tracking/LGSX.h:357:79: error: ‘J4w’ was not declared in this scope
_mm_store_ps(SSEData+4*15, _mm_add_ps(_mm_load_ps(SSEData+4*15),_mm_mul_ps(J4w,J4)));
^
/home/nvidia/jc-lsd-slam/rosbuild_ws/package_dir/lsd_slam/lsd_slam_core/src/Tracking/LGSX.h:362:11: error: expected ‘;’ before ‘J5w’
__m128 J5w = _mm_mul_ps(J5,weight);
^
/home/nvidia/jc-lsd-slam/rosbuild_ws/package_dir/lsd_slam/lsd_slam_core/src/Tracking/LGSX.h:363:79: error: ‘J5w’ was not declared in this scope
_mm_store_ps(SSEData+4*18, _mm_add_ps(_mm_load_ps(SSEData+4*18),_mm_mul_ps(J5w,J5)));
^
/home/nvidia/jc-lsd-slam/rosbuild_ws/package_dir/lsd_slam/lsd_slam_core/src/Tracking/LGSX.h:367:11: error: expected ‘;’ before ‘J6w’
__m128 J6w = _mm_mul_ps(J6,weight);
^
/home/nvidia/jc-lsd-slam/rosbuild_ws/package_dir/lsd_slam/lsd_slam_core/src/Tracking/LGSX.h:368:79: error: ‘J6w’ was not declared in this scope
_mm_store_ps(SSEData+4*20, _mm_add_ps(_mm_load_ps(SSEData+4*20),_mm_mul_ps(J6w,J6)));
^
/home/nvidia/jc-lsd-slam/rosbuild_ws/package_dir/lsd_slam/lsd_slam_core/src/Tracking/LGSX.h:374:11: error: expected ‘;’ before ‘resw’
__m128 resw = _mm_mul_ps(res,weight);
^
/home/nvidia/jc-lsd-slam/rosbuild_ws/package_dir/lsd_slam/lsd_slam_core/src/Tracking/LGSX.h:375:79: error: ‘resw’ was not declared in this scope
_mm_store_ps(SSEData+4*21, _mm_add_ps(_mm_load_ps(SSEData+4*21),_mm_mul_ps(resw,J1)));
解決辦法:
去掉
lsd_slam_core文件夾下面CMakeLists.txt中的 add_definitions("-DENABLED_SSE")
即可
解決方案來源: https://github.com/tum-vision/lsd_slam/issues/274
在編譯 lsd_slam_viewer 遇到的問題可以參考下面的幾篇,再次就不再贅述了:
https://www.cnblogs.com/GJGJH/p/9704384.html
https://blog.csdn.net/softimite_zifeng/article/details/78632653
或者在LSD-SLAM github上找解決方案:https://github.com/tum-vision/lsd_slam/issues