前言
基本介绍
激光雷达感知dag文件为modules/perception/production/dag/dag_streaming_perception_lidar.dag
,其中分别存在DetectionComponent
、RecognitionComponent
、FusionComponent
、V2XFusionComponent
四个组件。
DetectionComponent
该组件的功能是处理激光点云消息,获得对应的障碍物信息LidarFrameMessage
并发布至相关话题。
该组件包含一个TransformWrapper
对象,用于监听静态坐标变换和动态坐标变换,获得传感器坐标系和组合导航坐标系以及世界坐标系之间的变换关系。另外,该组件包含一个LidarObstacleDetection
对象,用于对点云消息进行预处理和识别,该对象包含PointCloudPreprocessor
对象,负责点云的预处理,还包含PointPillarsDetection
,负责点云的识别检测(具体工作是通过PointPillars
来完成的)
DetectionComponent::Init
首先读取配置文件,该组件配置文件定义可参考modules/perception/onboard/proto/lidar_component_config.proto
message LidarDetectionComponentConfig {
optional string sensor_name = 1;
optional bool enable_hdmap = 2;
optional double lidar_query_tf_offset = 3;
optional string lidar2novatel_tf2_child_frame_id = 4;
optional string output_channel_name = 5;
}
然后需要读取传感器元数据,元数据的读取是通过SensorManager
来完成的,其在初始化时会读取modules/perception/production/data/perception/common/sensor_meta.pt
的包含所有传感器元数据的列表,定义可参考modules/perception/proto/sensor_meta_schema.proto
:
message SensorMeta {
enum SensorType {
UNKNOWN_SENSOR_TYPE = -1;
VELODYNE_64 = 0;
VELODYNE_32 = 1;
VELODYNE_16 = 2;
LDLIDAR_4 = 3;
LDLIDAR_1 = 4;
SHORT_RANGE_RADAR = 5;
LONG_RANGE_RADAR = 6;
MONOCULAR_CAMERA = 7;
STEREO_CAMERA = 8;
ULTRASONIC = 9;
VELODYNE_128 = 10;
}
enum SensorOrientation {
FRONT = 0;
LEFT_FORWARD = 1;
LEFT = 2;
LEFT_BACKWARD = 3;
REAR = 4;
RIGHT_BACKWARD = 5;
RIGHT = 6;
RIGHT_FORWARD = 7;
PANORAMIC = 8;
}
optional string name = 1;
optional SensorType type = 2;
optional SensorOrientation orientation = 3;
}
// 感知模块传感器元信息列表
message MultiSensorMeta {
repeated SensorMeta sensor_meta = 1;
}
读取完成后,会将所有的传感器元数据加入到键值对为传感器名称和元数据的关联容器中,在SensorManager::GetSensorInfo
函数中,就会根据传感器的名称在关联容器中找到对应的传感器元数据
LidarObstacleDetection::Init
在进行LidarObstacleDetection
的初始化时,需要通过ConfigManager
获得初始化文件,其会获得modules/perception/production/conf
路径下所有的config_manager.config
文件,该文件包含一系列的model_config_path
,每个路径包含一个MultiModelConfigProto
消息,ConfigManager
会将所有的model_configs
以传感器名称为键添加到关联容器中,在ConfigManager::GetModelConfig
函数中,会根据传感器名称找到对应的model_configs
,然后会根据传感器的名称在modules/perception/production/data/perception/lidar/models/lidar_obstacle_pipeline
文件夹下找到对应传感器的lidar_obstacle_detection.conf
配置文件,获得LidarObstacleDetectionConfig
配置消息,定义可参考:
message LidarObstacleDetectionConfig {
optional string detector = 1 [default = "PointPillarsDetection"];
optional bool use_map_manager = 2 [default = true];
optional bool use_object_filter_bank = 3 [default = true];
}
PointCloudPreprocessor::Init
预处理对象PointCloudPreprocessor
初始化时,会通过ConfigManager
获得初始化文件pointcloud_preprocessor.conf
,获取预处理配置消息PointCloudPreprocessorConfig
,定义可参考:
message PointCloudPreprocessorConfig {
optional bool filter_naninf_points = 1 [default = true];
optional bool filter_nearby_box_points = 2 [default = false];
optional float box_forward_x = 3 [default = 0];
optional float box_backward_x = 4 [default = 0];
optional float box_forward_y = 5 [default = 0];
optional float box_backward_y = 6 [default = 0];
optional bool filter_high_z_points = 7 [default = false];
optional float z_threshold = 8 [default = 5.0];
}
然后会通过该配置消息初始化数据成员。
PointPillarsDetection::Init
检测对象 PointPillarsDetection
会根据命令行参数初始化PointPillars
对象,各参数可参考modules/perception/common/perception_gflags.cc
TransformWrapper::Init
tf监听器会根据传感器坐标系的名称进行初始化
DetectionComponent::Proc
该函数会订阅话题,获得激光点云消息,进行预处理和识别后,获得识别结果LidarFrameMessage
,并发布至相应话题。
LidarFrameMessage
点云的处理消息类型,包含处理的阶段、类型、点云处理数据等参数。
LidarFrame
该结构体包含预处理后的点云、世界坐标系下预处理后的点云以及识别出的物体
Object
识别物体结构体,包含朝向,位置类别等信息,种类可参考:
enum class ObjectType {
UNKNOWN = 0,
UNKNOWN_MOVABLE = 1,
UNKNOWN_UNMOVABLE = 2,
PEDESTRIAN = 3,
BICYCLE = 4,
VEHICLE = 5,
MAX_OBJECT_TYPE = 6,
};
PointCloudPreprocessor::Preprocess
首先进行预处理,会根据预处理配置消息PointCloudPreprocessorConfig
,对点云进行预处理,包括去除点云中的nan点和坐标大于阈值的点,去除组合导航坐标系下原点周围长方形范围的激光点,去除高度高于阈值的激光点
PointPillarsDetection::Detect
进行识别,首先会通过射线ID和voxel grid
的方法进行降采样,得到降采样之后的点云;然后会与之前数帧的点云进行融合,更新点云容器;然后会随机将点云打乱,转换为列表,传入至训练好的深度学习模型中,获得预测信息,由此获得检测的障碍物信息。
障碍物信息包括障碍物的种类(目前只支持CAR
、PEDESTRIAN
、CYCLIST
、UNKNOWN
四种类型)、位置、朝向、识别框顶点坐标。
总结
激光雷达感知模块需要transform模块、定位模块提供的激光雷达坐标系、组合导航坐标系以及世界坐标系之间的变换关系,而变换关系是通过订阅tf
,static_tf
话题获得的。感知模块经过深度神经网络,可以获得物体的类别、大小、位置信息。
疑问
激光雷达感知是否可以获得物体的速度?