前言
本篇为上一篇感知模块的续篇,建议大家先阅读上一篇中关于感知框架的介绍,有助于对障碍物感知部分有一个概览性的了解[1]。
Apollo2.0框架及源码分析(二)
感知模块
在上一篇文章中我们探讨了Apollo2.0障碍物感知中Lidar部分的内容,本篇我将继续与大家分享障碍物感知部分(ObstaclePerception)中Radar和Fusion相关内容的分析。
Radar部分入口函数位置:
obstacle/onboard/radar_process_subnode.cc
voidRadarProcessSubnode::OnRadar(constContiRadarradar_obs);
相比Lidar部分的令人惊艳,Apollo2.0中Radar就稍显诚意不足了。Apollo2.0中Radar探测器模块名为“ModestRadarDetector”(“适度的雷达探测器”,从起名上就感觉Apollo2.0对Radar这部分有些不自信)。
Radar部分大体的实现方式与Lidar类似,可以看做是其简化版,其大体流程如下图所示。
Radar工作流程
从代码实现上来看,Radar的工作可分为以下3步:
1计算Radar的坐标转换矩这里有个细节十分有趣。雷达的世界坐标的转换矩阵是由以下代码来实现的。
*radar2world_pose=*velodyne2world_pose*short_camera_extrinsic_*radar_extrinsic_;
这段代码描述了这样一个式子:
Radar世界坐标=Lidar世界坐标*短摄像头参数*radar参数。
这个式子隐隐透露着,Apollo2.0的坐标体系是以Lidar为基准的。Apollo可能认为Velodyne的位置是最准确的,因此Camera的位置标定参考Velodyne,Radar的标定参考Camera。
2获取ROI区从高精度地图读取ROI区域,并将其转化为地图多边形(map_polygons)备用。Radar和Lidar使用了相同的函数来获取ROI区域和地图多边形,获得的ROI地图多边形处于世界坐标下。
函数位置:obstacle/onboard/hdmap_input.cc
voidHdmapROIFilter::MergeHdmapStructToPolygons(constHdmapStructConstPtrhdmap_struct_ptr,std::vectorPolygonDType*polygons)
函数位置:
obstacle/lidar/roi_filter/hdmap_roi_filter/hdmap_roi_filter.cc
voidHdmapROIFilter::MergeHdmapStructToPolygons(constHdmapStructConstPtrhdmap_struct_ptr,std::vectorPolygonDType*polygons)3探测障碍物
核心函数位置:
obstacle/radar/modest/modest_radar_detector.cc
boolModestRadarDetector::Detect(constContiRadarraw_obstacles,conststd::vectorPolygonDTypemap_polygons,constRadarDetectorOptionsoptions,std::vectorObjectPtr*objects);
这部分为Radar的核心部分,这段又可分为如下4步。
1.从原始数据构造object实现函数位置:
obstacle/radar/modest/object_builder.cc
voidObjectBuilder::Build(constContiRadarraw_obstacles,constEigen::Matrix4dradar_pose,constEigen::Vector2dmain_velocity,SensorObjects*radar_objects);
该部分涉及到了以下方面的内容:
判断该障碍物是否为background
object锚点(anchor_point)的坐标系转换:Radar坐标-世界坐标
速度的转化:相对速度-绝对速度;
我们重点阐述下第一项内容。Apollo提供了三种方式用来判断该障碍物是否为background:
a.根据障碍物出现的次数
当障碍物出现次数小于delay_frames_(默认值为4)时,认为它是background。
b.根据障碍物出现的存在概率和均根方值(rms)
实现函数位置:
obstacle/radar/modest/conti_radar_util.cc
boolContiRadarUtil::IsFp(constContiRadarObscontiobs,constContiParamsparams,constintdelay_frames,constinttracking_times)
当满足以下两个条件之一时,认为该障碍物是background
障碍物的存在概率小于Radar参数预设值
当障碍物在车身横纵两个方向上的距离或速度的rms大于Radar参数预设值
代码中对这个功能是这样实现的(为方便说明,这里隐去部分代码)。
boolContiRadarUtil::IsFp(constContiRadarObscontiobs,constContiParamsparams,constintdelay_frames,constinttracking_times){intcls=contiobs.obstacle_class();...if(cls==CONTI_CAR
cls==CONTI_TRUCK){...}elseif(cls==CONTI_PEDESTRIAN){...}elseif(cls==CONTI_MOTOCYCLE
cls==CONTI_BICYCLE){...}elseif(cls==CONTI_POINT
cls==CONTI_WIDE
cls==CONTI_UNKNOWN){...}...}
从中可以看出,Apollo对不同类型的障碍物分别进行了处理,也就是说,Apollo使用的Radar可以分辨出车、行人和自行车等不同的障碍物。
Apollo推荐使用的毫米波为Continental的ARS-21。ARS-21的介绍文档里也有简单提到,它可以对障碍物进行分类。
ARS-21特性介绍,图片来源:Continental