1. Apollo与Cyber RT初识:自动驾驶系统概览、Apollo开源平台介绍、Cyber RT通信框架核心概念、环境搭建与Demo运行

1.1 自动驾驶系统到底长什么样?

说实话,很多人一上来就问我:「自动驾驶是不是就是给车装个摄像头,然后让它自己跑?」嗯,如果真这么简单,我早就不在这写教程了。

一个完整的自动驾驶系统,说白了就是「感知→决策→控制」这三个环节的闭环。我当年刚入行时,以为核心是算法,后来踩了无数坑才明白——通信框架才是骨架。没有它,再牛的算法也只是孤岛。

来,先看一张图,帮你快速建立整体认知:

感知层 摄像头 / 激光雷达 毫米波雷达 / 超声波 → 目标检测、车道线 决策层 预测 / 规划 / 行为 → 路径规划 → 速度决策 控制层 转向 / 油门 / 制动 → PID / MPC → 执行器指令 Cyber RT 通信框架(Node / Channel / Reader/Writer) 数据流动的「高速公路」 数据 指令 感知结果 → 决策规划 → 控制执行 所有模块通过 Cyber RT 进行通信

你看,感知层拿到数据,通过 Cyber RT 发给决策层,决策层算好路径再发给控制层。每一层内部还有多个子模块在并行跑。如果没有一个高效的通信框架,数据就会乱成一锅粥。

1.2 Apollo开源平台——为什么选它?

Apollo 是百度开源的自动驾驶平台。我为什么推荐它?因为它是目前市面上最完整、最接地气的开源方案。

我个人习惯把 Apollo 比作「自动驾驶的 Linux」——它不只是一个算法包,而是一整套工具链:

  • 高精地图:HD Map 引擎,支持厘米级定位
  • 定位模块:GPS + IMU + 激光雷达融合
  • 感知模块:基于深度学习的目标检测、车道线识别
  • 规划模块:路径规划、速度规划、行为决策
  • 控制模块:横向/纵向控制,支持 PID 和 MPC
  • Cyber RT:自研的高性能通信框架

核心观点:Apollo 的价值不在于某个算法多牛,而在于它把「感知-决策-控制」这条链路完整打通了。你拿过来就能跑,跑起来就能改。

1.3 Cyber RT 通信框架——到底在解决什么问题?

好,现在聊聊 Cyber RT。我记得第一次接触它时,心里想的是:「不就是个消息队列吗?ROS 不也能干?」

后来在项目中遇到一次真实场景:车在高速上跑,感知模块每秒要处理 20 帧激光雷达数据,每帧包含几十万个点。如果用 ROS,光是序列化/反序列化就能吃掉 30% 的 CPU。Cyber RT 用了共享内存 + 零拷贝,延迟直接降到微秒级。

嗯,这就是差距。

1.3.1 核心概念:Node

Node 是 Cyber RT 里的「工作单元」。每个模块通常对应一个 Node。比如感知模块是一个 Node,规划模块是另一个 Node。

// 创建一个 Node
auto node = cyber::CreateNode("perception_node");

你想想看,Node 就像一个个独立的小车间,各自干各自的活,互不干扰。

1.3.2 核心概念:Channel

Channel 是数据传输的「管道」。每个 Channel 有一个名字,比如 /apollo/sensor/lidar/pointcloud。模块之间通过 Channel 名字来订阅和发布数据。

小技巧:我建议你给 Channel 命名时,遵循 /模块/子模块/数据类型 的格式。这样后期调试时,一眼就能看出数据流走向。

1.3.3 核心概念:Reader / Writer

Writer 负责往 Channel 里写数据,Reader 负责从 Channel 里读数据。一个典型的发布-订阅模式:

// 创建 Writer
auto writer = node->CreateWriter<PointCloud>("/apollo/sensor/lidar/pointcloud");

// 创建 Reader
auto reader = node->CreateReader<PointCloud>("/apollo/sensor/lidar/pointcloud",
    [](const std::shared_ptr<PointCloud>& msg) {
        // 处理点云数据
        AINFO << "收到点云数据,点数: " << msg->point_size();
    });

我曾经犯过一个低级错误:Reader 和 Writer 的 Channel 名字拼写不一致,结果数据死活收不到。排查了整整两个小时……所以,命名一定要统一。

1.4 环境搭建——别怕,跟着我来

环境搭建是新手最容易卡住的地方。我当年第一次装 Apollo,光依赖就装了三天。现在好多了,官方提供了 Docker 镜像,基本上一键搞定。

1.4.1 硬件要求

组件 最低配置 推荐配置
CPU 4 核 8 核以上
内存 8 GB 16 GB 以上
GPU NVIDIA GTX 1050 NVIDIA RTX 3070 以上
硬盘 100 GB 256 GB SSD
操作系统 Ubuntu 18.04 Ubuntu 20.04

注意:如果你没有 NVIDIA 显卡,也可以跑 Apollo,但感知模块的深度学习部分会跑在 CPU 上,速度会慢很多。建议至少搞一张 GTX 1050 级别的卡。

1.4.2 安装步骤(精简版)

  1. 安装 Docker:curl -fsSL https://get.docker.com | bash
  2. 安装 NVIDIA Docker(如果有 GPU):distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
  3. 拉取 Apollo 镜像:docker pull apolloauto/apollo:dev-latest
  4. 启动容器:bash docker/scripts/dev_start.sh
  5. 进入容器:bash docker/scripts/dev_into.sh
  6. 编译 Apollo:./apollo.sh build_opt

避坑指南:编译时如果报内存不足,可以加 --jobs 4 参数限制并行任务数。我曾经在 8GB 内存的机器上不加限制编译,结果直接 OOM 了。

1.5 跑一个 Demo——验证你的环境

环境搭好了,怎么知道它能不能用?跑一个 Demo 试试。

# 启动 Dreamview(Apollo 的可视化界面)
bash scripts/bootstrap.sh

# 在浏览器中打开 http://localhost:8888

# 播放示例数据
cyber_recorder play -f data/demo_3.5.record -l

如果一切正常,你会看到 Dreamview 界面上出现一辆车在跑,各种传感器数据实时显示。嗯,那一刻还是挺有成就感的。

我个人习惯在跑 Demo 时,同时打开终端用 cyber_monitor 查看各个 Channel 的数据流:

cyber_monitor

这个工具会列出所有活跃的 Channel,以及每个 Channel 的发布频率、数据大小。调试时特别有用。

1.6 本章小结

这一章我们走了一遍自动驾驶系统的全貌,认识了 Apollo 平台和 Cyber RT 的核心概念。说白了,Cyber RT 就是整个系统的「血管」,Node 是器官,Channel 是血管,Reader/Writer 是血液流动的机制。

环境搭建这块,我建议你跟着步骤一步步来,遇到问题不要慌。大部分坑我都踩过了,后面章节会专门讲常见问题的排查方法。

好,先到这。去跑一下 Demo,感受一下数据在 Cyber RT 里流动的感觉。

可可精品资料库