Apollo 5.0 源碼學習筆記(六) | Apollo 5.0與Apollo 5.5安裝及測試

本系列博客旨在記錄自己在學習百度無人駕駛開源框架Apollo的心得和體會,歡迎大家閱讀和點贊,並提出寶貴意見,大家相互學習,如需轉載,請註明出處,謝謝!

電腦配置說明

爲了順利編譯和運行Apollo 5.0和Apollo 5.5,主要對你電腦的內存和硬盤提出了需求。

官方建議的最小內存是6G,其實在編譯腳本apollo.sh裏檢查的最小內存是2G,也就是說如果你電腦的內存小於2G就不會編譯(應該不會有人拿2G內存的電腦來玩Apollo吧。。。),當然內存肯定是越大越好。 如果內存比較小,可以通過-j N減少並行編譯線程數來減少編譯時的資源佔用,但是編譯時間會變長。

另外就是硬盤存儲空間, 硬盤大約需要40G左右,當然也是越多越好。 佔用存儲空間的主要有以下幾個部分:
代碼:不算很大,1G多點;
Docker鏡像:這個比較大,默認佔用根分區,而且會根據更新次數,使用次數增加,增長會比較快;
編譯輸出:編譯後產生,大小相對固定(也比較大),佔用用戶主目錄空間,主要存儲在/home/<user_name>/.cache/bazel目錄下;

爲了讓大家有一個參考,下面我列出我成功編譯安裝Apollo 5.0Apollo 5.5的電腦配置:

  • 系統:Ubuntu 18.04
  • 內存:16G
  • 硬盤:128G SSD
  • 顯卡:Nvidia RTX 2070 Super 8G顯存
  • 顯卡驅動:430.50
  • cuda版本:10.1

Apollo 5.5編譯安裝步驟

1、顯卡驅動和cuda安裝

Apollo中感知模塊使用了深度學習,需要用到顯卡驅動和cuda庫,並且Apollo要求顯卡驅動版本在410以上,cuda版本在10.0以上。

此部分可以參考我的另一篇博客:Ubuntu18.04 RTX2070 顯卡驅動、Cuda、cudnn和Pytorch深度學習環境配置

我最終是安裝了430.50版本顯卡驅動和10.1版本的cuda,別忘了cudnn也要安裝。安裝完成後使用nvidia-smi測試:

$ nvidia-smi 
Sun May 10 15:57:14 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.50       Driver Version: 430.50       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 2070    Off  | 00000000:01:00.0  On |                  N/A |
|  0%   49C    P8    32W / 175W |   1353MiB /  7979MiB |      9%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1433      G   /usr/lib/xorg/Xorg                            24MiB |
|    0      1541      G   /usr/bin/gnome-shell                          83MiB |
|    0      2445      G   /usr/lib/xorg/Xorg                           469MiB |
|    0      2611      G   /usr/bin/gnome-shell                         568MiB |
+-----------------------------------------------------------------------------+

2、docker-ce和nvidia-docker安裝1

由於無人駕駛軟件系統的複雜性,Apollo項目從一開始就利用Docker作爲代碼運行的配置環境,你可以將Docker當做是一種輕量化的虛擬機。

虛擬機是幹什麼的?虛擬機可以讓你在Windows系統下像安裝Office等普通軟件一樣安裝Ubuntu等各種操作系統,這樣你就可以不用頭疼的裝雙系統就可以享受到同時使用多系統的快感。由於虛擬機是完全“虛擬”了一個全新的系統,包括硬件、軟件等層面的抽象,導致虛擬機的啓動、關閉都耗時較長。

而Docker則是另一種對系統的抽象,其提出了“容器”的思想,容器可以認爲是一種“沙盒”,在這個容器中配置的所有環境都只會影響和保存在該容器中,容器由鏡像創建而來,鏡像與容器的關係類似C++中類和對象的關係,鏡像可以創建多個容器,容器之間相互獨立,互不影響。

