本地編譯Apollo Cyber系統

本文介紹 本地編譯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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章