0

0

C++自动驾驶 Apollo平台配置教程

P粉602998670

P粉602998670

发布时间:2025-08-27 14:09:01

|

234人浏览过

|

来源于php中文网

原创

答案是配置Apollo平台需先搭建Ubuntu系统并配置Docker环境,再克隆Apollo源码并使用脚本进入开发容器,通过Bazel编译C++代码,结合CyberRT框架开发模块,利用DAG文件定义组件依赖,并通过回放Record数据验证功能。

c++自动驾驶 apollo平台配置教程

配置Apollo平台以进行C++自动驾驶开发,核心在于搭建一个稳定且高效的开发环境,这通常意味着要处理好操作系统、Docker容器以及Apollo自身的复杂依赖关系,确保你的C++代码能在这个庞大的框架中顺利编译并运行起来。

说实话,第一次接触Apollo平台配置,很多人都会觉得有些头大。它不是那种点几下鼠标就能搞定的活儿,更像是一场需要耐心和细致的“探险”。我个人觉得,最关键的一步是理解Docker在整个Apollo生态中的核心地位。几乎所有的开发、编译和运行,都是在Apollo提供的Docker容器内部进行的,这极大地简化了环境管理,但也带来了一些初学者容易遇到的“墙”。

你得确保你的Ubuntu系统(推荐18.04或20.04)上Docker已经安装并配置妥当。别忘了给你的用户添加Docker组权限,不然每次操作都得sudo,烦不烦?

sudo usermod -aG docker $USER
newgrp docker # 或者直接重启

接着,就是获取Apollo的源代码。通常是从GitHub克隆,选择一个稳定的release分支是个明智之举,比如

release/6.0
或者更新的版本。

立即学习C++免费学习笔记(深入)”;

git clone https://github.com/ApolloAuto/apollo.git
cd apollo
git checkout release/6.0 # 举例

进入Apollo目录后,启动开发容器是日常工作的起点。Apollo提供了一系列脚本来管理Docker容器,

./apollo.sh build_dev_docker
是构建开发镜像,
./apollo.sh dev
是进入容器。这里有个小技巧,如果你想在容器内部挂载更多本地目录,或者调整资源限制,直接修改
scripts/dev_start.sh
是个不错的选择,但要小心,别改乱了。

进入容器后,你才真正踏入了Apollo的开发环境。这里面预装了各种C++编译器、Bazel构建工具以及其他必要的库。编译Apollo项目,通常只需要一条命令:

bazel build //modules/...

这个过程可能相当漫长,取决于你的机器性能和网络状况(Bazel会下载一些外部依赖)。我记得我第一次编译的时候,等了足足几个小时,中间还因为网络问题断过几次,那种感觉真是让人抓狂。所以,确保网络稳定非常重要。编译成功后,你就可以尝试运行一些Apollo的模块或者仿真器了。

在整个配置过程中,最常见的问题往往出在Docker的权限、网络代理(如果你在内网环境)以及Bazel的缓存和依赖管理上。遇到问题,别急着重来,先看看Apollo的官方文档和GitHub Issue,很多坑前人都已经踩过了。

C++开发者在Apollo平台中如何开始自己的模块开发?

对于C++开发者来说,进入Apollo平台最兴奋的莫过于能亲手写模块,让车“动”起来。Apollo的核心通信机制是基于CyberRT(或者早期版本的Dreamview),这是一个高性能的实时框架,用C++编写模块是其主要方式。要开始一个新模块,你首先需要理解CyberRT的组件模型:Node、Component和Message。

一个典型的C++模块通常是一个或多个

Component
的集合,这些
Component
会运行在
Node
中,通过
Message
进行数据交互。你可以想象成,
Node
是你的模块运行的“进程空间”,
Component
是这个进程里的“功能单元”,比如一个传感器数据处理单元,或者一个规划算法单元。它们之间的数据流动,就是通过
Message
传递的。

创建一个新模块的步骤大致是这样的:

  1. 定义Message类型: 如果你需要新的数据结构,首先在

    modules/common/proto
    或者你自己的模块目录下定义
    .proto
    文件。这是C++和Python模块之间通信的“语言”。

    // modules/my_module/proto/my_message.proto
    syntax = "proto2";
    
    package apollo.my_module;
    
    message MySensorData {
      optional double timestamp = 1;
      optional float value = 2;
    }

    然后用Bazel编译这些proto文件,生成C++头文件和源文件。

    《PHP程序设计》第二版
    《PHP程序设计》第二版

    本书图文并茂,详细讲解了使用LAMP(PHP)脚本语言开发动态Web程序的方法,如架设WAMP平台,安装与配置开源Moodle平台,PHP程序设计技术,开发用户注册与验证模块,架设LAMP平台。 本书适合计算机及其相关专业本、专科学生作为学习LAMP(PHP)程序设计或动态Web编程的教材使用,也适合对动态Web编程感兴趣的读者自觉使用,对LAMP(PHP)程序设计人员也具有一定的参考价值。

    下载
  2. 创建Component:

    modules
    目录下新建你的模块文件夹,比如
    modules/my_module
    。在这个文件夹里,你可以创建一个C++类,继承自
    apollo::cyber::Component
    。这个类需要实现
    Init()
    Proc()
    方法。
    Init()
    用于初始化,比如创建Reader和Writer;
    Proc()
    则是核心逻辑,会周期性地被CyberRT调度执行,处理接收到的数据。

    // modules/my_module/my_component.h
    #include "cyber/component/component.h"
    #include "modules/my_module/proto/my_message.pb.h"
    
    namespace apollo {
    namespace my_module {
    
    class MyComponent : public cyber::Component<apollo::my_module::MySensorData> {
    public:
      bool Init() override;
      bool Proc(const std::shared_ptr<apollo::my_module::MySensorData>& msg) override;
    };
    
    } // namespace my_module
    } // namespace apollo
  3. 编写BUILD文件: 在你的模块目录下,创建一个

    BUILD
    文件,告诉Bazel如何编译你的C++代码和proto文件。这个文件是Bazel构建系统的核心。

  4. 配置DAG文件: 最后,你需要一个DAG(Directed Acyclic Graph)文件(通常是

    .dag
    .conf
    文件),来描述你的模块如何启动,以及各个Component之间的依赖关系和数据流向。这就像是你的模块的“启动脚本”和“拓扑图”。