對於Apollo項目來說,你只需要知道Apollo創建了一系列鏡像,其中包含了所有用於編譯和運行Apollo代碼需要的配置環境,這樣你就只需要在你的電腦上安裝好Docker,然後下載Apollo提供的Docker鏡像,就相當於配置好了Apollo代碼編譯所需的環境,是不是很酸爽~

另外,因爲容器是一個獨立於系統的另一個環境,爲了能夠在Docker中也能夠使用GPU資源,我們還需要安裝nvidia-docker

安裝步驟

進入到下載好的apollo-5.5.0/docker/setup_host路徑下,執行:

bash install_docker.sh
bash install_nvidia_docker.sh

其中安裝nvidia-docker可能會有些警告,我沒管,後面好像也能用。

安裝完成後需要重啓下電腦,否則執行docker的一些命令需要加sudo

測試

終端輸入:

$docker -v
$nvidia-docker -v

得到類似結果(兩個命令結果相同):

Docker version 19.03.8, build afacb8b7f0

成功。

3、Apollo鏡像安裝

在安裝完Docker之後,如果你執行docker images你會發現此時Docker中還沒有安裝任何鏡像。所以接下來我們需要安裝Apollo 5.5所需的鏡像文件:

進入到Apollo源碼根目錄,運行:

bash docker/scripts/dev_start.sh     //啓動container

然後就是一段漫長的等待。。。,最好有一個比較穩定、速度較快的網絡,並且建議你參考網上給你的Docker配置一個阿里雲鏡像加速源,這樣下載速度會快很多。

成功之後會給出提示:

[INFO] Starting docker container "apollo_dev_zhanghm" ...
[WARNING] nvidia-docker is in deprecation!
[WARNING] Please install latest docker and nvidia-container-toolkit: https://github.com/NVIDIA/nvidia-docker/blob/master/README.md
++ local_volumes
++ set +x
+ nvidia-docker run -it -d --privileged --name apollo_dev_zhanghm --volumes-from apollo_map_volume-sunnyvale_big_loop_zhanghm --volumes-from apollo_map_volume-sunnyvale_loop_zhanghm --volumes-from apollo_map_volume-sunnyvale_with_two_offices_zhanghm --volumes-from apollo_map_volume-san_mateo_zhanghm --volumes-from apollo_yolo3d_volume_zhanghm --volumes-from apollo_localization_volume_zhanghm --volumes-from apollo_paddlepaddle_volume_zhanghm --volumes-from apollo_local_third_party_volume_zhanghm -e DISPLAY=:1 -e DOCKER_USER=zhanghm -e USER=zhanghm -e DOCKER_USER_ID=1000 -e DOCKER_GRP=zhanghm -e DOCKER_GRP_ID=1000 -e DOCKER_IMG=apolloauto/apollo:dev-18.04-x86_64-20191111_1530 -e USE_GPU=1 -e NVIDIA_VISIBLE_DEVICES=all -e NVIDIA_DRIVER_CAPABILITIES=compute,video,graphics,utility -v /home/zhanghm/Apollo_Auto/apollo-5.5.0:/apollo -v /home/zhanghm/.cache:/home/zhanghm/.cache -v /dev:/dev -v /media:/media -v /tmp/.X11-unix:/tmp/.X11-unix:rw -v /etc/localtime:/etc/localtime:ro -v /usr/src:/usr/src -v /lib/modules:/lib/modules --net host -w /apollo --add-host in_dev_docker:127.0.0.1 --add-host zhanghm-PC:127.0.0.1 --hostname in_dev_docker --shm-size 2G --pid=host -v /dev/null:/dev/raw1394 apolloauto/apollo:dev-18.04-x86_64-20191111_1530 /bin/bash
f9820e77c5a0d35858689f0b35f917ad55f9641b4884a47e25747c873c10b412
+ '[' 0 -ne 0 ']'
+ set +x
Adding group `zhanghm' (GID 1000) ...
Done.
Adding user `zhanghm' ...
Adding new user `zhanghm' (1000) with group `zhanghm' ...
The home directory `/home/zhanghm' already exists.  Not copying from `/etc/skel'.
[ OK ] Finished setting up Apollo docker environment. Now you can enter with: 
bash docker/scripts/dev_into.sh
[ OK ] Enjoy!

