本文介绍 本地编译Apollo Cyber系统

本地编译Apollo Cyber系统

This article was original written by Jin Tian, 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。