Apollo企业二次开发工具Application X指南(二):感知模块详述
功能概述
功能概述
Perception 模块在自动驾驶系统中扮演着至关重要的角色,感知各个子模块的功能是通过 lidar、radar 和camera 3 种传感器实现的,每种传感器分别都执行了目标识别和追踪的任务,最后通过 fusion 对传感器的数据做融合;除此之外,还通过camera实现了车道线识别和红绿灯检测的功能,每个传感器执行的任务流程大概相似:预处理,识别,过滤,追踪。
在自动驾驶系统中,感知模块主要负责识别车辆周围的障碍物以及交通标识等,因此感知算法的好坏直接关系到自动驾驶的安全性,如何更快的迭代开发感知算法就成为了关键。在 Apollo alpha 中,对感知模块进行了组件化重构,提供了多种开发模式。当现有功能完全适用于用户的开发需求,可以不需要开发代码,通过修改组件配置或者模型参数实现场景的功能需求;组件开发,当用户的场景需要引入新的需求和其他组件共同完成作业任务,比如增加激光雷达背景分割功能,只需在满足上下游消息通道订阅发布的同时完成相应开发即可;插件开发,例如激光雷达目标检测障碍物过滤组件中我们提供了两种过滤插件方法,如不能满足用户的需求,可以根据提供的插件开发文档进行相应过滤插件开发,通过插件开发方式,开发者可以更加专注于算法本身,而不需要过多关注框架的实现。
运行流程
Apollo 自动驾驶平台是以高精地图和定位模块作为核心。其他的模块都是以这两个模块为基础。感知模块识别自动驾驶汽车周围的环境,对环境信息和车内信息的采集、处理与分析,也即环境感知,它是智能车辆自主行驶的基础和前提。感知的结果会传递给后面的模块进行使用。
框架设计
原有的感知框架,lidar、camera、radar、fusion 四部分内容定义在四个模块中。Lidar 和 camera 每个模块内部功能复杂,学习成本较高。感知框架拆分后,模块依赖关系清晰。Lidar 和 camera 的感知流程分为多个模块,依赖关系呈线性状态;radar 和 fusion 的功能在单个模块内,功能如框图所示。感知新框架下,lidar 和 camera 相比之前每个模块功能更加轻量化,更有利于二次开发。每个组件都可以单独启动调试。
功能列表
Apollo 根据功能对模块做了进一步的划分,使得每个组件的功能更加聚焦,方便按需选择对应的模块进行优化升级,下面是整体的目录说明:
模块概述
目前 Apollo 采用组件的方式按需使用,同时为了方便扩展,例如更换模型,采用插件的方式来添加新的模型。
-
绿色代表用户经常需要替换的部分,需要开发新算法或功能,基于原有的框架只需要替换自己想要替换的部分,不需要关注消息流转和框架。
-
蓝色代表用户不需要经常替换的部分,模块集成了所有算法,功能是一个整体,直接通过配置修改功能,如果想要替换可以重新写一个组件。
lidar 检测流程
激光雷达检测用于 3D 目标检测,它的输入是激光雷达点云,输出为检测到的物体的类型和坐标。开发者关注较多的是pointcloud_map_based_roi、lidar_detection 和 lidar_detection_filter 三个组件。其中 pointcloud_map_based_roi 会涉及相关的 roi 过滤规则,lidar_detection 组件是目标检测过程中模型部署相关内容,Apollo 和 paddle3D 已经打通模型训练部署至 apollo 全流程,后续课程实践也会涉及该方面内容。Apollo lidar 感知模块提供 4 种目标检测模型,开发者可以根据配置文件,选择不同的检测器,来验证检测效果。通过最新的算法插件,开发者更加专注于算法本身,而不需要过多关注框架的实现。lidar_detection_filter 组件为检测障碍物过滤相关功能。激光雷达跟踪用于追踪上面检测到的 3D 目标对象,它的输入是激光雷达点云检测结果,输出为跟踪到对象的 ID。
camera 检测流程
camera 检测流程中,开发者的关注重心在 camera_detection_multi_stage、camera_detection_single_stage 以及 camera_tracking 组件,其中 camera_detection_multi_stage 和 camera_detection_single_stage 组件设计 2D、3D 模型部署、预处理等功能,开发者可以针对性的替换模型和开发相关功能,
camera_tracking 中功能整体性较强,开发者可以针对相应的追踪策略修改组件中的配置项。camera_detection_multi_stage 检测流程输出的是 2D boundingbox,相比于 camera_detection_single_stage 组件直接输出3d检测结果,多了将 2D 信息转换成 3D 障碍物信息的过程。
fusion 流程
多传感器融合模块对多个传感器的检测结果做融合。它的输入是 lidar、camera、radar 检测目标结果,输出是融合后的结果。其中列举几个重要基类的作用:BaseFusionSystem 相当于融合模块的入口,会初始化 ProbabilisticFusion 概率融合算法,BaseTracker 更新追踪到的轨迹状态,BaseGatekeeper用于判断是否发布追踪到的障碍物到最终通道中。
多传感器融合组件功能详细功能框图如下所示:
radar 检测流程
radar_detection 是一个完整的功能组件,其中包含预处理、检测、追踪以及相应过滤功能。
trafficlight检测流程
红绿灯检测流程开发者关注 traffic_light_detection 和 traffic_light_recognition 这两个组件,分别对应红绿灯检测和识别功能的模型部署等。
record下载
目前提供可以直接下载的 record 包有以下 2 种。
当然 Apollo 还提供了数据集转 record 的工具,方便开发者把开源数据集的数据转成 record 在 Apollo 中进行测试。工具的名称为adataset,支持的数据集有 KITTI、nusense。
模型下载
Apollo 提供预训练好的模型,用户可以通过 amodel 工具来下载和管理模型。开发者可以通过该工具下载安装模型仓库中的模型,展示系统中已经安装的模型和模型的详细信息。通过对模型进行标准化和模型管理工具,开发者可以非常方便的安装部署训练好的模型,并且管理这些模型,实现模型部署效率提升。
例如:要安装模型:
查看当前系统中有哪些模型:
当前已经支持模型下载地址:
lidar_segmentation
简介
lidar背景分割模块使用secondary_indices点云进行分割。Secondary indices是non_ground_indice和roi_indices的交集,并删除前景对象点索引。
目录结构
模块
LidarSegmentationComponent
apollo::perception::lidar::LidarSegmentationComponent
输入
输出
配置
如下 graph_segmentation 的配置。
如何启动
1. 在配置文件中的 modules/perception/data/params 中添加车辆参数配置文件,对应frame_id和sensor_name,启动transform命令
2. 修改 modules/perception/launch/perception_lidar.launch
-
选择要启动的 dag 文件,将 lidar_segmentation.dag 添加到 perception_lidar.launch
-
修改 msg_adapter。用于将其他步骤发送的消息包装为/apollo/perception/obstacles,可用于单独调试。修改modules/perception/data/flag/perception_common.flag中相关通道配置
3. 修改配置文件中
-
modules/perception/lidar_segmentation/conf/lidar_segmentation_config.pb.txt的参数
-
output_channel_name:输出通道名称
-
plugin_param:插件参数
-
name:方法名称
-
config_path:配置文件夹
-
config_file:配置文件名
4. 启动perceptio
简介
为了实现自动驾驶清扫,这个模块主要实现道路上的路沿实时感知 总体流程如下:
-
获取候选点: 候选点的语义类别需要是CURB,候选点到高精地图道路右边界的距离需要在规定的阈值内
-
过滤误检路沿点:有一些地面点可能会被语义模型识别为CURB,最近临搜索(NSS)算法被用来过滤掉这些误检的点
-
多帧路沿点融合:为了获取到车身右侧的路沿点,当前帧的路沿和历史帧的路沿进行了融合
-
路沿点排序:根据routing信息,对路沿点进行排序
-
路沿点平滑:根据选择的平滑器对路沿点进行平滑处理
-
路沿点下采样:对上述获取的路沿点进行下采样处理
-
将路沿点发布到通道中
目录结构
组件
PointCloudCurbComponent
apollo::perception::lidar::PointCloudCurbComponent
输入
>注意: 输入通道为结构体类型数据,默认触发通道为 /perception/lidar/pointcloud_ground_detection,详细输入通道信息在 modules/perception/pointcloud_curb_detection/dag/pointcloud_curb_detection.dag 文件中。
输出
>注意:该消息定义在 modules/common_msgs/perception_msgs/perception_obstacle.proto 文件中。详细的输出通道信息在 modules/perception/pointcloud_curb_detection/conf/pointcloud_curb_detection_config.pb.txt 文件中。
参数
-
name:方法名称
-
config_path:配置路径
-
config_file:配置文件名
-
output_channel_name:输出通道名称
-
planning_history_channel_name:routing历史通道名称
-
plugin_param:路沿检测器插件参数
-
map_search_range:地图的搜索范围
-
min_edge_range:候选路沿点到高清地图右边界的距离阈值
-
outlier_pt_num_thresh: 外点搜索个数阈值
-
neighbour_pt_num_thresh:搜索点个数阈值
-
neighbour_distance_thresh:搜索点范围阈值
-
mean_height_diff_thresh:平均高度阈值
-
height_standard_dev_thresh:标准差阈值
-
useble_num_thresh:最小路沿点个数
-
valid_distance:最小路沿长度
-
continuous_distance:连续路沿点距离阈值
-
sample_interval:路沿点采样间隔
-
max_sample_interval:路沿点最大采样间隔
-
max_distance_front_localization:imu前面路沿点的范围
-
max_distance_behind_localization:imu后面路沿点的范围
-
history_downsample_interval:历史路沿点采样间隔
-
smooth_bounds:路沿的平滑边界
-
conf_path:地图路沿配置的路径
-
conf_file:地图路沿配置的文件名
-
name:方法名称
-
config_path:配置路径
-
config_file:配置文件名
-
candidates_config:
-
filter_config:NNS算法的参数
-
fusion_config:
-
map_curb_conf:
-
plugin_param:平滑插件参数
-
poly_fit_pt_num_thresh:多项式拟合的最小点数
-
poly_fit_distance_thresh:多项式拟合性能评估的距离阈值
-
poly_fit_max_dis_thresh:多项式拟合的最大距离阈值
如何启动
1. 编辑launch_all.launch
在launch_all.launch中,激光雷达感知模块应该编辑为:
2. 启动launch_all.launch
pointcloud_semantics
简介
语义模块为点云中的每个点分配一个标签。
目录结构
模块
PointCloudSemanticComponent
apollo::perception::lidar::PointCloudSemanticComponent
输入
输出
如何启动
-
在配置文件中的 modules/perception/data/params 中添加车辆参数配置文件,对应 frame_id 和 sensor_name,启动transform模块
2. 修改 modules/perception/launch/perception_lidar.launch
-
选择要启动的 dag 文件,在 perception_lidar.launch 中添加 pointcloud_semantic.dag
-
修改 msg_adapter。用于将其他步骤发送的消息包装为/apollo/perception/obstacles,可用于单独调试。修改modules/perception/data/flag/perception_common.flag中相关通道配置
-
3. 修改配置文件中modules/perception/pointcloud_semantics/conf/pointcloud_semantic.pb.txt的参数
-
output_channel_name:输出通道名称
-
plugin_param:插件参数
-
name:方法名称
-
config_path:配置文件夹
-
config_file:配置文件名
4. 启动perception
介绍
经过预处理阶段的投影,在图片上得到了一个投影框,得到的投影框并不完全可靠,需要通过模型计算出信号灯的准确边界框。
目录结构
模块
TrafficLightDetectComponent
apollo::perception::onboard::TrafficLightDetectComponent
输入
>注意:输入通道为结构体类型数据,默认触发通道为 /perception/inner/Detection,详细的输入通道信息在 modules/perception/traffic_light_detection/dag/traffic_light_detection.dag 文件中,默认情况下组件接收的消息上游组件包括 traffic_light_region_proposal。
输出
>注意:输出通道为结构体类型数据。消息定义在modules/perception/common/onboard/inner_component_messages/traffic_inner_component_messages.h文件中,输出通道消息数据可由同一进程中的组件订阅,详细的输出通道信息在modules/perception/traffic_light_detection/conf/traffic_light_detection_config.pb.txt文件中。
配置参数
组件配置文件: modules/perception/traffic_light_detection/conf/traffic_light_detection_yolox_config.pb.txt
Yolox模型配置文件位置:modules/perception/traffic_light_detection/data/detection_yolox.pb.txt
如何启动
-
在配置文件中的 modules/perception/data/params 中添加车辆参数配置文件,对应 frame_id 和 sensor_name,启动transform
-
启动trafficlight感知 ```bash cyber_launch start /apollo/modules/perception/launch/perception_trafficlight.launch
简介
交通信号灯识别模块的目的是识别交通信号灯的颜色。识别模块的输入是一幅带有ROI信息的图像和一组边界框信息作为输入数据,输出是一个四维向量,分别表示每个边界框为黑色、红色、黄色和绿色的概率,当且仅当概率足够大时,概率最大的类将被识别为信号灯的状态。否则信号灯状态设置为Unknown,表示状态未确定。
目录结构
模块
TrafficLightRecognComponent
apollo::perception::onboard::TrafficLightRecognComponent
输入
>注意:输入通道为结构体类型数据,默认触发通道为 /perception/inner/Retection,详细的输入通道信息在 modules/perception/traffic_light_recognition/dag/traffic_light_recognition.dag 文件中,默认情况下组件接收的消息上游组件包括 traffic_light_detection。
输出
>注意:输出通道为结构体类型数据。消息定义在modules/perception/common/onboard/inner_component_messages/traffic_inner_component_messages.h文件中,输出通道消息数据可供同进程的组件订阅,详细的输出通道信息在modules/perception/traffic_light_recognition/conf/traffic_light_recognition_config.pb.txt文件中。
配置参数
组件配置文件:modules/perception/traffic_light_recognition/conf/traffic_light_recognition_config.pb.txt
efficient_net模型配置文件位置:modules/perception/traffic_light_recognition/data/efficient_net.pb.txt
如何启动
1. 在配置文件中的 modules/perception/data/params 中添加车辆参数配置文件,对应 frame_id 和 sensor_name,启动transform
2. 启动trafficlight感知 ```bash cyber_launch start /apollo/modules/perception/launch/perception_trafficlight.launch
组件开发指的是开发一个独立的组件(component),用于实现一个独立的功能。例如在点云感知中增加语义分割模型,可以开发一个独立的组件来实现。
创建文件夹
创建文件夹,以组件的名称命名。如下示例,pointcloud_ground_detection、pointcloud_map_based_roi、pointcloud_preprocess 每个文件夹代表一个 component。
组件代码
首先,创建组件的必要代码,如下所示:
然后,根据组件的输入、输出数据,定义组件类接口。
注意:接收数据类型如果是自定义的类、结构体,则新建 component 与上下游 component 在一个进程内启动,才能正常收发消息。接收的消息如果是 proto 定义的数据类型,则上下游组件在不同进程启动,也能够正常接受消息。
最后,实现 Init 方法,用于初始化加载参数。实现 Proc 函数,实现组件功能。
配置文件
在 proto 文件夹中定义 component 发送消息通道的名称,组件需要完成的功能的配置。代码结构如下:
通常配置定义示例如下。component 的配置文件放到 conf 中。
功能定义
在组件中声明该功能的基类,用于调用该功能。基类定义在 interface 中,功能代码定义在 function 文件夹中。
组件使用
组件的代码结构、功能定义好,就是使用组件。通过 dag 文件来配置组件的启动项,通过 launch 启动组件。
dag文件定义如下:
launch文件通常需要启动的 dag。如下所示:
在调试单个组件功能的时候会启动该组件的 launch,如果要启动这个感知,就需要在 launch 中定义所有需要启动的 dag,每个 dag 的上下游 channel 要一一对应。
启动 launch 的命令:
目前,Apollo 中提供了以下几个 lidar 检测模型:centerpoint,pointpillars,maskpillars,cnnseg。
为了支持用户将自己训练的 lidar 检测模型部署到 apollo 中,本文将以 centerpoint 模型和 paddle3d 开源代码仓库为基础,介绍用户如何在 apollo 中新增模型,包括:paddle3d 的安装、训练配置介绍、centerpoint 的训练评测和导出,以及如何部署 centerpoint 到 apollo 中查看效果。
CenterPoint训练
centerpoint 的完整训练流程可参考 AI Studio 项目:
-
【自动驾驶实战】基于Paddle3D&Apollo的Lidar目标物检测-飞桨AI Studio星河社区
-
【感知赛事】使用ApolloScape数据集训练CenterPoint - 飞桨AI Studio星河社区
1. 安装
2. 训练配置介绍
接下来将以 centerpoint_pillars_016voxel_kitti.yml 为例,介绍训练配置。
基础配置
AMP配置 amp_cfg
自动混合精度(Automatic Mixed Precision,以下简称为 AMP)指的是在训练时使用fp16精度,提升计算速度并降低存储空间。详细介绍参见 自动混合精度训练(AMP)。
数据集配置 train_dataset/val_datasets
SamplingDatabase
优化器配置 optimizer
学习率设置 lr_scheduler
模型配置 model
3. 训练流程介绍
接下来以 KITTI 数据集为例,训练 CenterPoint 模型。
数据准备
1. 首先请在 官网 进行下载相关数据
-
Download Velodyne point clouds, if you want to use laser information (29 GB)
-
training labels of object data set (5 MB)
-
camera calibration matrices of object data set (16 MB)
2.下载数据集的划分文件列表:
3. 将数据解压后按照下方的目录结构进行组织:
4. 在 Paddle3D 的目录下创建软链接datasets/KITTI,指向到上面的数据集目录:
5. 生成训练时数据增强所需的真值库:
-dataset_root指定 KITTI 数据集所在路径,--save_dir指定用于保存所生成的真值库的路径。该命令执行后,save_dir生成的目录如下:
注意:如果想用自己的数据集进行训练,推荐将自己的数据集组织为 KITTI 标准格式。
训练
KITTI 数据集上的训练使用 8 张 GPU:
训练启动参数介绍:
评估
注意:CenterPoint 的评估目前只支持 batch_size 为 1。评估启动参数介绍如下所示:
训练过程可视化
Paddle3D 使用 VisualDL 来记录训练过程中的指标和数据,我们可以在训练过程中,在命令行使用 VisualDL 启动一个 server,并在浏览器查看相应的数据
4. 导出模型介绍
运行以下命令,将训练时保存的动态图模型文件导出成推理引擎能够加载的静态图模型文件。
导出脚本参数介绍
运行完成之后,会输出如下的文件:
部署 CenterPoint 到 Apollo 中
接下来介绍如何将导出的 centerpoint 模型部署到 apollo 中,使用 centerpoint 模型进行 3d 目标检测:
1. CenterPoint部署配置
首先介绍一下 centerpoint 部署的配置,配置文件路径:/apollo/modules/perception/lidar_detection/data/center_point_param.pb.txt。
ModelInfo 配置,文件路径:modules/perception/common/proto/model_info.proto。
PointCloudPreProcess:
PointCloudPostProcess
centerpoint 独有的配置
2. 部署apollo并查看效果
apollo 的环境搭建参见 perception 2.0 综述。
进入 Docker 环境
上述步骤部署的是 apollo 官方的 centerpoint 模型,如果要部署自己的 centerpoint 模型:需要将上一步中导出的文件放置到/apollo/modules/perception/data/models/center_point_paddle下面即可:
启动Dreamview+
启动lidar感知程序
选择相应车型配置:
启动 transform 模块:
启动 lidar 感知模块:
下载并播放感知包
-
方式一:在 dreamview+ 左下角点击 Resource Manger,下载 sensor_rgb 数据包,下载完成后选择 sensor_rgb 数据包点击播放。
方式二:终端启动下载好的 sensor_rgb 数据包,下载链接参考开放资源record下载。
dreamview+ 查看 lidar 检测结果:
目前,Apollo 中提供了以下几个 lidar 检测模型:centerpoint,pointpillars,maskpillars,cnnseg。
为了支持用户将自己训练的 lidar 检测模型部署到 apollo 中,本文将以 centerpoint 模型和 paddle3d 开源代码仓库为基础,介绍用户如何在 apollo 中新增模型,包括:paddle3d 的安装、训练配置介绍、centerpoint 的训练评测和导出,以及如何部署 centerpoint 到 apollo 中查看效果。
CenterPoint训练
centerpoint 的完整训练流程可参考 AI Studio 项目:
-
【自动驾驶实战】基于Paddle3D&Apollo的Lidar目标物检测-飞桨AI Studio星河社区
-
【感知赛事】使用ApolloScape数据集训练CenterPoint - 飞桨AI Studio星河社区
1. 安装
2. 训练配置介绍
接下来将以 centerpoint_pillars_016voxel_kitti.yml 为例,介绍训练配置。
基础配置
AMP配置 amp_cfg
自动混合精度(Automatic Mixed Precision,以下简称为 AMP)指的是在训练时使用fp16精度,提升计算速度并降低存储空间。详细介绍参见 自动混合精度训练(AMP)。
数据集配置 train_dataset/val_datasets
SamplingDatabase
优化器配置 optimizer
学习率设置 lr_scheduler
模型配置 model
3. 训练流程介绍
接下来以 KITTI 数据集为例,训练 CenterPoint 模型。
数据准备
1. 首先请在 官网 进行下载相关数据
-
Download Velodyne point clouds, if you want to use laser information (29 GB)
-
training labels of object data set (5 MB)
-
camera calibration matrices of object data set (16 MB)
2. 下载数据集的划分文件列表:
3. 将数据解压后按照下方的目录结构进行组织:
4. 在 Paddle3D 的目录下创建软链接datasets/KITTI,指向到上面的数据集目录:
生成训练时数据增强所需的真值库:
-dataset_root指定 KITTI 数据集所在路径,--save_dir指定用于保存所生成的真值库的路径。该命令执行后,save_dir生成的目录如下:
注意:如果想用自己的数据集进行训练,推荐将自己的数据集组织为 KITTI 标准格式。
训练
KITTI 数据集上的训练使用 8 张 GPU:
训练启动参数介绍:
评估
注意:CenterPoint 的评估目前只支持 batch_size 为 1。评估启动参数介绍如下所示:
训练过程可视化
Paddle3D 使用 VisualDL 来记录训练过程中的指标和数据,我们可以在训练过程中,在命令行使用 VisualDL 启动一个 server,并在浏览器查看相应的数据
4. 导出模型介绍
运行以下命令,将训练时保存的动态图模型文件导出成推理引擎能够加载的静态图模型文件。
导出脚本参数介绍
运行完成之后,会输出如下的文件:
部署 CenterPoint 到 Apollo 中
接下来介绍如何将导出的 centerpoint 模型部署到 apollo 中,使用 centerpoint 模型进行 3d 目标检测:
1. CenterPoint部署配置
首先介绍一下 centerpoint 部署的配置,配置文件路径:/apollo/modules/perception/lidar_detection/data/center_point_param.pb.txt。
ModelInfo 配置,文件路径:modules/perception/common/proto/model_info.proto。
PointCloudPreProcess:
PointCloudPostProcess
centerpoint 独有的配置
2. 部署apollo并查看效果
apollo 的环境搭建参见 perception 2.0 综述。
进入 Docker 环境
上述步骤部署的是 apollo 官方的 centerpoint 模型,如果要部署自己的 centerpoint 模型:需要将上一步中导出的文件放置到/apollo/modules/perception/data/models/center_point_paddle下面即可:
启动Dreamview+
启动lidar感知程序
选择相应车型配置:
启动 transform 模块:
启动 lidar 感知模块:
下载并播放感知包
-
方式一:在 dreamview+ 左下角点击 Resource Manger,下载 sensor_rgb 数据包,下载完成后选择 sensor_rgb 数据包点击播放。
方式二:终端启动下载好的 sensor_rgb 数据包,下载链接参考开放资源record下载。
dreamview+ 查看 lidar 检测结果:
首先介绍各个组件的配置目录,以激光雷达检测模块为例:
公共配置目录,多个组件的公共配置放到modules/perception/data路径下:
全局配置
全局配置在 gflag 文件中定义,包括modules/perception/common/perception_gflags.h。
modules/perception/common/onboard/common_flags/common_flags.h:
修改配置
全局配置修改在/apollo/modules/perception/data/flag/perception_common.flag中,例如我们要修改obs_enable_hdmap_input的值为 false,可以在文件中添加:
组件配置
各个组件的配置在对应组件的 conf 和 data 目录,直接修改对应文件的值即可,以 3D 目标检测模块(lidar_detection)为例。
lidar_detection 模块配置文件路径:
-
modules/perception/lidar_detection/conf
-
modules/perception/lidar_detection/data
ModelInfo 配置,文件路径:modules/perception/common/proto/model_info.proto。
PointCloudPreProcess:
PointCloudPostProcess
cnnseg 配置 modules/perception/lidar_detection/detector/cnn_segmentation/proto/model_param.proto
centerpoint 配置在modules/perception/lidar_detection/data/center_point_param.pb.txt中,通过修改其中的值来选择不同配置。
感知的插件有两部分:lidar_detection_filter 的 object_filter_bank 中;pointcloud_map_based_roi 的 roi_filter 中。
插件机制是一个比组件更加轻量化的动态加载机制,其目的是让开发者可以更加聚焦到功能逻辑上,更加方便地进行功能扩展。插件开发独立性较强,能被组件灵活的使用,根据需要加载插件。 插件开发,以 lidar_detection_filter 为例。其中 object_filter_bank 中可以执行多种 filter,所有的 filter 都放到 std::vector<std::shared_ptr<BaseObjectFilter>> 中。
新建文件夹
在如下目录中新建文件夹,过滤器名称为 new_filter,用于放代码和相关配置。
功能定义
过滤器功能实现。
首先,继承 BaseObjectFilter 类,实现 Init(初始化配置项),Filter(功能代码),Name(获取类名称)。
然后,在 new_filter.h 最后定义:CYBER_PLUGIN_MANAGER_REGISTER_PLUGIN(apollo::perception::lidar::NewFilter, BaseObjectFilter)。以此说明此功能是插件形式开发。
插件的具体功能定义在 Filter 函数中。此函数接受的是点云当前帧的 frame,frame 中数据主要有以下几种:
-
点云,以及其索引;
-
非地面点云索引,roi 内点云索引;
-
检测障碍物(包括模型检测、背景聚类);
-
lidar 坐标系到世界坐标系的 pose;
-
主车一定范围内的高精地图信息。
lidar_detection_filter 是基于检测障碍物做的过滤,过滤功能由开发者根据实际情况自定义。
配置文件
在 object_filter_bank/proto 中定义 new_filter 的配置项,在 data/new_filter.pb.txt 中增加 new_filter 的配置。
插件管理
首先,BUILD 中的编译如下,插件需要用 apollo_plugin 的方式来编译。
然后,新建 new_filter/plugins.xml,并在其中定义:
插件使用
插件定义好之后,就可以使用插件。使用方法是:在配置文件 modules/perception/lidar_detection_filter/data/filter_bank.pb.txt 中增加此插件的配置。
配置好 new_filter 插件之后,启动 lidar_detection_filter 组件,运行感知,加载各个插件配置内容。当有数据进来时就 new_filter 就会执行 Filter 函数,完成过滤功能。