上述命令會首先下載所需要的所有鏡像文件,並啓動Docker鏡像容器,命令執行完成後,你可以運行docker ps查看此時正在運行的容器:

CONTAINER ID        IMAGE                                                            COMMAND             CREATED              STATUS              PORTS               NAMES
04b2298cc6a8        apolloauto/apollo:dev-18.04-x86_64-20191111_1530                 "/bin/bash"         13 seconds ago       Up 10 seconds                           apollo_dev_zhanghm
1a7d24011b9c        apolloauto/apollo:local_third_party_volume-x86_64-latest         "/bin/sh"           13 seconds ago       Up 13 seconds                           apollo_local_third_party_volume_zhanghm
199394af8180        apolloauto/apollo:paddlepaddle_volume-x86_64-2.0.0               "/bin/sh"           22 seconds ago       Up 17 seconds                           apollo_paddlepaddle_volume_zhanghm
c6496d4db13d        apolloauto/apollo:localization_volume-x86_64-latest              "/bin/sh"           28 seconds ago       Up 27 seconds                           apollo_localization_volume_zhanghm
4797035a3d03        apolloauto/apollo:yolo3d_volume-x86_64-latest                    "/bin/sh"           33 seconds ago       Up 31 seconds                           apollo_yolo3d_volume_zhanghm
25bb687d33e4        apolloauto/apollo:map_volume-san_mateo-latest                    "/bin/sh"           39 seconds ago       Up 37 seconds                           apollo_map_volume-san_mateo_zhanghm
62d7e6309445        apolloauto/apollo:map_volume-sunnyvale_with_two_offices-latest   "/bin/sh"           48 seconds ago       Up 44 seconds                           apollo_map_volume-sunnyvale_with_two_offices_zhanghm
dda6a5b7f5f7        apolloauto/apollo:map_volume-sunnyvale_loop-latest               "/bin/bash"         55 seconds ago       Up 51 seconds                           apollo_map_volume-sunnyvale_loop_zhanghm
7264dc9a05dd        apolloauto/apollo:map_volume-sunnyvale_big_loop-latest           "/bin/sh"           About a minute ago   Up 59 seconds                           apollo_map_volume-sunnyvale_big_loop_zhanghm

參考:
Unbun16.04+Apolo5.0安裝編譯

4、源碼編譯

終於配置好環境到了關鍵的源碼編譯環節了,這也是最容易出各種錯誤的步驟。

首先我們需要啓動容器:

bash docker/scripts/dev_start.sh     //啓動container

然後進入到容器中:

bash docker/scripts/dev_into.sh      //進入container

此時你的終端路徑會發生變化:
在這裏插入圖片描述
這就表明你已經在容器環境內了,該容器掛載了你的源碼路徑在容器中的/apollo路徑下,所以你可以在主機中修改源碼,在容器環境中對源碼進行編譯。

開始編譯:

確保你已經在容器中,此時執行以下命令開始編譯:

bash apollo.sh build    (要求電腦配置比較高)
或  bash apollo.sh build --local_resources 2048,1.0,1.0(我用的是這個,怕自己電腦編譯卡死)

編譯報錯解決

錯誤1:

