【实战】Apollo10.0环境配置与Docker部署全解析

📅 发布时间:2026/7/14 8:50:13 👁️ 浏览次数:
【实战】Apollo10.0环境配置与Docker部署全解析
1. 为什么选择Apollo 10.0与Docker部署如果你对自动驾驶开发感兴趣或者你的项目正需要一套成熟、开源的自动驾驶框架来搭建原型或进行算法验证那么Apollo 10.0绝对是一个绕不开的选择。我接触Apollo有好几年了从早期的版本一路跟过来感觉10.0版本在工程化和易用性上确实迈出了一大步。特别是它开始明确支持Docker容器化部署这解决了很多开发者尤其是新手在环境配置上“从入门到放弃”的痛点。回想以前配置Apollo环境那真是一场“噩梦”。你需要手动安装一堆特定版本的依赖库处理各种编译工具链的冲突还得确保CUDA、TensorRT这些深度学习组件的版本完全匹配。一个环节出错可能就是几个小时甚至一天的排查。现在好了Apollo 10.0通过Docker和全新的环境管理工具aem把整个运行环境打包成了一个标准化的“盒子”。你只需要在宿主机上装好Docker和基础的显卡驱动剩下的所有复杂环境包括特定版本的ROSApollo用的是其自研的Cyber RT、编译工具、Python环境、CUDA库等等全都封装在容器里。这意味着无论你的开发机是Ubuntu 18.04、20.04还是22.04只要Docker能跑起来你得到的Apollo开发环境就是完全一致的极大降低了环境不一致带来的协作和部署成本。对于学习者来说Docker部署让你能快速跳过多达数十个繁琐的配置步骤直接进入核心的自动驾驶模块学习和实践比如感知、规划、控制。对于团队开发者它保证了开发、测试和生产环境的高度一致性避免了“在我机器上好好的”这类经典问题。所以无论你是自动驾驶领域的新手想快速上手体验还是有一定经验的开发者希望搭建一个稳定、可复现的研发环境采用Docker方式来部署Apollo 10.0都是目前最推荐、最“省心”的路径。接下来我就带你一步步走通这个流程分享我实际操作中积累的经验和踩过的坑。2. 部署前的核心准备系统与硬件在真正动手敲命令之前花几分钟时间确认一下你的“地基”是否牢固能避免后面绝大部分的麻烦。这部分虽然看起来基础但非常重要。2.1 操作系统选择与配置Apollo官方明确支持Ubuntu系统。对于Docker部署方式你的选择比较灵活x86_64架构的机器可以选择Ubuntu 18.04、20.04或22.04如果是ARM架构比如一些国产芯片平台或NVIDIA Jetson系列则建议使用Ubuntu 20.04。我个人实测下来Ubuntu 22.04 LTS是目前最稳妥的选择它对新型硬件的兼容性更好社区支持也最活跃。安装完系统后第一件事不是急着装Apollo而是做系统更新。打开终端执行下面这两条命令sudo apt-get update sudo apt-get upgrade这个过程可能会花费一些时间取决于你的网络速度和更新包的数量。这里有个小坑upgrade命令可能会更新内核。如果更新了内核强烈建议重启一次系统确保新内核生效避免后续安装显卡驱动时出现内核模块不匹配的问题。另外请务必保证你的网络连接畅通最好能直接连接或者配置好可用的软件源镜像否则apt-get命令会非常慢甚至失败。2.2 Docker引擎的安装与验证既然我们选择Docker部署那么Docker引擎就是必须的。Apollo要求Docker版本在19.03以上。安装Docker本身不难但方法要对。我强烈推荐使用官方提供的一键安装脚本省心又不容易出错。首先我们下载并运行Apollo社区维护的安装脚本wget http://apollo-pkg-beta.bj.bcebos.com/docker_install.sh bash docker_install.sh运行这个脚本时你可能会被提示输入用户密码并且脚本可能会执行多次。这是正常的因为它会添加Docker的官方GPG密钥和软件源然后执行安装和后续配置。你只需要根据终端提示操作即可。安装完成后我们需要验证Docker是否安装成功并且配置是否正确。执行以下命令sudo docker run hello-world如果看到一串“Hello from Docker!”的欢迎信息说明Docker引擎已经安装并可以正常运行了。接下来还有一个非常重要但容易被忽略的步骤将你的当前用户添加到docker用户组。这是因为默认情况下只有root用户和docker组的用户才能执行Docker命令每次都要加sudo很麻烦。sudo usermod -aG docker $USER执行完这条命令后你必须完全退出当前终端会话关闭所有终端窗口然后重新登录系统这个组权限变更才会生效。重新登录后你再运行docker ps命令就不需要加sudo了这会为后续操作带来极大的便利。3. 为Apollo注入“动力”GPU支持配置详解如果你只想运行Apollo的基础框架或一些纯CPU的模块那么跳过本章节也可以。但自动驾驶的核心模块如感知Perception严重依赖GPU进行深度学习模型的推理。要让Docker容器内的Apollo也能“看见”并使用宿主机的GPU我们需要完成一些额外的配置。这个过程我称之为给容器“插上显卡”。3.1 宿主机NVIDIA驱动安装首先确保你的宿主机也就是你的Ubuntu电脑或服务器已经安装了正确版本的NVIDIA显卡驱动。打开终端输入nvidia-smi如果这个命令能正常输出一张表格显示了你的GPU型号、驱动版本、CUDA版本等信息那么恭喜你可以跳过这一步。如果报错“command not found”那就需要安装驱动。安装驱动有几种方法我推荐使用Ubuntu的apt仓库来安装相对最稳定。首先添加NVIDIA的官方PPA仓库sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update然后你可以使用ubuntu-drivers工具来查看推荐安装的驱动版本ubuntu-drivers devices它会列出兼容你显卡的驱动版本并标出一个推荐版本。例如输出可能包含“recommended: nvidia-driver-550”。我们就安装这个推荐的版本sudo apt install nvidia-driver-550安装过程较长完成后必须重启计算机。重启后再次运行nvidia-smi你应该就能看到熟悉的GPU信息表了。请务必记录下这里显示的Driver Version和CUDA Version。Apollo 10.0要求CUDA版本至少为11.8因此对应的驱动版本不能太低。官方推荐使用520.61.05以上版本的驱动。3.2 安装NVIDIA Container Toolkit这是关键一步Docker本身并不知道如何使用GPU。NVIDIA Container Toolkit以前叫nvidia-docker2是一组工具它让Docker运行时能够创建支持GPU的容器。安装命令如下curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed s#deb https://#deb [signed-by/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit这几条命令做了几件事添加NVIDIA的GPG密钥、添加软件源、更新列表最后安装工具包。安装完成后我们需要配置Docker让它使用NVIDIA作为默认的容器运行时之一sudo nvidia-ctk runtime configure --runtimedocker配置完成后重启Docker服务让配置生效sudo systemctl restart docker现在我们可以做一个终极测试验证Docker容器是否能调用GPUdocker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi这条命令会拉取一个带有CUDA 11.8的基础Ubuntu镜像并在容器内运行nvidia-smi。如果容器内输出的GPU信息与宿主机上nvidia-smi的输出完全一致那么恭喜你Docker的GPU支持已经完美配置好了这意味着Apollo容器也能无缝使用你的显卡了。4. 安装Apollo环境管理工具aemApollo 10.0引入了一个全新的命令行工具Apollo Environment Manager (aem)。你可以把它理解为Apollo项目的“管家”或“启动器”。它的核心职责是管理不同的Apollo工程环境容器负责构建、启动、进入和停止容器大大简化了我们的操作。安装它只需要几步。首先安装aem所需的一些基础依赖sudo apt-get update sudo apt-get install ca-certificates curl gnupg接下来我们需要将Apollo官方的软件源添加到系统的APT源列表中。这就像给你的Ubuntu系统添加一个“应用商店”里面专门存放Apollo相关的工具。执行下面这一串命令这是一条完整的命令建议复制粘贴sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://apollo-pkg-beta.cdn.bcebos.com/neo/beta/key/deb.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/apolloauto.gpg sudo chmod ar /etc/apt/keyrings/apolloauto.gpg echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/apolloauto.gpg] https://apollo-pkg-beta.cdn.bcebos.com/apollo/core $(. /etc/os-release echo $VERSION_CODENAME) main | sudo tee /etc/apt/sources.list.d/apolloauto.list sudo apt-get update这几行命令的作用是创建密钥目录、下载并导入Apollo源的GPG公钥用于验证软件包完整性、将Apollo软件源地址写入系统源列表最后更新软件包列表。最后安装aem工具本身sudo apt install apollo-neo-env-manager-dev --reinstall安装完成后你可以在终端输入aem -h来查看帮助信息。如果能看到一长串的命令说明比如start,enter,stop,remove等说明aem已经成功安装到你的系统里了。这个工具是我们后续所有操作的入口非常关键。5. 创建并启动你的第一个Apollo工程环境准备好了工具也装好了现在让我们真正创建一个Apollo项目并让它跑起来。Apollo官方提供了几个“示例工程”模板相当于不同口味的“预制菜”方便我们快速开始。5.1 选择与克隆示例工程官方主要提供了三个模板application-core: 这是“全家桶”版本包含了Apollo所有开源软件包。如果你想完整地体验或开发整个自动驾驶栈就选这个。application-pnc: 只包含规划与控制Planning Control相关的软件包。如果你只关心车辆如何决策和行驶这个更轻量。application-perception: 只包含感知Perception相关的软件包。如果你专注于摄像头、激光雷达的物体识别这个最合适。对于第一次接触的朋友我无脑推荐application-core。我们通过Git来克隆这个工程到本地git clone https://github.com/ApolloAuto/application-core.git cd application-core这个application-core目录就是你未来工作的“项目根目录”所有操作都在这里进行。5.2 启动Apollo Docker开发环境进入工程目录后我们首先运行一个环境初始化脚本bash setup.sh这个setup.sh脚本会自动检测你宿主机的环境比如是x86还是ARM有没有GPU并生成对应的Docker容器配置文件。这是一个很贴心的自动化步骤。接下来就是启动容器的核心命令aem start当你第一次运行这个命令时它会根据配置去拉取一个非常大的Docker镜像可能超过10GB里面包含了完整的Apollo开发环境。这个过程需要较长时间取决于你的网速。请务必保持网络稳定。镜像拉取完成后aem会自动创建并启动一个容器。如果你想使用纯主机模式不使用Docker可以运行aem start -b host但这要求你的宿主机环境已经手动配置好了所有Apollo依赖对新手不友好我们这里不展开。启动成功后你可以使用以下命令进入容器的bash终端aem enter你会发现命令提示符变了说明你已经进入了Apollo的Docker容器内部。这里就是一个为Apollo量身定制的Ubuntu环境所有工具和依赖都已就位。5.3 安装工程依赖与编译进入容器后我们需要安装这个工程所依赖的所有软件包。这些依赖关系定义在core/cyberfile.xml文件中。安装命令很简单buildtool build -p core这个命令会读取cyberfile.xml下载并编译所有列出的依赖包。这是另一个耗时较长的步骤可能会下载数GB的代码和依赖。buildtool是Apollo新一代的构建工具它统一了源码模式和包模式的编译方式。命令中的-p core是指定编译core这个包。由于core包本身没有代码所以这个操作实质上就是安装依赖。如果你想编译当前工程目录下的所有代码比如你自己后来添加了一些模块可以运行buildtool build。对于GPU环境buildtool默认会使用–opt –gpu参数进行优化编译。如果你需要进行调试则需要使用–dbg参数例如buildtool build -p core --dbg。6. 配置车型与运行演示依赖安装完成后我们的Apollo系统就基本就绪了。接下来需要告诉Apollo我们的“车”是什么配置的。6.1 应用车型配置在application-core/profiles/目录下官方提供了一个sample示例配置。这个配置假设你的车辆有一个激光雷达和两个摄像头这是一个非常常见的传感器配置。我们通过aem来启用这个配置aem profile use sample这个命令会将sample配置链接为当前激活的配置。你可以打开profiles/sample目录看看里面定义了传感器参数、车辆参数、控制器参数等一大堆配置文件。当你以后有自己的真车或模拟器时就需要参照这里的格式编写自己的profile。6.2 获取演示数据与地图没有真实车辆和传感器我们怎么验证系统跑通了呢Apollo提供了录制好的数据包和高精地图我们可以通过“播包”来模拟传感器数据输入并在Dreamview可视化界面中回放。首先下载一个演示用的数据包wget https://apollo-system.cdn.bcebos.com/dataset/6.0_edu/demo_3.5.record -P $HOME/.apollo/resources/records/然后下载这个数据包对应的地图这里是Sunnyvale区域的地图buildtool map get sunnyvale从Apollo 9.0之后地图数据被分离出来需要单独下载。你可以通过buildtool map list命令查看所有可用的地图。6.3 启动Dreamview并播放数据Dreamview是Apollo的“驾驶舱”是一个强大的Web可视化工具。我们在容器内启动它aem bootstrap start --plus启动成功后打开你宿主机上的浏览器访问http://localhost:8888。如果一切正常你将看到Dreamview的界面。在Dreamview界面中选择Default Mode勾选用户协议后进入。在Mode Settings页面将Operations设置为Record播放录制数据。在Environment Resources中点击Records选择我们刚才下载的demo_3.5.record。同样在Environment Resources中点击HDMap选择Sunnyvale Big Loop地图。点击界面底部的播放按钮。此时你会在Vehicle Visualization区域看到车辆开始动起来周围出现了点云、车道线、障碍物等可视化元素。这说明整个Apollo系统从数据输入、感知、预测、规划到控制虽然控制输出在播包模式下不执行整个流水线都已经成功运行起来了你也可以在终端里用命令行播包cyber_recorder play -f ~/.apollo/resources/records/demo_3.5.record -l其中-l参数表示循环播放。7. 工程目录解析与日常开发指引当一切跑通后让我们回过头来看看这个application-core工程目录到底长什么样这对你后续的开发至关重要。application-core ├── .aem │ └── envroot │ ├── apollo # 挂载到容器内的 /apollo是容器内的工作空间 │ └── opt # 挂载到容器内的 /optApollo软件包默认安装在这里有缓存作用 ├── core │ ├── BUILD │ └── cyberfile.xml # 工程的“食谱”定义了所有依赖包 ├── data # 数据目录挂载到 /apollo/data │ ├── calibration_data # 标定数据 │ ├── log # 运行日志 │ └── map_data # 地图数据 ├── profiles # 核心所有车型配置都在这里 │ ├── current - sample # 当前使用的配置软链接 │ └── sample # 官方示例配置 ├── .workspace.json # 工程配置文件可指定软件包版本 └── ...其他文件几个关键点profiles目录是你的主战场。要适配你的车辆就是在这里修改或创建新的配置。复制sample文件夹重命名为你的车型名如my_car然后修改里面的vehicle_params.pb.txt车辆参数、sensor_kit_params.pb.txt传感器参数等文件。core/cyberfile.xml是依赖管理器。如果你需要引入新的第三方库或者自己写的模块需要在这里声明依赖。data目录是数据枢纽。你录制的新数据包、新的地图文件、标定结果、运行时日志都存放在这里或它的子目录下。它会在容器启动时自动挂载进去所以你在容器内对/apollo/data的操作实际就是修改宿主机上的这个data文件夹。.aem/envroot目录是环境根一般不需要手动修改由aem工具管理。日常开发流程通常是1.aem start启动环境2.aem enter进入容器3. 在/apollo目录下修改代码或配置4. 使用buildtool build进行编译5. 在Dreamview中测试或运行模块。当你退出容器exit并停止环境在宿主机工程目录下运行aem stop后你对代码和配置的修改都会保留在宿主机上而容器环境本身保持不变实现了开发环境与个人工作区的分离。8. 常见问题排查与维护即使按照步骤来也可能会遇到一些问题。这里我分享几个我踩过的坑和解决办法。1. Docker权限问题症状运行docker或aem命令时提示“Permission denied”或“Got permission denied while trying to connect to the Docker daemon socket”。 解决确保你已经执行了sudo usermod -aG docker $USER并重新登录了终端。可以通过groups命令查看当前用户是否在docker组内。2. GPU在容器内不可用症状在容器内运行nvidia-smi报错或者Dreamview中感知模块无法启动。 解决首先在宿主机运行nvidia-smi确认驱动正常。然后确保已正确安装并配置了NVIDIA Container Toolkit本章节3.2部分。最后可以运行一个测试命令docker run --rm --gpus all nvidia/cuda:11.8.0-base nvidia-smi看容器内是否能识别GPU。3. 拉取镜像或依赖包速度慢/失败症状aem start或buildtool build时下载极慢或卡住报错。 解决这通常是网络问题。对于Docker镜像可以尝试配置Docker国内镜像加速器如阿里云、中科大镜像源。对于buildtool下载的软件包目前主要依赖Apollo的CDN如果太慢可以尝试在网络条件好的时段进行或者使用一些网络工具。检查你的宿主机是否能正常访问apollo-pkg-beta.cdn.bcebos.com等域名。4. 端口冲突症状启动Dreamview时失败提示端口被占用。 解决Dreamview默认使用8888端口。确保宿主机上该端口没有被其他程序如其他Docker容器、Jupyter Notebook等占用。你可以用sudo lsof -i:8888命令查看。如果被占用可以停止相关程序或者在aem bootstrap start --plus命令中通过参数指定其他端口具体参数可查帮助文档。5. 如何彻底删除一个工程如果你想把一个工程比如application-core从头清理掉需要两步# 1. 进入工程目录停止并删除对应的容器 cd application-core aem remove # 2. 退出到上级目录删除整个工程文件夹 cd .. rm -rf application-coreaem remove命令会停止并删除该工程对应的Docker容器和镜像如果你没有其他工程共用该镜像的话。但请注意这样操作会删除你在该容器内安装的所有额外软件非挂载目录内的。你本地的代码、数据在data目录和配置文件在profiles目录由于存放在宿主机会被rm -rf命令删除所以操作前请做好备份。