本文介绍 本地编译Apollo Cyber系统
本地编译Apollo Cyber系统
This article was original written by XRBLS, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat:
jintianiloveu
我们在玩Apollo的时候,其实大多数时候并不需要其他的模块,可能只需要一个Cyber,那么其实可以比较简单的编译cyber的。这篇教程就是教大家如果不用docker换来换去,直接在本地编译Cyber。它有什么用呢?
- 当你需要尝试,仅仅只是想使用cyber左右一个分布式的机器人操作系统的时候有用;
- 当你只是想Parse Cyber录制的包的时候有用。
那么,开始吧。(另外笔者不太喜欢用bazel,不知道是否有大佬用cmake维护cyber的,有的话可以分享一下。有时候将cyber当成一个库来用可能更方便一些。)
## 先来一个简单版本
我们暂时不修改任何apollo的源代码,我们仅仅使本地的依赖满足apollo的要求。首先需要将apollo的一些本地依赖拷贝到本机:
docker cp 4f2f73aafd1d:/home/tmp /home/tmp
其中4f2f....
是你的docker container的ID,把里面的文件拷贝到你本机。为什么这么做呢?因为你会发现apollo的bazel WORKSPACE里面引用的是本地文件依赖,比如:
http_archive (
name = "gtest",
build_file = "gtest.BUILD",
sha256 = "58a6f4277ca2bc8565222b3bbd58a177609e9c488e8a72649359ba51450db7d8",
strip_prefix = "googletest-release-1.8.0",
url = "file:///home/tmp/gtest.tar.gz",
)
这个时候如果你直接用:
bazel build cyber:cyber
去build cyber系统的时候,会找不到依赖的,因此我们直接将docker里面的文件拷贝到本机对饮的路径即可。至于为什么apollo要使用本地依赖而不是直接用url,不得而知,有人知道的可以留言。。。
然后就是一个可能需要的依赖,比如protobuf,google test, glog等等,这些大家应该本机都自带了把,毕竟搞DL和C++机器没有这些库不科学,当然也有PCL1.9之类的库。大家自行安装。
比较可能没有的是这么一些库。
-
Fast RTPS: 这个是一个开源的C++的publish-subscribe的通讯库,没想到啊,apollo居然也依赖于这么一个库,说好的完全自主开发的呢?不过话说回来,好像ROS2用的也是这个库。
开源地址:
https://github.com/eProsima/Fast-RTPS.git
这个库很重要,但是也是大坑,要安装它,需要安装asio,tinyxml2等依赖,当然还有foonathan memory这个库:
sudo apt install libasio-dev libtinyxml2-dev # install foonathan_memory git clone https://github.com/foonathan/memory.git cd memory git submodule update --init --recursive cmake -DCMAKE_BUILD_TYPE="buildtype" -DFOONATHAN_MEMORY_BUILD_EXAMPLES=OFF -DFOONATHAN_MEMORY_BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=/usr/local . cmake --build . -- install # install Fast-RTPS source https://github.com/eProsima/Fast-RTPS.git cd Fast-RTPS git submodule update --init --recursive
总的来说,还是比较难安装的,但请注意,这个就是一个比较核心的库了,ROS2里面用的也是它,因此假如你要从源码编译ROS2的话,那么也得用这个库。
上面cmake foonathan_memory这个库好像… 似乎…要FQ才能下载一些依赖的东西。
note: 这一步的最终目的是要编译安装fastrtps库,但是它的依赖比较难搞,尤其是memory那个哭,它默认编译的是静态链接库,所以你得在源码的CMakeLists里面改一下,改成动态,否则无法编译fastrtps的动态库。
-
libtf2.so: 这个是ros的库,其实你可以通过安装ros来安装libtf2.so,但更简单的方法是通过apt来安装这个单独的依赖:
sudo apt install libtf2-dev
但是有个问题,通过apt安装的tf2默认是在
/usr/include
而Apollo里面的写的是/usr/local/include
将其改为我们安装的位置。注意,连带third_party/tf2.BUILD
。也要修改.
通过上面的步骤之后,基本上就没有依赖问题了,可以开始编译cyber。记得修改一下zlib:
cc_library(
name = "zlib",
# srcs = [
# "lib/libz.so",
# "lib/libz.so.1",
# ],
linkopts = [
"-L/usr/lib/x86_64-linux-gnu",
"-lz",
],
)
apollo里面配置的路径跟通常情况zlib的位置不一致,本地无法找到zlib,修改一下即可找到。
进一步debug
编译cyber开始之后呢,由于我们的fastrtps的版本可能存在不一致的情况。 出现了一个error。