zhanghm@in_dev_docker:/apollo$ bash apollo.sh build --local_resources 2048,1.0,1.0
System check passed. Build continue ...
[WARNING] ESD CAN library supplied by ESD Electronics does not exist. If you need ESD CAN, please refer to third_party/can_card_library/esd_can/README.md.
Running build under GPU mode. GPU is required to run the build.
[INFO] Start building, please wait ...
INFO: Reading 'startup' options from /apollo/tools/bazel.rc: --batch_cpu_scheduling --host_jvm_args=-XX:-UseParallelGC
Extracting Bazel installation...
......
____Loading package: modules/perception/fusion/lib/data_fusion/shape_fusion/pbf_shape_fusion
____Loading package: modules/drivers/tools/image_decompress/proto
____Loading package: modules/planning/common/trajectory1d
____Loading package: modules/perception/camera/common/proto
____Loading package: modules/transform
____Loading package: modules/perception/camera/lib/obstacle/postprocessor/location_refiner
____Loading package: modules/perception/common/i_lib/algorithm
____Loading package: modules/planning/tasks/deciders/path_assessment_decider
____Loading package: modules/localization/msf/common/util
____Loading package: cyber/timer
____Loading package: cyber/node
[INFO] Building on x86_64...
[INFO] Building with --jobs=12 --ram_utilization_factor 80 for x86_64
INFO: Reading 'startup' options from /apollo/tools/bazel.rc: --batch_cpu_scheduling --host_jvm_args=-XX:-UseParallelGC
ERROR: (04-27 14:09:50.221) /apollo/modules/planning/tasks/deciders/rss_decider/BUILD:5:1: no such package '@ad_rss_lib//': Error cloning repository: Premature EOF caused by Premature EOF caused by Premature EOF and referenced by '//modules/planning/tasks/deciders/rss_decider:rss_decider'.
ERROR: (04-27 14:09:50.310) Analysis of target '//modules/planning:libplanning_component.so' failed; build aborted.
INFO: (04-27 14:09:50.311) Elapsed time: 3298.412s
============================
[ERROR] Build failed!
[INFO] Took 3305 seconds
============================

解決方案:
網絡良好的時候再次編譯,或參考:
https://blog.csdn.net/lo_bamboo/article/details/105214674
https://github.com/ApolloAuto/apollo/issues/9219

錯誤2:

