本系列博客旨在記錄自己在學習百度無人駕駛開源框架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.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
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
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界面看到如下畫面:
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
,再次編譯,成功了。。。