php发展

首页 » 常识 » 预防 » 开发者说Apollo20框架及
TUhjnbcbe - 2021/1/23 20:15:00
北京专科白癜风医院         http://wapyyk.39.net/bj/zhuanke/89ac7.html

前言

本篇为上一篇感知模块的续篇,建议大家先阅读上一篇中关于感知框架的介绍,有助于对障碍物感知部分有一个概览性的了解[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

1
查看完整版本: 开发者说Apollo20框架及