全流程Segmap编译复现指南(Ubuntu16.04+cuda9.0+Cudnn7)

一、介绍

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

出现下图证明驱动安装成功

四、CUDA9.0与对应Cudnn7安装

通过驱动安装会一并安装对应cuda模块,但是不同驱动版本配套的CUDA并非一致,所以需要在命令行中输入 nvcc -V 确认设备内CUDA版本是否为9.0,若不一致需要再安装CUDA9.0进行segmap程序环境适配

1、CUDA9.0下载

通过下方链接进入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

输出Result = PASS 表示安装成功。
在这里插入图片描述

2、安装Cudnn7

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安装

注意!!!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 3.5.0

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

6.1 编译Eigen 3.3.4

%%%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

七、编译Tensorflow1.8 GPU&C++

此处需注意、此处需注意、此处需注意
由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程序包

对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代码

开始进行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运行截图如下图
在这里插入图片描述

十一、附录

后续有其他运行问题以及报错将会继续更新于该篇文章。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值