注:1. 對某些地方進行了更新(紅色標註),以方便進行配置。php
2. ZED ROS Wrapper官方github已經更新,根據描述新的Wrapper可能已經不適用與Ros Indigo了,若是你們想參照這份博客進行安裝ZED ROS Wrapper,有可能會出現其餘問題。ZED ROS Wrapper github地址:https://github.com/stereolabs/zed-ros-wrapperhtml
最近想運用ZED相機在ROS系統上實時運行ORB-SLAM2,在環境配置的過程中遇到了很多問題而且在網上都沒有比較系統的解決方法,所以將本身總結的步驟記錄下來,但願對你們有幫助。node
本文將包括如下內容:python
1、 配置環境與閱讀說明linux
Ubuntu14.04,ROS Indigo,Nvidia GTX 970。c++
在此須要說明一下,若是想在Ubuntu 14上進行相關配置請不要使用Nvidia GTX 1000系列顯卡,由於1000系列顯卡及其驅動會與某一些庫文件衝突。git
同時但願讀者按照我所列的安裝順序進行安裝,由於調換安裝順序可能會致使某些依賴項或文件產生衝突。該順序是我屢次失敗後總結出來的,親測有用。github
2、 配置與安裝步驟bash
2.1. OpenCV 3.1 安裝 app
爲正常運行ZED SDK須要預先安裝OpenCV 3.1,可從opencv.org/downloads.html上下載,具體步驟以下所示:
首先,安裝OpenCV所要求的包:
[compiler] sudo apt-get install build-essential [required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev [optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
而後在Opencv 3.1的下載路徑中生成build文件夾以便cmake,最後運用cmake編譯,具體以下:
cd ~/opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
以後直接make,OpenCV官網中建議make時開啓7個線程:
make -j7 # runs 7 jobs in parallel
在以上工做完成後執行一下命令完成安裝:
sudo make install
這樣Opencv 3.1就會成功的安裝到你的電腦當中。
因爲版本問題,在cmake OpenCV 3.1時可能會遇到ippcv_linux下載不正確的問題,解決方法是在網上自行從新下載ippicv_linux包,並將其從新放入 opencv/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e 目錄中並從新編譯。
關於OpenCV 3.1的更多詳細內容請參考官網:http://docs.opencv.org/3.1.0/d7/d9f/tutorial_linux_install.html
2.2. OpenCV 2.4.10 安裝
雖然ORB-SLAM2如今已經支持OpenCV3.1可是因爲與Ubuntu 14.04適配的ROS Indigo自帶Opencv2.4.8所以若是不安裝Opencv 2.4會致使以後在編譯ORB-SLAM2 ROS時出現Opencv版本錯誤。該錯誤主要是由於ROS Indigo中的cv_bridge指向OpenCV2.4.8可是在不安裝OpenCV2.4時候ORB-SLAM2是使用OpenCV3.1進行編譯(這裏理論上是能夠經過從新安裝ROS cv_bridge或相關包解決的,不過我ROS不是太熟,所以採用了另一種方法)。
OpenCV 2.4.10的下載和安裝你們能夠參考一下高翔博士的博客一塊兒作系列中的相關內容:http://www.cnblogs.com/gaoxiang12/p/4633316.html
2.3. ORB-SLAM2的安裝
如今就能夠開始安裝ORB-SLAM2了,參考官方網址爲:https://github.com/raulmur/ORB_SLAM2
根據要求咱們先下載Eiegn 3:
sudo apt-get install libeigen3-dev
而後安裝可視化工具Pangolin:
安裝依賴項
sudo apt-get install cmake libglew-dev libpython2.7-dev
直接進入到Pangolin的下載目錄,而後執行如下命令:
mkdir build
cd build
cmake ..
make -j
若是以上步驟有出現任何錯誤,請根據官方文檔確認全部依賴項以正確安裝:https://github.com/stevenlovegrove/Pangolin
ORB-SLAM2編譯與配置:
進入到ORB-SLAM2目錄執行:
chmod +x build.sh
./build.sh
在此過程當中,程序會自動安裝G2O庫。通常來講這一步不會出現任何問題。
安裝完成後能夠下載開源數據集檢測ORB-SLAM2是否能正確運行,下面給出雙目EUROC數據集的運行命令以做參考:
for terminal ./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml /home/li/openslam/database/Stereo_data/EUROC/V1_01_easy/mav0/cam0/data /home/li/openslam/database/Stereo_data/EUROC/V1_01_easy/mav0/cam1/data Examples/Stereo/EuRoC_TimeStamps/V101.txt for IDE - Kdevelop "/home/li/openslam/ORB_SLAM2/Vocabulary/ORBvoc.txt" "Examples/Stereo/EuRoC.yaml" "/home/li/openslam/database/Stereo_data/EUROC/V1_01_easy/mav0/cam0/data" "/home/li/openslam/database/Stereo_data/EUROC/V1_01_easy/mav0/cam1/data" "Examples/Stereo/EuRoC_TimeStamps/V101.txt"
2.4. ROS Indigo安裝
Ubuntu 14.04適配的ROS版本爲Indigo和jade,由於我在配置ORB-SLAM2 ROS Jade中出現了錯誤,因此推薦你們使用ROS Indigo,而且ROS Indigo也是Ubuntu 14.04的主流版本。
ROS Indigo安裝主要參考ros wiki: http://wiki.ros.org/cn/indigo/Installation/Ubuntu
按照ros wiki中的步驟就能夠沒有任何錯誤的安裝好ROS Indigo
在根據WiKi安裝完整版時可能會出現與更新有關的報錯,只須要在控制檯中輸入(sudo) apt-get update命令從新更新並從新執行安裝命令便可安裝成功。
安裝好ROS Indigo後,各位可使用如下命令,查看打開文件最後是否出現 source /opt/ros/indigo/setup.bash。如若出現且在控制檯中能夠運行roscore則說明ROS安裝正確。
gedit ~/.bashrc
請注意,之後所配置的ROS空間均可以加入到.bashrc文件中,以避免每次都須要申明ROS環境空間。下面的命令能夠查詢當前啓用的ROS環境空間:
echo $ROS_PACKAGE_PATH
2.5. ORB-SLAM2 & ROS安裝
如今就能夠安裝ORB-SLAM2 ROS了,安裝步驟十分簡單。
首先用以前所述命令打開.bashrc文件,並加入ORB-SLAM2的ros包路徑,以配置環境,示例以下:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/li/openslam/ORB_SLAM2/Examples/ROS
添加路徑後請經過該命令查看是否添加成功:
echo $ROS_PACKAGE_PATH
在添加完路徑後,即便以上命令輸出路徑中包含ORB-SLAM2的ROS包,可是在編譯的時候仍然沒法識別出來(出現報錯rospackage路徑不正確)。此時就須要重啓電腦,而後從新按照如下命令對ORB-SLAM2 ROS進行編譯。
確認添加成功後進入ORB-SLAM2目錄執行:
chmod +x build_ros.sh
./build_ros.sh
完成ORB-SLAM2 ROS的編譯與配置工做。在此過程當中,某些時候可能會出現Eigen中Eigen Core文件沒法找到的狀況,這是由於相關文件的軟連接出現了問題,使用如下命令修復一下就能夠了(此問題也有可能在編譯ZED ROS Wrapper時出現):
pkg-config --cflags eigen3 #檢測Eigen目錄路徑
sudo ln -s /usr/include/eigen3/Eigen /usr/local/include/Eigen #請根據檢測後的路徑進行更改
2.6. CUDA7.5安裝
如今終於能夠開始安裝CUDA了。
須要說明一下,爲何選擇這個順序在這個時候安裝CUDA。這是由於我在配置的過程當中發現若是先安裝CUDA再去安裝OpenCV 2.4.10會遇到'Compute 11'的錯誤,該錯誤須要更改依據Opencv 3.1的cmake格式更改cmake命令,比較麻煩。
除此之外,我還發現有時候安裝完CUDA以及CUDA自帶的driver後,lib文件中的一些共享庫的連接會斷開,從而在安裝別的一些依賴項時報錯,因此在屢次安裝出錯後,我總結出來以上的安裝順序,使得全部的依賴項和環境都可以正確的安裝和配置。
根據ZED SDK要求,Ubuntu 14最好使用CUDA7.5,所以從Nvidia官網上下載安裝文件以及安裝指南,而後執行如下步驟:
首先,作相關的安裝前電腦配置檢查,該部分具體內容請詳細參照CUDA 7.5安裝指南第二章。
而後,安裝CUDA runfile文件。因爲CUDA須要Nvidia驅動程序,且該程序不能與Ubuntu開源的 Nouveau共存,所以首先要關閉掉Nouveau。
lsmod | grep nouveau #檢測Nouveau是否開啓,有輸出則開啓,無輸出則爲開啓
#若Nouveau開啓,執行如下命令
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf #建立blacklist文件
# 在建立的文件中輸入如下內容關閉掉Nouveau
blacklist nouveau
options nouveau modeset=0
# 更新list,使得更改生效
sudo update-initramfs -u
一般在完成以上步驟後,更改並未當即生效,須要登出用戶或重啓電腦纔可生效。
當你從新進入電腦界面後發現分辨率下降,則表明blacklist多半設置成功,Nouveau已經被關閉,不過爲了確保萬無一失,請在輸入該命令確認狀態
lsmod | grep nouveau #檢測Nouveau是否開啓,有輸出則開啓,無輸出則爲開啓
確認無輸出後,按ctrl+alt+f1進入文本界面,輸入你的ID和密碼(在文本模式中請不要使用小鍵盤)。
而後請輸入如下命令:
sudo service lightdm stop
輸入後可俺ctrl+alt+f7看可否進入圖形界面,若不能則設置成功。而後從新進入文字界面,輸入如下命令安裝CUDA7.5與相關組件:
sudo sh cuda_7.5.18_linux.run
在安裝過程當中,能夠選則是否安裝顯卡驅動,CUDA toolkit以及OpenGL庫等,這個能夠自行選擇。須要注意OpenGL選擇請參照安裝指南所屬。
安裝完成後,查看顯示信息,若是顯示installed則安裝成功。輸入
sudo service lightdm start
回到圖形界面,輸入帳戶密碼,若是沒有出現循環登錄界面則說明CUDA7.5基本安裝成功。
最後一步,配置CUDA的環境,輸入:
export PATH=/usr/local/cuda-7.5/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64
而後輸入
cat /proc/driver/nvidia/version #檢查顯卡驅動版本
nvcc -V #檢查CUDA版本
若輸出無誤則表明CUDA安裝成功。因爲CUDA環境配置須要在每次開機後都進行設置,所以爲了簡便建議執行如下操做:
sudo gedit /etc/profile export PATH=/usr/local/cuda-7.5/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64
更多內容各位可參考CUDA安裝指南和博客:http://blog.csdn.net/masa_fish/article/details/51882183
2.7. ZED SDK安裝
根據自身軟件環境我選擇的是 'ZED_SDK_Linux_Ubuntu14_CUDA75_v1.1.0.run' 進行安裝。
命令以下:
chmod +x your_installation_file_name
./your_installation_file_name
而後就會進入SDK安裝了,安裝時最開始須要用戶按Q鍵確認license等信息才能安裝。安裝好後ZED存放於路徑/usr/local/zed/中,相關操做文件在/tool/中,在運行ZED SDK前請下載相機對應的 calibration file放入/setting/文件中。
2.8. ZED ROS Wrapper安裝
安裝好 SDK後就能夠安裝ZED和ROS配套的包了。
進入ZED ROS Wrapper的下載目錄地址輸入完成安裝:
cd ~/catkin_ws
catkin_make
source ./devel/setup.bash
在此過程當中,某些時候可能會出現Eigen中Eigen Core文件沒法找到的狀況,這是由於相關文件的軟連接出現了問題,使用如下命令修復一下就能夠了:
pkg-config --cflags eigen3 #檢測Eigen目錄路徑
sudo ln -s /usr/include/eigen3/Eigen /usr/local/include/Eigen #請根據檢測後的路徑進行更改
也可能出現報錯" On Ubuntu 14, change line 30 of CMakeLists.txt to CUDA 7.5",根據錯誤提示咱們只須要在ZED ROS Wrapper CMakeLists.txt文件的CUDA版本改成7.5就能夠了,該文件的路徑爲:zed_ros/catkin_ws/src/zed-ros-wrapper。
else() # Ubuntu Desktop SET(OCV_VERSION "3.1.0") SET(CUDA_VERSION "7.5") #更改版本號爲7.5 message("*** On Ubuntu 14, change line 30 of CMakeLists.txt to CUDA 7.5")
此過程當中還會出現OpenCV報錯,這是由於ZED ROS Wrapper所需求的OpenCV版本爲3.1,可是以前爲了使ORB-SLAM2適配ROS Indigo咱們將電腦的默認OpenCV版本設置爲了2.4.10。能夠經過如下命令查看電腦當前的OpenCV版本號。
pkg-config --modversion opencv
如今咱們電腦中默認的OpenCV版本爲2.4.10可是其中也安裝了3.1.0版本的,因此咱們能夠經過OpenCV多版本管理,使得在編譯ZED ROS Wrapper時使用OpenCV3.1.0。
2.9. OpenCV多版本管理
OpenCV的多版本管理能夠在CMake或Makefile下進行。因爲咱們是應用的ORB-SLAM2所以採用CMake下指定OpenCV版本的方式。
首先咱們進入OpenCV3.1.0的安裝目錄,在/build目錄中找到OpenCVConfig.cmake文件。該文件一般會指定CMake尋找OpenCV的路徑,如:
# ====================================================== # Include directories to add to the user project: # ====================================================== # Provide the include directories to the caller set(OpenCV_INCLUDE_DIRS "/home/li/software/opencv-3.1.0/build" "/home/li/software/opencv-3.1.0/include" "/home/li/software/opencv-3.1.0/include/opencv") # ====================================================== # Link directories to add to the user project: # ======================================================
要想使本身的工程調用該版本的OpenCV,只須要確保在被調用工程的CMakeLists.txt文件中將OpenCV_DIR指定爲上述路徑便可。在ZED ROS Wrapper中,咱們在CMakeLists.txt中加入以下語句:
# OpenCV多版本管理 set(OpenCV_DIR "/home/li/software/opencv-3.1.0/build") # 指定路徑 message (STATUS "This is opencv_dir" ${OpenCV_DIR}) # 打印確認路徑是否正確
完成更改後保存,從新執行2.9中的步驟就能夠成功完成ZED ROS Wrapper的安裝了。ZED ROS Wrapper更改後完整代碼以下:
cmake_minimum_required(VERSION 2.8.7) project(zed_wrapper) # if CMAKE_BUILD_TYPE is not specified, take 'Release' as default IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE Release) ENDIF(NOT CMAKE_BUILD_TYPE) find_package(ZED 1.1 REQUIRED) #If you have compilation issues, edit OCV_VERSION and CUDA_VERSION according to the following values : #ZED SDK 1.1.1 : (https://www.stereolabs.com/developers/#download_anchor) # TX1 Jetpack 2.3 : OpenCV 2.4, CUDA 8.0 # TX1 Jetpack < 2.3 : OpenCV 2.4, CUDA 7.0 # TK1 : OpenCV 2.4, CUDA 6.5 # Ubuntu 14 : OpenCV 3.1, CUDA 7.5 # Ubuntu 16 : OpenCV 3.1, CUDA 8.0 ##For Jetson, OpenCV4Tegra is based on OpenCV2.4 exec_program(uname ARGS -p OUTPUT_VARIABLE CMAKE_SYSTEM_NAME2) if ( CMAKE_SYSTEM_NAME2 MATCHES "aarch64" ) # Jetson TX1 SET(OCV_VERSION "2.4") SET(CUDA_VERSION "8.0") SET(CUDA_USE_STATIC_CUDA_RUNTIME OFF) elseif(CMAKE_SYSTEM_NAME2 MATCHES "armv7l" ) # Jetson TK1 SET(OCV_VERSION "2.4") SET(CUDA_VERSION "6.5") SET(CUDA_USE_STATIC_CUDA_RUNTIME OFF) else() # Ubuntu Desktop SET(OCV_VERSION "3.1.0") SET(CUDA_VERSION "7.5") message("*** On Ubuntu 14, change line 30 of CMakeLists.txt to CUDA 7.5") endif() # OpenCV多版本管理 set(OpenCV_DIR "/home/li/software/opencv-3.1.0/build") message (STATUS "This is opencv_dir" ${OpenCV_DIR}) find_package(OpenCV ${OCV_VERSION} COMPONENTS core highgui imgproc REQUIRED) find_package(CUDA ${CUDA_VERSION} REQUIRED) find_package(PCL REQUIRED) find_package(catkin REQUIRED COMPONENTS image_transport roscpp rosconsole sensor_msgs dynamic_reconfigure tf2_ros pcl_conversions nodelet ) generate_dynamic_reconfigure_options( cfg/Zed.cfg ) catkin_package( CATKIN_DEPENDS roscpp rosconsole sensor_msgs opencv image_transport dynamic_reconfigure tf2_ros pcl_conversions ) ############################################################################### # INCLUDES # Specify locations of header files. include_directories( ${catkin_INCLUDE_DIRS} ${CUDA_INCLUDE_DIRS} ${ZED_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${PCL_INCLUDE_DIRS} ) link_directories(${ZED_LIBRARY_DIR}) link_directories(${CUDA_LIBRARY_DIRS}) link_directories(${OpenCV_LIBRARY_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) ############################################################################### ############################################################################### # EXECUTABLE add_definitions(-std=c++11)# -m64) #-Wall) set(LINK_LIBRARIES ${catkin_LIBRARIES} ${ZED_LIBRARIES} ${CUDA_LIBRARIES} ${CUDA_nppi_LIBRARY} ${CUDA_npps_LIBRARY} ${OpenCV_LIBS} ${PCL_LIBRARIES}) add_library(ZEDWrapper src/zed_wrapper_nodelet.cpp) target_link_libraries(ZEDWrapper ${LINK_LIBRARIES}) add_dependencies(ZEDWrapper ${PROJECT_NAME}_gencfg) add_executable(zed_wrapper_node src/zed_wrapper_node.cpp) target_link_libraries(zed_wrapper_node ZEDWrapper ${LINK_LIBRARIES}) add_dependencies(zed_wrapper_node ${PROJECT_NAME}_gencfg) ############################################################################### #Add all files in subdirectories of the project in # a dummy_target so qtcreator have access to all files FILE(GLOB_RECURSE extra_files ${CMAKE_SOURCE_DIR}/*) add_custom_target(dummy_${PROJECT_NAME} SOURCES ${extra_files}) ############################################################################### # INSTALL install(TARGETS ZEDWrapper zed_wrapper_node ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) install(FILES nodelet_plugins.xml DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
2.10. ROS Topic更改
在完成以步驟後咱們仍須要更改ROS或ZED ROS Wrapper中topic的名稱才能使得ORB-SLAM2 ROS與ZED相機相配合。
根據ZED ROS Wrapper官網(http://www.stereolabs.com/blog/index.php/2015/09/07/use-your-zed-camera-with-ros/)中的信息,咱們能夠查詢到ZED ROS Wrapper所發佈的topic名稱。咱們能夠選擇更改ZED的相關文件使得其匹配ORB-SLAM2 ROS的topic名字,也能夠反過來更改更改ORB-SLAM2的topic名字。我選擇的是更改ORB-SLAM2 ROS所接收的Topic名稱。
ORB-SLAM2 ROS相關的Topic名稱在路徑ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/中的相關文件中(式例如截圖所示,ros_stereo_rect.cc爲我本身建立的)。
選擇你所想要更改的文件,並將其內容更改成以下所示:
message_filters::Subscriber<sensor_msgs::Image> left_sub(nh, "/zed/left/image_raw_color", 1); message_filters::Subscriber<sensor_msgs::Image> right_sub(nh, "/zed/right/image_raw_color", 1);
保存,並從新2.6中ROS部分從新編譯。而後分別運行ZED ROS Wrapper和ORB-SLAM2 ROS便可實現ORB-SLAM2實時使用ZED相機的輸入圖像進行運算的功能了。
2.11. ZED ROS Wrapper輸出的圖像相關內容的更改
ZED ROS Wrapper中輸出的圖像的像素,fps等參數都是咱們能夠自行更改的。只須要更改zed-ros-wrapper/launch/zed_camera.launch文件中的參數便可。該文件中各參數定義以下:
這樣咱們就能選擇與咱們本身編寫的ORB-SLAM2 setting file相匹配的輸入圖像了。
至此,ORB-SLAM2與ZED相關的配置與調試工做就基本所有完成,咱們能夠在ROS下進行實時的調試與測試,也能夠在非ORB狀況下經過ZED相機構建本身的數據集檢測ORB-SLAM2在不一樣狀況下的運行效果。
若是博客中內容有任何錯誤還望你們告知,祝各位配置順利。