Apollo学习笔记(一)概述+大纲
自动驾驶
自动驾驶正处在告诉发展的阶段。写篇博客便于以后复习。因为做的是自动驾驶中的某个流程,但是和机器学习无关。所以很多都是略过略过,有时间一定会好好研读机器学习相关的内容。讲真大学本科学机器学习真是给我这个菜鸡留下了心理阴影。主要是概述,连起来便于我复习,整个自动驾驶系统分为几个主要模块
- 定位:车必须要知道自己在哪里,去哪里
- 感知:通过雷达,摄像头等传来的信息,车要感知自己周围的障碍物,是车还是人,结合定位地图的信息(红绿灯等)都会传入规划
- 预测:根据传来的感知信息等去预测『其他』的动作,便于做决策
- 规划:决策步骤,规划出一条路径。
- 控制:计算机控制车沿着规划的路径开。
Apollo
百度Apollo无人车主要分为四个部分
- 线控车(这是必备,由计算机支配而不是人为去开)
- 硬件(感知,定位等都需要高精度,采集数据来让我们完成精密计算)需要达到apollo的硬件规格
- 软件:自动驾驶=计算机
1. ubuntu+apollo内核=RTOS实时操作系统
2. Runtime Framework(自动驾驶都是差不多这几个模块,区别在于算法各方面。这几个模块又有一个共性都是收数据,处理数据,发数据。比如规划:收到传感器等传来的数据发出自己规划的路径数据)所以Runtime Framework Apollo用的是cyber_RT。定义了各个模块,模块之间的交流(数据通道),模块之间传递消息的格式(message)等。这样解耦合,便于apollo的开发。
3. 模块(在自动驾驶部分已经介绍过了)通过框架通信,分离。 - 云服务(通过网络访问服务器,不在车辆之上的服务): 仿真,数据,安全,DuerOS等
Apollo技术改进和亮点
共享内存:一次写入多次读取
去中心化:所有节点放在一个域内(域的概念:同一个域内通信,不同域内隔离,有时会根据ip分配域,做到隔离),从主节点和其他节点变成公共域,每个节点备份全部信息,消除单点故障风险
数据兼容:message 统一格式 protobuf接口语言
仿真环境平台:构建不同的驾驶场景,每个模块有自己的算法上传你自己模块的算法,有评分标准,三维可视化实时路况,打分便于开发者调参。
仿真数据:记录场景和虚拟场景:障碍物,交通信号灯等数据
ApolloScape数据集:对中国所有公路已完成高精度绘图
高精度地图:语义:交通队灯,速度限制,左转——重要的精度保证安全。
定位:各种数据(摄像头+雷达等)+找地标+和地图对比 坐标变换 数据融合 预处理(删除差的数据),便于建立感知(地图上的信息,信号灯,还有找停车点 )
Apollo Runtime Framework——CyberRT
Apollo是开源项目,github上可以找到,内部有很多文档。以下只是个人理解,可能有误,欢迎大家指正。
- 模块——>component 继承基类,自定义初始化函数和数据处理函数
- mainboard:看做是进程,加载一个或多个模块(如果两个模块数据交互大,加载到同一个进程内)。cyberRT main函数入口
- 模块之间的通信
- 通信类:Reader/Writer(通过channel通道即组件间数据总线,p2p)
Service(request/response)
Param(全局参数传递,C/S模式) - Node:框架里最基本的组成单元,模块包含并通过Node进行通信
- Message:模块间通信的消息格式定义
- 通信类:Reader/Writer(通过channel通道即组件间数据总线,p2p)
- DAG:把模块抽象成点(本来也是通过Node通信),模块之间的通信抽象成边,加载整个框架cyber_launch会根据launch file启动多个mainboards,根据dag file加载模块进mainboards,
- 协程:优化线程使用资源分配实现的用户级线程
- 调度
- 多路数据融合
…
直接上图吧,根据cyber文档写的。想深入,看代码
README
接下来会研读apollo repo里的DreamView部分,因为都是开源的,就继续写博客做笔记了。
学习资料很多,最开始一头雾水,看了大纲明白了很多。bilibili搜百度 apollo会有几个很好的课程都是度学堂开的
以及最近一周工作跌跌撞撞学了好几点超级重要
- 一定要问,多问(不耻下问,会发现很多事豁然开朗,别因为刚工作不好意思)
- 看文档和代码永远是最好的解决方法(先看再问)