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的步骤我就不细说了,网上教程一大堆。但有几个关键点我得提醒你:

  1. 磁盘分区:至少留100GB给Ubuntu,Apollo源码加上编译产物很占空间
  2. 显卡驱动:如果你有NVIDIA显卡,记得装驱动。Apollo的感知模块需要GPU加速
  3. 网络配置:确保能稳定访问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的步骤:

  1. 卸载旧版本(如果有的话):sudo apt remove docker docker-engine docker.io
  2. 安装依赖:sudo apt install apt-transport-https ca-certificates curl software-properties-common
  3. 添加Docker官方GPG密钥:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. 添加仓库:sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  5. 安装Docker:sudo apt install docker-ce
  6. 启动Docker:sudo systemctl start docker
  7. 设置开机自启: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 知识体系总览

为了让你对整个编译环境有个直观认识,我画了一张图:

Apollo编译环境知识体系 硬件层 Ubuntu 20.04 LTS | NVIDIA GPU | 100GB+磁盘 | 稳定网络 容器层 Docker Engine | apolloauto/apollo:dev-latest 镜像 通信层 Cyber RT | Node/Reader/Writer | Channel/Topic | Component 应用层 感知 | 规划 | 控制 | 定位 | 预测 | 高精地图 编译流程:拉取源码 → 启动Docker容器 → 进入容器 → 编译模块 核心命令:./apollo.sh build_opt | cyber_launch | cyber_monitor

这张图把整个环境分成了四层。从下往上,每一层都依赖下一层。你想想看,如果硬件层没配好,Docker跑不起来;Docker跑不起来,Cyber RT就没法用;Cyber RT用不了,Apollo模块就编译不了。一环扣一环。

1.7 本章小结

这一章我们走了一遍Apollo编译环境的全流程。从项目简介到Cyber RT,从Ubuntu安装到Docker配置,每一步我都尽量把坑点指出来。说实话,环境搭建是最枯燥的部分,但也是最重要的部分。我见过太多人因为环境问题放弃Apollo,真的很可惜。

下一章我们会正式进入编译环节,到时候我会手把手教你编译第一个Apollo模块。嗯,先别急,先把今天的环境搞定再说。

课后作业:按照本章步骤,在你的机器上完成Docker安装并成功拉取Apollo镜像。遇到问题?很正常,先自己查查,实在搞不定我们下节课讨论。