一、前言
就像学习ros一样,首先要学习官方课程,下面按照学习的顺序对自己的学习理解进行记录。
二、学习记录
1.apollo开放平台文档
2. 用来保存车辆数据, 用来保存地图数据,用户可将自己的车辆或地图文件拷贝到这两个文件夹使用。
3. Component,在自动驾驶系统中,模块(如感知、定位、控制系统等)在 Cyber ??RT 下以 Component 的形式存在。不同 Component 之间通过 Channel 进行通信。Component 概念不仅解耦了模块,还为将模块拆分为多个子模块提供了灵活性。
4. Channel, Channel 用于管理 Cyber?? RT 中的数据通信。用户可以发布/订阅同一个 Channel,实现 P2P 通信。(类似rostopic)
5. Node, Node 是 Cyber?? RT 的基本组成部分。每个模块都包含一个 Node 并通过 Node 进行通信。通过在节点中定义 Reader/Writer 或 Service/Client,模块可以具有不同类型的通信形式。(l类似rosnode)
6. Reader/Writer, Reader/Writer 通常在 Node 内创建,作为 Cyber?? RT 中的主要消息传输接口。(类似ros,publisher,subscriper)
7. Message, Message 是 Cyber?? RT 中用于模块之间数据传输的数据单元。(类似rosmessge)
8.Dag文件,Dag 文件是模块拓扑关系的配置文件。您可以在 dag 文件中定义使用的 Component 和上游/下游通道。
(关于dag文件需要一些补充说明,以前没用过)
9.Launch文件, Launch 文件提供了一种启动模块的简单方法。通过在 launch 文件中定义一个或多个 dag 文件,可以同时启动多个模块。(类似于roslaunch)
10. Record文件, Record 文件用于记录从 Cyber ??RT 中的 Channel 发送/接收的消息。回放 Record 文件可以帮助重现 Cyber?? RT 之前操作的行为。(类似于rosbag)
11. 视觉感知算法在 Apollo 平台上主要有 3 个应用场景,分别是红绿灯检测、车道线检测、基于摄像头的障碍物检测。
12. 红绿灯检测模块一共包含 4 个部分,分别是数据预处理、红绿灯位置检测、红绿灯识别和矫正。
13.障碍物检测部分采用的是基于单目视觉的障碍物检测算法,根据相机获取的图像得到障碍的类别和位置信息。这里使用 7 个变量来表示 3D 边框,分别是物体的长宽高,物体的位置 x,y,z 以及物体的旋转角度 θ。apollo使用视觉识别障碍物的输出结果为(h,w,l): 物体的长宽高(米),(x,x,z):中心点坐标,
14.节点的启动 cyber_launch start …./*.launch
模块启动: mainboard -d ../../*.dag
使用cyber_launch 启动单个节点, mainboard 启动多个节点。
15. 激光雷达感知模块接收到点云数据之后,通过高精度地图 ROI(The Region of Interest)过滤器过滤 ROI 之外的点云,去除背景对象,例如:路边建筑物、树木等,过滤后的点云数据通过障碍物检测深度学习模型进行 3D 障碍物的检测和分类,然后对得到的障碍物进行跟踪,最终得到障碍物的形状、位置、类别、速度等信息。
Apollo CNN分割检测算法分为以下四个部分:
通道特征提取
基于 CNN 的障碍物预测
障碍物聚类
后处理
16. 通道特征提取,给定点云数据帧,Apollo 构建其鸟瞰视图(即,投影到 XY 平面),它是局部坐标系中的 2D 格。根据 x 和 y 坐标,可以将相对于原点(即,LiDAR 传感器)的预先定义范围内的每个点都量化到 2D 格中的一个 cell。在量化之后,Apollo 为 格中每个 cell 中的点计算其 8 个统计值,这些需要计算的统计值如下所示:
cell 中点的最大高度。
cell 中最高点的亮度。
cell 中点的平均高度。
cell 中点的平均亮度。
cell 中点的数量。
相对于原点,cell 中点的角度。
cell 中点到原点的距离。
表示单元是空还是以被占据的二进制数值。
17.定位,结合 GPS + IMU + Lidar 实现的简单融合定位系统,其中 lidar 定位采用开源 NDT 算法实现。本系统依赖 GPS 信 质量,具备简单城市场景下的高精度,鲁棒的定位能力。
18.规划, Apollo 规划模块的主要作用是结合障碍物、地图定位以及导航信息为自动驾驶车辆规划一条运动轨迹,这条轨迹由若干轨迹点组成,每个轨迹点均包含了位置坐标、速度、加速度、加加速度、相对时间等信息,这些信息为自动驾驶车辆的运动提供依据,参照规划的轨迹,自动驾驶车辆可以高效、安全、舒适的驶向目的地。
19. Apollo 规划模块功能的实现是基于场景(scenario-based)实现的,针对不同的场景,规划模块通过一系列独立的 任务(task) 组合来完成轨迹的规划。开发者可以根据自己的使用需求,调整 下的配置文件,调配任务组合实现自己的规划要求。
状态机(Apollo FSM(Finite State Machine)):一个有限状态机,结合导航、环境等信息确定自动驾驶车辆的驾驶场景
规划分发器(Planning Dispatcher):根据状态机与车辆相关信息,调用合适当前场景的规划器
规划器(Planner):结合上游模块信息,通过一系列的任务组合,完成自动驾驶车辆的轨迹规划
决策器 & 优化器(Deciders & Optimizers):一组实现决策和优化任务的 task 集合。优化器用于优化车辆的轨迹和速度。决策器则基于规则,确定自动驾驶车辆何时换车道、何时停车、何时蠕行(慢速行进)或蠕行何时完成等驾驶行为。
20. 控制,控制模块是整个自动驾驶软件系统中的执行环节,控制模块的目标是基于规划模块输出的目标轨迹和定位模块输出的车辆状态生成方向盘、油门、刹车控制命令,并通过 canbus 模块给车辆底层执行器。简单而言,就是告诉车辆该打多大方向盘、多大的油门开度、多大的刹车制动力。
横向控制:方向盘指令。纵向控制:油门刹车指令。
21. Apollo中的消息格式为protobuf, 各种数据的详细定义可以在开放平台文档中找到。
二、规划相关
2.1 根据launch文件和build文件推出plan模块的主函数在 planning_component.cc中。
2.2 所有的模块都是以组件Component的形式存在的。都是继承cyber::Component。需要重写Init()和Proc()这两个成员函数。
2.3 增加两个成员函数CheckRouting()和CheckInpuit()
2.4 以下几个reader:
traffic_light_reader_ :std::shared_ptr<:reader>>
routing_reader_ :std::shared_ptr<:reader>>
pad_msg_reader_; std::shared_ptr<:reader>>
relative_map_reader_; std::shared_ptr<:reader>>
story_telling_reader_; std::shared_ptr<:reader>>
2.5. 以下几个writer:
planning_writer_; std::shared_ptr<:writer>>
rerouting_writer_; std::shared_ptr<:writer>>
planning_learning_data_writer_; std::shared_ptr<:writer>>
2.6以下几个成员变量:
std::mutex mutex_; 锁
perception::TrafficLightDetection traffic_light_;
routing::RoutingResponse routing_;
planning::PadMessage pad_msg_;
relative_map::MapMsg relative_map_;
storytelling::Stories stories_;
2.7 以下几个智能指针
std::unique_ptr
std::shared_ptr
2.8 其他:
LocalView local_view_; //不知道干啥的
PlanningConfig config_; //配置结构体
MessageProcess message_process_; //消息处理器
请听下文
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!