注:1. 對某些地方進行了更新(紅色标注),以友善進行配置。
2. ZED ROS Wrapper官方github已經更新,根據描述新的Wrapper可能已經不适用與Ros Indigo了,如果大家想參照這份部落格進行安裝ZED ROS Wrapper,有可能會出現其他問題。ZED ROS Wrapper github位址:https://github.com/stereolabs/zed-ros-wrapper
最近想運用ZED相機在ROS系統上實時運作ORB-SLAM2,在環境配置的過程當中遇到了不少問題并且在網上都沒有比較系統的解決方法,是以将自己總結的步驟記錄下來,希望對大家有幫助。
本文将包括以下内容:
- OpenCV 2.4.10 與 3.1.0的安裝
- ORB-SLAM2的安裝與調試(ROS與非ROS)
- ROS Indigo的安裝
- CUDA7.5的安裝
- ZED SDK與ZED ROS Wrapper的安裝與調試
- OpenCV多版本管理
- ROS Topic名稱的更改
- ZED ROS Wrapper輸出圖像參數的更改
一、 配置環境與閱讀說明
Ubuntu14.04,ROS Indigo,Nvidia GTX 970。
在此需要說明一下,如果想在Ubuntu 14上進行相關配置請不要使用Nvidia GTX 1000系列顯示卡,因為1000系列顯示卡及其驅動會與某一些庫檔案沖突。
同時希望讀者按照我所列的安裝順序進行安裝,因為調換安裝順序可能會導緻某些依賴項或檔案産生沖突。該順序是我多次失敗後總結出來的,親測有用。
二、 配置與安裝步驟
2.1. OpenCV 3.1 安裝
為正常運作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在不同情況下的運作效果。
如果部落格中内容有任何錯誤還望大家告知,祝各位配置順利。
轉載于:https://www.cnblogs.com/leexiaoming/p/6576274.html