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