1. Apollo与编译环境
大家好,我是你们这门课的老朋友。今天咱们聊聊Apollo的编译环境搭建。说实话,我见过太多新手卡在这一步——环境没配好,后面全是坑。我自己刚接触Apollo时也踩过不少雷,所以这一章我会把关键点都掰开揉碎了讲清楚。
1.1 Apollo项目简介
Apollo是什么?简单说,它是一个开源的自动驾驶平台。百度在2017年把它开源出来,现在已经是全球最活跃的自动驾驶项目之一。我参与过几个基于Apollo的落地项目,说实话,它的模块化设计确实让人省心不少。
Apollo的核心特点有这些:
- 模块化架构:感知、规划、控制、定位等模块独立编译、独立运行
- Cyber RT框架:百度自研的实时通信框架,替代了早期的ROS
- 高精地图支持:HD Map是自动驾驶的基石
- 仿真平台:Dreamview让你在没车的情况下也能调试
你想想看,一个自动驾驶系统要处理多少数据?摄像头、激光雷达、毫米波雷达、GPS/IMU...这些传感器数据必须实时处理。Apollo用Cyber RT把这些数据流管理得井井有条。
重要提示:Apollo目前主要支持Ubuntu 18.04和20.04。我个人建议用Ubuntu 20.04,兼容性更好。Windows用户?嗯,老老实实装双系统或者虚拟机吧。
1.2 Cyber RT概述
Cyber RT是Apollo的通信中间件。说白了,它就是负责各个模块之间怎么说话、怎么传数据的。我刚开始用的时候觉得它跟ROS差不多,但深入用下来发现,Cyber RT在实时性和性能上确实更胜一筹。
Cyber RT的几个核心概念:
- Node:功能模块的基本单元,每个Node可以发布和订阅Topic
- Reader/Writer:读写数据的接口,类似ROS的Subscriber/Publisher
- Channel:数据传输通道,Topic就是Channel的名字
- Component:可复用的算法组件,可以动态加载
举个例子,感知模块检测到前方有行人,它会通过一个Channel把行人信息发出去。规划模块订阅了这个Channel,收到信息后重新规划路径。整个过程在毫秒级完成。
小技巧:调试Cyber RT时,可以用 cyber_monitor 命令查看所有活跃的Channel。我曾经靠这个工具定位过一个数据丢失的bug,省了整整两天时间。
1.3 Ubuntu环境准备
好,咱们开始动手。首先你得有一台装了Ubuntu的机器。我推荐用Ubuntu 20.04 LTS,64位版本。为什么?因为Apollo官方对20.04的支持最完善,而且Docker在20.04上跑得最稳。
安装Ubuntu的步骤我就不细说了,网上教程一大堆。但有几个关键点我得提醒你:
- 磁盘分区:至少留100GB给Ubuntu,Apollo源码加上编译产物很占空间
- 显卡驱动:如果你有NVIDIA显卡,记得装驱动。Apollo的感知模块需要GPU加速
- 网络配置:确保能稳定访问GitHub和Docker Hub,你懂的
安装完Ubuntu后,先更新一下系统:
sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential git curl wget
这些基础工具是必须的。我习惯把这一步叫做「打地基」,地基不稳后面全白搭。
注意:千万别用Ubuntu 22.04!Apollo目前对22.04的支持还不完善,我试过一次,编译时各种报错,折腾了两天才放弃。老老实实用20.04吧。
1.4 Docker安装与配置
Docker是Apollo编译环境的核心。为什么用Docker?因为Apollo的依赖太多了——Protobuf、Boost、Eigen、OpenCV、PCL...每个版本还有兼容性要求。用Docker可以一键搞定所有依赖,省心省力。
安装Docker的步骤:
- 卸载旧版本(如果有的话):
sudo apt remove docker docker-engine docker.io - 安装依赖:
sudo apt install apt-transport-https ca-certificates curl software-properties-common - 添加Docker官方GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - - 添加仓库:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" - 安装Docker:
sudo apt install docker-ce - 启动Docker:
sudo systemctl start docker - 设置开机自启:
sudo systemctl enable docker
安装完后,记得把当前用户加入docker组,这样就不用每次都用sudo了:
sudo usermod -aG docker $USER
然后退出登录再重新登录,或者直接重启一下。
避坑指南:我曾经因为忘记把用户加入docker组,结果每次编译都要sudo,权限问题搞得我头大。后来发现加个组就解决了,你说气不气人?
验证Docker是否安装成功:
docker --version
docker run hello-world
如果看到Hello World的提示,恭喜你,Docker装好了。
1.5 拉取Apollo镜像
Docker装好后,下一步就是拉取Apollo的编译镜像。Apollo官方提供了多个版本的镜像,我推荐用最新的dev镜像:
docker pull apolloauto/apollo:dev-latest
这个镜像包含了所有编译依赖,大概2-3GB。下载时间取决于你的网速,我建议找个网络好的时候搞。
拉取完成后,可以用这个命令启动容器:
docker run -it \
--name apollo_dev \
--net host \
--privileged \
-v /path/to/apollo:/apollo \
apolloauto/apollo:dev-latest \
/bin/bash
这里有几个参数我解释一下:
--name:给容器起个名字,方便管理--net host:使用主机网络,方便调试--privileged:赋予容器特权,访问硬件设备需要-v:挂载本地目录,把Apollo源码映射到容器里
关键点:-v参数一定要把Apollo源码目录挂载进去。我见过有人把源码下载到容器里,结果一退出容器源码就没了...嗯,血的教训。
1.6 知识体系总览
为了让你对整个编译环境有个直观认识,我画了一张图:
这张图把整个环境分成了四层。从下往上,每一层都依赖下一层。你想想看,如果硬件层没配好,Docker跑不起来;Docker跑不起来,Cyber RT就没法用;Cyber RT用不了,Apollo模块就编译不了。一环扣一环。
1.7 本章小结
这一章我们走了一遍Apollo编译环境的全流程。从项目简介到Cyber RT,从Ubuntu安装到Docker配置,每一步我都尽量把坑点指出来。说实话,环境搭建是最枯燥的部分,但也是最重要的部分。我见过太多人因为环境问题放弃Apollo,真的很可惜。
下一章我们会正式进入编译环节,到时候我会手把手教你编译第一个Apollo模块。嗯,先别急,先把今天的环境搞定再说。
课后作业:按照本章步骤,在你的机器上完成Docker安装并成功拉取Apollo镜像。遇到问题?很正常,先自己查查,实在搞不定我们下节课讨论。