前言

Apollo星火计划课程链接如下
星火计划2.0基础课:https://apollo.baidu.com/community/online-course/2
星火计划2.0专项课:https://apollo.baidu.com/community/online-course/12

1. Apollo感知框架介绍

1.1 Apollo感知模块概述

    感知模块结合了使用多个摄像头、雷达(前后)和激光雷达来识别障碍物并融合它们各自的轨迹以获得最终轨迹列表的能力。
    障碍物子模块对障碍物进行检测分类跟踪。障碍物子模块包含相机模块,lidar模块,radar模块。该子模块还预测障碍物运动和位置信息(例如,航向和速度)。

1.2 飞桨PaddlePaddle

自动驾驶实战:基于Paddle3D的点云障碍物检测
PaddleSeg实现自动驾驶语义分割
助力自动驾驶:行车检测和车道线分割

1.3 跟踪

    单帧检测结果具备类型、位置、航向等信息,但是无法准确预测物体的未来运动。Tracking(追踪)的目的,对于物体未来的状态进行预测。包含航向、速度、位置。

1.4 Apollo感知框架

在这里插入图片描述在这里插入图片描述

感知模块的代码结构

    camera目录,里面是相机检测相关的代码,主要实现了obstacle检测,红绿灯识别,车道线检测等功能。在这里插入图片描述

    lidar目录,这里存放着lidar相关的算法,主要实现了lidar检测,和lidar tracking两个功能。在这里插入图片描述

    radar目录下实现了radar检测的功能。在这里插入图片描述

    fusion目录下实现了 多传感器障碍物融合的功能,会将lidar, camera, radar检测到的障碍物融合输出。在这里插入图片描述
    onboard目录下存储着component,各个component负责 检测, 跟踪,融合,红绿灯识别等功能,通过调用各个传感器的app(application)实现。在这里插入图片描述

    production目录下面,存放着dag和launch,用来启动感知模块或者其中部分功能的子模块。也包含着配置文件,如图是64线激光雷达的配置包含了实例化detector类的名称,传感器名称,输出channel等配置信息,方便修改。
.dag文件启动

