本系列部落格旨在記錄自己在學習百度無人駕駛開源架構Apollo的心得和體會,歡迎大家閱讀和點贊,并提出寶貴意見,大家互相學習,如需轉載,請注明出處,謝謝!
文章目錄
- 電腦組態說明
- Apollo 5.5編譯安裝步驟
-
- 1、顯示卡驅動和cuda安裝
- 2、docker-ce和nvidia-docker安裝[^1]
-
- 安裝步驟
- 測試
- 3、Apollo鏡像安裝
- 4、源碼編譯
-
- 開始編譯:
- 編譯報錯解決
- 編譯結果檔案存儲位置及清理
- 編譯cyber_visualizer方法
- 5、開始運作
-
- demo測試
- Apollo 5.0編譯安裝步驟
-
- 編譯cyber_visualizer
電腦組態說明
為了順利編譯和運作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.0和Apollo 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:
[email protected]_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.sh
中
Line367
原來是:
-e NVIDIA_DRIVER_CAPABILITIES=compute,video,utility \
加上
graphics
選項得到:
-e NVIDIA_DRIVER_CAPABILITIES=compute,video,graphics,utility \
2、修改
apollo.sh
腳本
Line123
原來是:
去掉其中的
except //modules/tools/visualizer/...
得到:
完成以上兩處修改後,再執行:
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源碼中有
WORKSPACE
和
WORKSPACE.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
就可以成功運作。
- Apollo 5.0 更新OS到Ubuntu 18環境部署 ↩︎