ZED 相机 && ORB-SLAM2安装环境配置与ROS下的调试

      注: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

  • 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输出图像参数的更改

      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在不一样状况下的运行效果。

     若是博客中内容有任何错误还望你们告知,祝各位配置顺利。

相关文章
相关标签/搜索