共计 1487 个字符,预计需要花费 4 分钟才能阅读完成。
背景介绍
自动驾驶小车作为智能交通系统的重要组成部分,广泛应用于园区物流、教育科研和低速接驳等场景。Apollo 平台凭借其开源特性和模块化设计,成为开发者快速搭建自动驾驶系统的首选框架。本文将系统性地拆解 Apollo 小车的技术栈,帮助初学者建立完整的认知体系。

硬件架构详解
传感器选型标准
- 激光雷达 :16 线及以上规格(如 Velodyne VLP-16),水平视场角需覆盖 360 度,测距精度±2cm 以内
- 摄像头 :全局快门工业相机(如 FLIR Blackfly),建议 200 万像素以上,帧率≥30FPS
- IMU:6 轴以上惯性测量单元(如 Xsens MTi-300),角速度量程≥300°/s
- GNSS:RTK 定位模块(如 NovAtel PwrPak7),定位精度需达到厘米级
协同工作流程
- 激光雷达生成 3D 点云数据(10Hz)
- 摄像头提供 RGB 图像(30Hz)
- IMU 输出 6DOF 位姿(100Hz)
- GNSS 提供全局位置(5Hz)
数据同步要点 :通过 PTP 协议实现硬件级时间同步,所有传感器需支持外部触发
软件架构解析
Apollo 模块关系
flowchart LR
A[感知] -->| 障碍物信息 | B[预测]
B -->| 轨迹预测 | C[规划]
C -->| 控制指令 | D[控制]
D -->| 车辆状态 | A
- 感知模块 :融合多传感器数据,输出障碍物检测结果
- 预测模块 :基于历史轨迹预测周围物体运动趋势
- 规划模块 :生成安全舒适的行驶轨迹
- 控制模块 :将轨迹转化为油门 / 刹车 / 转向指令
核心代码实现
ROS 通信示例(Python)
#!/usr/bin/env python3
import rospy
from sensor_msgs.msg import PointCloud2
def pointcloud_callback(msg):
# 点云数据处理逻辑
rospy.loginfo("Received {} points".format(msg.width))
if __name__ == "__main__":
rospy.init_node('perception_node')
sub = rospy.Subscriber('/apollo/sensor/lidar', PointCloud2, pointcloud_callback)
rospy.spin()
数据转换(C++)
#include <ros/ros.h>
#include <pcl_conversions/pcl_conversions.h>
void cloudCallback(const sensor_msgs::PointCloud2ConstPtr& msg) {
pcl::PointCloud<pcl::PointXYZ> cloud;
pcl::fromROSMsg(*msg, cloud);
ROS_INFO("Processing %ld points", cloud.size());
}
部署实践与优化建议
常见问题解决方案
- 标定错误 :使用 Apollo 校准工具包时,确保:
- 标定板尺寸参数准确
- 环境光照均匀
-
传感器固定稳固
-
计算资源分配 :
- 感知模块优先分配 GPU 资源
- 规划控制模块需要低延迟 CPU 核心
- 预留 20% 算力应对突发负载
实时性保障措施
- 关键进程设置为实时调度(SCHED_FIFO)
- 网络通信采用 DDS 替代原生 ROS
- 控制指令发送周期严格保持 100Hz
总结与进阶
建议按照以下路径深入实践:
- 在 Apollo 仿真环境中搭建单车道循迹 demo
- 添加虚拟障碍物测试避障功能
- 移植到实体小车进行实车验证
推荐学习资源:Apollo 官方文档的 ”Getting Started” 教程,以及《自动驾驶系统设计》专业书籍。通过逐步迭代开发,最终可实现完整的自动驾驶功能栈。
正文完
