segmap利用试点和局部结构变化实现大规模3D数据的实时处理,并且通过基于TensorFlow框架的神经网络模型识别环境地标语义,实现更高的定位精度与回环检测。本文主要功能为复现segmap,具体代码解析并不涉及。本次复现设备配置为:
Ubuntu 16.04
CPU:AMD R7 3700x
GPU:RTX 2070super
内存:16G
segmap具体文献与代码如下:
segmap代码:https://github.com/ethz-asl/segmap.git
segmap论文:SegMap: 3D Segment Mapping using Data-Driven Descriptors
如果一切顺利,segmap需进行一下步骤:
安装nvidia显卡驱动=>安装CUDA9.0+cudnn7=>安装ros=>安装bazel 0.10.1=>安装protobuf=3.5.0=>编译tensorflow==1.8(GPU&C++API)=>在工作空间下复制segmap=>编译tensorflow_ros_cpp程序包=>编译segmap代码=>成功rviz显示构建地图
若系统已经安装对应显卡驱动,则可忽略显卡安装流程!!!!!!!
1、驱动安装
依赖安装
sudo apt update
sudo apt-get install build-essential
sudo apt-get install cmake
显卡驱动没有安装按照右面教程进行安装-显卡驱动安装教程
NVIDIA显卡驱动下载地址
Ubuntu下驱动安装相较与Windows下有很大区别,需要禁用Ubuntu自带的nouveau驱动
sudo gedit /etc/modprobe.d/blacklist.conf
在最后一行添加
blacklist nouveau
options nouveau modeset=0 #禁用nouveau第三方驱动
之后执行
sudo apt-get remove --purge nvidia*
sudo update -initramfs -u # 更新内核
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
此时进入下载好的显卡驱动路径输入
sudo apt-get install nvidia-driver-xxx # 这里版本可以根据自己所下载的名称进行填写
安装完毕后
sudo apt-get install mesa-common-dev
sudo apt-get update
sudo apt-get upgrade
通过命令成功查询到NVIDIA驱动版本
nvidia-smi
出现下图证明驱动安装成功
通过驱动安装会一并安装对应cuda模块,但是不同驱动版本配套的CUDA并非一致,所以需要在命令行中输入 nvcc -V 确认设备内CUDA版本是否为9.0,若不一致需要再安装CUDA9.0进行segmap程序环境适配
通过下方链接进入NVIDIA官方CUDA下载网站
https://developer.nvidia.com/cuda-90-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=deblocal
下载完CUDA 9.0之后执行如下语句,运行.run文件
sudo sh cuda_9.0.176_384.81_linux.run
安装提示接着会有一系列选项,在是否安装Linux-x86_64 361.62驱动这个选项
这里必须输入“N”不安装否则, cuda后面的安装都会出错。后面的全部按照默认即可,安装完毕后,再声明一下环境变量,并将其写入到 ~/.bashrc 的尾部,终端输入:
echo 'export PATH=/usr/local/cuda-9.0/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
再更新一下环境变量
source ~/.bashrc
终端输入 nvcc -V后出现:
说明cuda安装成功。
最后测试cuda9.0,在终端执行以下命令:
cd ~/NVIDIA_CUDA-9.0_Samples/1_Utilities/deviceQuery
make
./deviceQuery
cuda9.0对应Cudnn7的下载地址:https://developer.nvidia.com/rdp/cudnn-archive
下载得到cudnn-9.0-linux-x64-v7.tgz,然后依次在命令行运行
tar -zxvf cudnn-9.0-linux-x64-v7.tgz
在解压后的cudnn文件夹下打开命令行终端,输入下方指令
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/ -d
sudo chmod a+r /usr/local/cuda/include/cudnn.h
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*
接着,重新在终端运行查看cudnn版本
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
注意!!!bazel用最新的版本会有问题!!!!这里使用0.10.1
我下载的是bazel-0.10.1-installer-linux-x86_64.sh,可以通过以下命令直接下载:
wget https://github.com/bazelbuild/bazel/releases
然后执行安装:
sudo ./bazel-0.10.1-installer-linux-x86_64.sh --user
注意!!!注意一定要添加 --user,否则没法安装
sudo gedit ~/.bashrc
在结尾添加
export PATH="$PATH:$HOME/bin"
然后在重载一下环境变量
source ~/.bashrc
protobuf的版本与tensorflow的版本紧密相关,如果版本不对应将导致TensorFlow编译报错。根据目前已知成功案例了解到Protobuf 3.5.0版本与tensorflow1.8适配最佳,故使用3.5.0版本,下载protobuf-cpp-3.5.0.tar.gz的网址为:
wget https://github.com/google/protobuf/releases
解压protobuf-cpp-3.5.0.tar.gz文件:
tar -zxvf protobuf-cpp-3.5.0.tar.gz
进入到Protobuf 3.5.0的解压后的文件目录,并进行编译
cd protobuf-3.5.0
sudo ./configure
sudo make
sudo make check
sudo make install
sudo ldconfig
%%%segmap官方安装指南中并没有要求Eigen的版本,但是tensorflow1.8可能依赖于指定版本%%%
Eigen包是一个C++端的矩阵运算库,这个库只要下载压缩包,安装过程与Protobuf类似,解压到某个路径下即可。我下载的版本是下载3.3.4,eigen压缩包下载网址为:
wget http://bitbucket.org/eigen/eigen/get/3.3.4.tar.bz2
解压eigen-eigen-2355b229ea4c.tar.gz文件:
tar -zxvf eigen-eigen-2355b229ea4c.tar.gz
文件夹重新命名为eigen3,放到某个路径下,安装就好:
cd eigen3
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo make install
此处需注意、此处需注意、此处需注意
由segmap官方README知ubuntu16.04 ubuntu18必须得通过bazel编译
创建虚拟环境并载入安装所需依赖
sudo apt-get install python-wstool doxygen python3-pip python3-dev python-virtualenv dh-autoreconf
virtualenv ~/segmappyenv
source ~/segmappyenv/bin/activate
pip install --upgrade pip
pip install catkin_pkg empy pyyaml
下载tensorflow1.8源码
git clone -b r1.8 https://github.com/tensorflow/tensorflow
然后cd到tensorflow文件下
./configure
选项中除了是否需要cuda支持选择Y,其他安装全部选择N,然后路径均为默认,若出现某路径不存在,可以通过输入正确地址进行替换。(bazel0.10.1默认用上面的cuda9.0/cudnn7.0)
configure创建完毕后,开始bazel编译
bazel build --config=opt --define framework_shared_object=false tensorflow:libtensorflow_cc.so
该过程编译时间较长,编译成功后会在tensorflow/bazel-bin/tensorflow/路径下生成libtensorflow_cc.so和libtensorflow_framework.so两个文件
执行下方代码完成工作空间创建与初始化
mkdir ~/segmap_ws
cd ~/segmap_ws
catkin init
catkin config --merge-devel
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
进入工作空间并下载segmap源码
cd src
git clone https://github.com/ethz-asl/segmap.git
使用wstool对源码对应依赖库进行下载
wstool init
wstool merge segmap/dependencies.rosinstall
wstool update
对tensorflow_ros_cpp程序包内的CMakeLists.txt内的tensorflow路径进行修改
set(TF_BAZEL_LIBRARY “CATKIN_DEVEL_PREFIX/…/libtensorflow_cc.so” CACHE STRING “Path to the bazel-compiled Tensorflow C++ library”)
set(TF_BAZEL_SRC_DIR “${CATKIN_DEVEL_PREFIX}/…/tensorflow-include-base” CACHE STRING “Path to the Tensorflow sources directory”)
修改为
set(TF_BAZEL_LIBRARY “/你的tensorflow路径/bazel-bin/tensorflow/libtensorflow_cc.so” CACHE STRING “Path to the bazel-compiled Tensorflow C++ library”)
set(TF_BAZEL_SRC_DIR “/你的tensorflow路径/” CACHE STRING “Path to the Tensorflow sources directory”)
开始编译
cd ~/segmap_ws
catkin build tensorflow_ros_cpp
出现下图即表示tensorflow_ros_cpp程序包编译完成
编译后只有1 succeed 31skiped不要疑虑就是这样的因为你只编译了一个catkin,完成后复制 ~/tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so 到 ~/segmap_ws/devel/lib中 不然容易出错!
开始进行segmap的源码编译
cd ~/segmap_ws
catkin build segmapper
由于segmap的metis_catkin、gtsam_catkin等工具库的附件下载地址为Github,catkin build会出现下方错误代码:
CMake Error at metis_src-stamp/download-metis_src.cmake:21 (message):
error: downloading
‘https://github.com/ethz-asl/thirdparty_library_binaries/raw/master/metis-5.1.0.tar.gz’
failed
status_code: 7
status_string: “Couldn’t connect to server”
log: Trying 192.30.255.113…
Connected to github.com (192.30.255.113) port 443 (#0)
该问题只需手动将对应的文件下载(上方的文件下载地址为:https://github.com/ethz-asl/thirdparty_library_binaries/raw/master/metis-5.1.0.tar.gz),并解压,重命名为metis_src,放到build/metis_catkin/metis_src-prefix/src/下,覆盖metis_src,并进入该工具库下的CMakeLists.txt中注释掉下面的代码
#set(METIS_URL https://github.com/ethz-asl/thirdparty_library_binaries/raw/master/metis-5.1.0.tar.gz)
…
#URL ${METIS_URL}
…
#URL ${METIS_URL}
其他工具包的类似报错处理方式类似
上方编译成功图片引用自该博文:https://www.cnblogs.com/chenlinchong/p/12576699.html
roslaunch cnn_kitti_loop_closure.launch 报错
[cnn_kitti_loop_closure.launch] is not a launch file name
The traceback for the exception was written to the log file
只需要执行下方代码即可解决
source ~/segmap_ws/devel/setup.bash
通过在segmapper/launch/kitti路径下将roslaunch文件的
arg name="bag_file" value="$(env HOME)/.segmap/kitti/2011_09_30_drive_18.bag"/> arg name="rviz_config_file" value="$(env HOME)/.segmap/kitti/kitti_loop_closure.rviz"/> arg name="cnn_model_path" value="$(env HOME)/.segmap/trained_models/segmap64/"/>
参数地址修改为你kitti数据集的安装地址(下载地址:http://robotics.ethz.ch/~asl-datasets/segmap/segmap_data/),然后输入下方指令
$ roslaunch segmapper cnn_kitti_loop_closure.launch
即可完成程序的运行,基于kitti数据集的segmap运行截图如下图
后续有其他运行问题以及报错将会继续更新于该篇文章。