ERROR: (05-12 13:30:49.332) /home/zhanghm/.cache/bazel/_bazel_zhanghm/540135163923dd7d5820f3ee4b306b32/external/com_github_grpc_grpc/BUILD:388:1: C++ compilation of rule '@com_github_grpc_grpc//:grpc_plugin_support' failed (Exit 1).
In file included from external/com_github_grpc_grpc/src/compiler/php_generator.cc:24:0:
external/com_github_grpc_grpc/src/compiler/php_generator_helpers.h: In function 'grpc::string grpc_php_generator::GetPHPServiceFilename(const FileDescriptor*, const ServiceDescriptor*, const string&)':
external/com_github_grpc_grpc/src/compiler/php_generator_helpers.h:51:23: error: 'const class google::protobuf::FileOptions' has no member named 'has_php_namespace'
   if (file->options().has_php_namespace()) {
                       ^
external/com_github_grpc_grpc/src/compiler/php_generator_helpers.h:52:39: error: 'const class google::protobuf::FileOptions' has no member named 'php_namespace'
     oss << ReplaceAll(file->options().php_namespace(), "\\", "/");
                                       ^
external/com_github_grpc_grpc/src/compiler/php_generator.cc: At global scope:
external/com_github_grpc_grpc/src/compiler/php_generator.cc:26:40: error: 'google::protobuf::compiler::php::GeneratedClassName' has not been declared
 using google::protobuf::compiler::php::GeneratedClassName;
                                        ^
external/com_github_grpc_grpc/src/compiler/php_generator.cc: In function 'grpc::string grpc_php_generator::{anonymous}::PackageName(const FileDescriptor*)':
external/com_github_grpc_grpc/src/compiler/php_generator.cc:49:23: error: 'const class google::protobuf::FileOptions' has no member named 'has_php_namespace'
   if (file->options().has_php_namespace()) {
                       ^
external/com_github_grpc_grpc/src/compiler/php_generator.cc:50:28: error: 'const class google::protobuf::FileOptions' has no member named 'php_namespace'
     return file->options().php_namespace();
                            ^
external/com_github_grpc_grpc/src/compiler/php_generator.cc: In function 'void grpc_php_generator::{anonymous}::PrintMethod(const MethodDescriptor*, grpc::protobuf::io::Printer*)':
external/com_github_grpc_grpc/src/compiler/php_generator.cc:74:58: error: 'GeneratedClassName' was not declared in this scope
       MessageIdentifierName(GeneratedClassName(input_type), input_type->file());
                                                          ^
external/com_github_grpc_grpc/src/compiler/php_generator.cc: In function 'grpc::string grpc_php_generator::{anonymous}::PackageName(const FileDescriptor*)':
external/com_github_grpc_grpc/src/compiler/php_generator.cc:54:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
INFO: (05-12 13:30:49.752) Elapsed time: 5.793s, Critical Path: 0.62s
============================
[ERROR] Build failed!
[INFO] Took 5 seconds
============================

解決方案:
刪除掉編譯產生的緩存文件(docker中):

sudo rm -rf /home/<username>/.cache

錯誤3:
提示ad-rss-lib庫下載不下來,或者ad-rss-lib庫下載很慢,或者其他與這個庫相關的問題。

解決方案:
自己下載好這個庫,下載地址,下載之後解壓縮放在Apollo代碼庫下的tmp目錄下(自己新建一個);
然後修改Apollo代碼庫中的WORKSPACE.in,將原來的:

#ad-rss-lib
#new_git_repository(
#    name = "ad_rss_lib",
#   build_file = "third_party/rss_lib.BUILD",
#    tag = "v1.1.0",
#   remote = "https://github.com/intel/ad-rss-lib",
#)

註釋掉,然後加上:

new_local_repository(
    name = "ad_rss_lib",
    build_file = "third_party/rss_lib.BUILD",
    path = "/apollo/tmp/ad-rss-lib-1.1.0",
)

其中path路徑指向的是你解壓之後的ad-rss-lib-1.1.0文件夾路徑。

編譯結果文件存儲位置及清理

編譯產生的結果模塊存儲在$HOME/.cache/bazel路徑下。

如果你想清理編譯產生的文件,方法是在docker終端內執行:

bash apollo.sh cyber_clean

編譯cyber_visualizer方法

cyber_visualizer定義在modules/tool/visualizer路徑下,其是用Qt編寫的一個類似ROS下的RViz的可視化界面,但還沒有RViz那麼強大,目前只可以用來訂閱點雲和圖像消息,並進行可視化,其整體界面如下圖所示:
在這裏插入圖片描述
Apollo 5.5默認沒有編譯cyber_visualizer,因此需要對源碼做一些修改才使其能夠成功編譯:
1、修改docker/scripts/dev_start.shLine367
原來是:

-e NVIDIA_DRIVER_CAPABILITIES=compute,video,utility \

加上graphics選項得到:

-e NVIDIA_DRIVER_CAPABILITIES=compute,video,graphics,utility \

2、修改apollo.sh腳本Line123
原來是:

BUILD_TARGETS=`bazel query //modules/... union //cyber/... except //modules/tools/visualizer/... except //modules/v2x/... except //modules/map/tools/map_datachecker/... $DISABLE_CYBER_MODULES`

去掉其中的except //modules/tools/visualizer/...得到:

BUILD_TARGETS=`bazel query //modules/... union //cyber/... except //modules/v2x/... except //modules/map/tools/map_datachecker/... $DISABLE_CYBER_MODULES`

完成以上兩處修改後,再執行:

bash docker/scripts/dev_start.sh     //啓動container
bash docker/scripts/dev_into.sh      //進入container

進入到容器中,進行第三步:
3、安裝一些qt5-default依賴

sudo apt-get update #如果有些報錯沒關係,只要下一步的qt5-default能安裝上就行
sudo apt-get install qt5-default

4、重新編譯Apollo 5.5

bash apollo.sh build

如果你之前已經編譯過,現在是新增加編譯cyber_visualizer,編譯並不會耗時很長的。

編譯成功後,在容器中就可以執行cyber_visualizer打開上面的界面了。

此時如果你播包:

cyber_recorder play -f apollo_2.0_camera_sample.record -l

cyber_visualizer界面上點擊Show PointCloud,選擇對應的ChannelName,點擊Play,就可以成功看到最終的點雲了。
在這裏插入圖片描述
注意上述播放的包並不是Apollo官方提供的record數據包,官方提供的demo_3.5.record中並沒有點雲數據,這是我用Apollo 5.0的modules/data/tools下的rosbag_to_record工具對Apollo 2.0中提供的apollo_2.0_camera_sample.bag進行轉換得到的,大家可以直接從我的百度雲盤下載轉換後的數據包:
鏈接: https://pan.baidu.com/s/17S6mqFq8CMN-o6K3NsoiQg
提取碼: 7wxf

該數據包裏包含的所有話題爲:
在這裏插入圖片描述
參考:
[1] 編譯cyber_visualizer

5、開始運行

如果你是按照以上的步驟到這一步的,你只需要在Apollo源碼根目錄下執行:

bash scripts/bootstrap.sh

如果你已經編譯運行過Apollo代碼了,以後每次想要運行,只需要在Apollo源碼根目錄下依次執行:

bash docker/scripts/dev_start.sh     //啓動container
bash docker/scripts/dev_into.sh      //進入container
bash scripts/bootstrap.sh

其中bash docker/scripts/dev_start.sh命令會依次檢查是否安裝了所需的鏡像,所以可能需要幾分鐘的時間,請耐心等待。

然後在瀏覽器中輸入以下鏈接打開Dreawview界面:
http://localhost:8888/

此時你就能看到這個畫面:
在這裏插入圖片描述
恭喜你,運行成功。

demo測試

Apollo 5.5提供了離線測試數據包,你可以從該地址下載demo_3.5.record`文件,即Apollo 5.5的離線測試數據和Apollo 3.5是一樣的。

下載完成後將其複製到apollo-5.5.0/data/bag路徑下(或者你自己想要的路徑),然後在Docker容器中執行:

cyber_recorder play -f data/bag/demo_3.5.record -l

此時你就能在Dreawview界面看到如下畫面:
在這裏插入圖片描述
參考:
How to Launch and Run Apollo

Apollo 5.0編譯安裝步驟

我是先編譯安裝的Apollo 5.5,後面因爲一些特殊的需要,又安裝編譯了Apollo 5.0,大體上步驟差不多,所以你基本上可以參考上述的Apollo 5.5編譯安裝步驟進行。

但在運行bash apollo.sh build --local_resources 2048,1.0,1.0出現了以下錯誤:

The 'build' command is only supported from within a workspace.

從網上找了一圈,都沒找到解決方法,最後我看了一下Apollo 5.5源碼中有WORKSPACEWORKSPACE.in兩個文件,而Apollo 5.0中卻只有WORKSPACE.in一個文件,所以我就複製了一下Apollo 5.0中的WORKSPACE.in文件,修改名爲WORKSPACE,再次編譯,成功了。。。

編譯cyber_visualizer

Apollo 5.0中默認就會編譯cyber_visualizer,但是當你運行cyber_visualizer可能會出現如下的錯誤:

Could not initialize GLX
Aborted (core dumped)

目前找到的解決方案是:
在容器中執行:

unset LD_PRELOAD

就可以成功運行。


  1. Apollo 5.0 升級OS到Ubuntu 18環境部署 ↩︎

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