这套流程走下来,你会发现Apollo在工程化上的考虑非常周全,虽然初期学习曲线有点陡峭,但一旦掌握,开发效率会大大提升。

Apollo平台编译失败常见原因及解决方案?

编译Apollo平台,尤其是C++部分,说实话,是个不小的挑战,失败是常态。我个人在处理这些问题时,总结出几个高频“雷区”。

一个最常见的问题是网络连接。Bazel在编译过程中需要从Google的Maven仓库下载大量的Java依赖(是的,即使是C++项目,Bazel本身是Java写的,且其生态依赖很多Java工具),如果你的网络环境有代理或者直接访问受限,那基本上是寸步难行。

  • 解决方案: 确保你的Docker容器内部网络能够正常访问外部。如果你在公司内网,可能需要配置Docker daemon的代理,或者在进入容器后手动设置环境变量
    HTTP_PROXY
    HTTPS_PROXY
    。有时候,直接使用一个更稳定的公共网络环境会省去很多麻烦。

其次,Bazel版本不匹配。Apollo对Bazel的版本有严格要求,如果你使用了错误的版本,很可能会出现各种奇奇怪怪的编译错误,比如找不到某个规则,或者语法不兼容。

  • 解决方案: 严格按照Apollo官方文档中推荐的Bazel版本来安装和使用。通常Apollo的Docker镜像里已经包含了正确的Bazel版本,所以如果你是在容器内部编译,这通常不是问题。但如果你在容器外尝试编译(不推荐),或者手动升级/降级了Bazel,就需要特别注意。

还有就是内存不足。编译Apollo是个内存密集型任务,特别是当你的机器配置不高时,Bazel可能会因为内存耗尽而崩溃。我曾经在一台只有8GB内存的笔记本上尝试编译,结果可想而知。

  • 解决方案: 确保你的机器有足够的RAM(建议至少16GB,最好32GB或更高)。如果实在不行,可以尝试调整Bazel的并行编译参数,减少同时运行的编译任务数量,但这会显著增加编译时间。

另外,依赖库缺失或版本冲突也时有发生。虽然Docker容器旨在解决这个问题,但在某些特殊情况下(比如你手动修改了容器环境,或者使用了非官方的镜像),仍然可能遇到。

  • 解决方案: 优先使用官方提供的Docker镜像。如果必须手动安装库,务必仔细核对版本兼容性。清理Bazel缓存(
    bazel clean --expunge
    )有时也能解决一些玄学问题,这会删除所有Bazel的构建输出和缓存。

最后,代码冲突或本地修改导致的问题。如果你在修改Apollo源码,但又没有正确处理git冲突,或者修改了不该修改的文件,编译自然会失败。

  • 解决方案: 定期
    git pull
    并解决冲突,或者在进行大改动前,先备份你的工作区。保持对源码的敬畏之心,只修改你确实需要改动的部分。

总而言之,编译失败并不可怕,可怕的是不知道如何排查。学会看Bazel的错误日志,它通常会给出非常详细的提示,告诉你哪个文件出了问题,或者哪个依赖没找到。

在没有实际车辆的情况下,如何验证Apollo的C++模块功能?

对于大多数C++开发者来说,直接在真车上测试代码显然是不现实的。幸运的是,Apollo平台提供了非常完善的仿真和回放机制,让我们可以在没有物理车辆的情况下,高效地验证C++模块的功能。我个人觉得,这是Apollo设计最精妙的地方之一。

最核心的验证方式就是离线数据包(Rosbag/Record)回放。Apollo会记录车辆在真实世界中行驶时产生的所有传感器数据、定位信息、控制指令等,打包成

.record
文件(早期版本是
.bag
文件)。你可以把这些数据包想象成一段“真实世界的录像”。

  • 操作方法: 启动Apollo的Dreamview(Web界面),通常通过`./apollo.sh start

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

549

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

30

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

44

2026.01.06

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

4159

2026.01.21

自建git服务器
自建git服务器

git服务器是目前流行的分布式版本控制系统之一,可以让多人协同开发同一个项目。本专题为大家提供自建git服务器相关的各种文章、以及下载和课程。

979

2023.07.05

git和svn的区别
git和svn的区别

git和svn的区别:1、定义不同;2、模型类型不同;3、存储单元不同;4、是否拥有全局版本号;5、内容完整性不同;6、版本库不同;7、克隆目录速度不同;8、分支不同。php中文网为大家带来了git和svn的相关知识、以及相关文章等内容。

581

2023.07.06

git撤销提交的commit
git撤销提交的commit

Git是一个强大的版本控制系统,它提供了很多功能帮助开发人员有效地管理和控制代码的变更,本专题为大家提供git 撤销提交的commit相关的各种文章内容,供大家免费下载体验。

275

2023.07.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号