mainboard -d  路径/***.dag

在这里插入图片描述    lidar各个module的配置文件,比如lidar obstacle pipeline的配置,包含detection和tacking两个部分,value存放的位置。在这里插入图片描述    modules配置的具体内容,value存放在data目录下,比如像64线激光雷达的 lidar obstacle pipeline的配置,包含了点云预处理模块,采用了pointillars detector, 打开了map manager和object filter。
在这里插入图片描述下面是以上文件的具体路径:

componet:
/apollo/modules/perception/onboard/component

velodyne64_detection_conf.pb.txt
/apollo/modules/perception/production/conf/perception/lidar/velodyne64_detection_conf.pb.txt

lidar_obstacle_pipeline.config
/apollo/modules/perception/production/conf/perception/lidar/modules/lidar_obstacle_pipeline.config

lidar_obstacle_detection.conf
/apollo/modules/perception/production/data/perception/lidar/models/lidar_obstacle_pipeline/velodyne64/lidar_obstacle_detection.conf

在这里插入图片描述

2. Lidar障碍物检测

在这里插入图片描述/apollo/modules/perception/production/dag/dag_streaming_perception_lidar.dag
在这里插入图片描述

从dag文件中,我们整理出实现lidar检测的流程。

在这里插入图片描述
Lidar Dag:DetectionComponent

在这里插入图片描述
RecognitionComponent

在这里插入图片描述
FusionComponent

2.1 Detection Component

2.1.1 BUILD文件目录

/apollo/modules/perception/onboard/component/BUILD
    通过BUILD文件来弄清楚文件的编译规则和target的依赖。Bazel 是一款类似于 Make的开源 构建和测试工具。apollo使用bazel来构建项目。bazel通过解析我们制定的编译规则,自动配置依赖环境,调用编译器,完成项目构建。编译规则就在BUILD文件中。
在这里插入图片描述

detection流程

2.1.2 工厂模式

    方便在后期扩展功能,探索不同的算法类来实现相同的功能,方便升级。
    在使用中,通过改变配置文件来动态地使用不同的算法类

2.1.3 CNN

在这里插入图片描述

得到3通道图片的feature map

2.1.4 Pointpillars

在这里插入图片描述

体素化点云,得到一张伪图片

    按照点云数据所在的X,Y轴(不考虑Z轴)将点云数据划分为一个个的网格,凡是落入到一个网格的点云数据被视为其处在一个pillar里,或者理解为它们构成了Pillar。
    每个voxel用一个D=9维的向量表示,代表有9个通道,分别为 (x,y,z,r,xc,yc,zc,xp,yp)——位置、强度、重心、偏差。
在这里插入图片描述    从图中可以看出,该2D CNN采用了两个网络。其中一个网络不断缩小特征图的分辨率,同时提升特征图的维度,因此获得了三个不同分辨率的特征图。
    另一个网络对三个特征图进行上采样至相同大小,然后进行串联。
    之所以选择这样架构,是因为不同分辨率的特征图负责不同大小物体的检测。比如分辨率大的特征图往往感受野较小,适合捕捉小物体。detection head实现分类和定位。
    网络从功能编码器开始,这是一个简化的PointNet。它包含一系列卷积、批处理范数和 relu 层,后跟一个最大池化层。末端的散射层使用柱形索引将提取的要素映射到 2-D 空间中。
网络在每个解码器块的末端连接输出特征,并通过具有卷积层和    sigmoid层的六个检测头传递这些特征,以预测占用率、位置、大小、角度、航向和类。

在这里插入图片描述

2.2 Recognition Component

代码位置:
/apollo/modules/perception/lidar/app/lidar_obstacle_tracking.cc

2.2.1 Lidar Tracker

在这里插入图片描述在这里插入图片描述
    匹配时,考虑障碍物的大小、形状以及行驶方向(Heading),最后添加到追踪列表。
    目标跟踪的主要目的是:根据运动目标相关的特征值,将障碍物序列中连续帧的同一运动目标关联起,得到每帧数据中目标的运动参数以及相邻帧间目标的对应关系,从而得到障碍物完整的运动轨迹
在这里插入图片描述

2.2.2 匈牙利算法

匈牙利算法:
/apollo/modules/perception/common/graph/gated_hungarian_bigraph_matcher.h
推荐博客:
https://blog.csdn.net/qq_41730082/article/details/104077616

在这里插入图片描述

前一帧与当前帧有图示对应关系
在这里插入图片描述
首先将1与a进行匹配
在这里插入图片描述
再将2与b进行匹配
在这里插入图片描述
再对3进行匹配,但已经没有空了。撤销2与b的匹配,将2与c进行匹配
在这里插入图片描述
此时b就空出来了,将1与b进行匹配。最后将3与a进行匹配
在这里插入图片描述
现在,1、2、3都有匹配的对象。d代表着新出现的障碍物。4代表当前帧已经消失的障碍物。

2.2.3 障碍物之间的关系

文件位置
/apollo/modules/perception/lidar/lib/tracker/association/distance_collection.h
    由这些特征LocationDistance、DirectionDistance、BboxSizeDistance、PointNumDistance、HistogramDistance、CentroidShiftDistance、BboxIouDistance、SemanticMapDistance以及下图所示的特征,可以计算出特征值。在这里插入图片描述

前后帧的距离、headiing方位角、形状与大小

在这里插入图片描述

文件位置
/apollo/modules/perception/lidar/lib/tracker/multi_lidar_fusion/mlf_track_object_distance.h

    计算出特征值之后,再由上图代码计算出两帧之间的对应关系,最后利用匈牙利算法进行匹配。

2.2.4 Lidar Tracker代码结构

在这里插入图片描述
    Tracker模块主要由MlfEngine实现。MlfEngine分为数据匹配模块与状态更新模块。
    数据匹配模块即匈牙利匹配,首先由distance_collection计算出距离,然后传到MlfTrackerObjectDistance计算出相应的权重,最后送到MlfTrackerObjectMatcher进行匈牙利匹配(二分图匹配)。其中,GnnBipartiteGraphMatcher负责前景匹配,MultiHmBipartiteGraphMatcher负责后景匹配。
    得到正确的障碍物匹配之后,需要由MlfTracker状态更新模块进行更新。MlfTracker分为两个模块,形状更新模块(MlfShapeFilter)与运动更新模块(MlfMotionFilter)。同样的,首先收集器运动速度信息,再进行计算,最后refine。

2.2.5 Tracker 更新运动状态

卡尔曼滤波
在这里插入图片描述
参考博客——详解卡尔曼滤波原理在这里插入图片描述

2.3 Fusion Component

2.3.1 ObstacleMultiSensorFusion

上一节课已经介绍过
单一的传感器都是有缺陷的
ObstacleMultiSensorFusion在这里插入图片描述

对不同传感器检测到的障碍物信息进行关联与融合

在这里插入图片描述
ObstacleMultiSensorFusion流程

在这里插入图片描述
Fusion Component流程

2.3.1 D-S证据理论

推荐博客:https://blog.csdn.net/qq_36512295/article/details/89448583
推荐课程:
在这里插入图片描述

在这里插入图片描述

3. 红绿灯识别

3.1 Camera感知模块

在这里插入图片描述

3.2 红绿灯识别流程

在这里插入图片描述在这里插入图片描述

4. 模块的启动方法和基础配置

4.1 模块启动

代码位置:/apollo/modules/perception/production
在这里插入图片描述

mainboard -d /…/**.dag

或者可以用launch文件启动,两者是对应的。
在这里插入图片描述

launch start /…/**.launch

4.2 Dreamview启动

代码目录下 apollo/

1.启动docker环境
	bash docker/scripts/dev_start.sh

2.进入docker环境
	bash docker/scripts/dev_into.sh

3.代码编译(更改配置文件不需要重新编译)
	./apllo.sh

4.启动Dreamview
	bash scripts/bootstrap.sh

4.3 Dreamview选择车型和地图

打开Dreamiew后

1.在浏览器输入 http://localhost:8888

2.选择模式、车辆、地图
在这里插入图片描述

4.4 播放数据

1.下载数据包。 https://apollo-system.cdn.bcebos.com/dataset/6.0_edu/demo_sensor_data.tar.xz

2.解压 tar -xvf demo_sensor_data.tar.xz

3.将数据复制到 /apollo/data/bag 文件夹下,不然docker内访问不到

4.docker内, cyber_recorder play -f /apollol/data/bag/demo_sensor_data.tar.xz

5.利用cyber_monitor 查看channel数据,利用cyber_visualizer可视化点云和查看相机图片

在这里插入图片描述

4.5 Lidar 感知模块启动

1.修改模块的输入channel

	vim /apollo/modules/perception/production/dag/dag_streaming_perception.dag

在这里插入图片描述
2.修改 /apollo/modules/perception/production/conf/perception/lidar目录下
velodyne128_segmentation_conf.pb.txt 文件
在这里插入图片描述
3.在Dreamview中启动perception
4.查看模块是否启动完成 tail -f /apollo/data/log/mainboard.INFO
在这里插入图片描述

4.6 Traffic Light模块启动

Launch文件路径:/apollo/modules/perception/production/launch

前提启动模块:

1.Transform模块:为了发布传感器各坐标系变换供各模块调用

cyber_launch start /apollo/modules/transform/launch/static_transform.launch

2.image decompression 模块:将压缩的图像数据解压缩

cyber_launch start modules/drivers/tools/image_decompress/launch/image_decompress.launch

红绿灯检测模块

cyber_launch start /apollo/modules/perception/production/launch/perception_trafficlight.launch

播放数据,查看结果

cyber_recorder play -f /apollo/data/bag/demo_sensor_data_for_vision.record -k /apollo/perception/obstacles /apollo/prediction

在这里插入图片描述

实践文档

https://developer.apollo.auto/document_cn.html?target=/Apollo-Homepage-Document/Apollo_Doc_CN_6_0/

Logo

为开发者提供自动驾驶技术分享交流、实践成长、工具资源等,帮助开发者快速掌握自动驾驶技术。

更多推荐