「Apollo」Apollo感知汇总

6 篇文章 6 订阅
订阅专栏

参考链接:3D obstacle Perception

1 感知Perception概览

整个apollo perception传感器架构图如下:
图1,来源见[1]
整个感知模块的硬件方面包括了多个相机、毫米波雷达(前后)、激光雷达;在算法方面使用了单传感器、多传感器融合后的检测、识别,能够对障碍物进行分类、跟踪和运动轨迹的预测,除此之外还能给出障碍物的运动信息(前进方向、加速度等),给出车道相与本车的相对位置。

各传感器数据流细节如下图:
图2,来源见[2]

1.1 感知模块 Input

  • 128线激光雷达数据
  • 16线激光雷达数据
  • 毫米波雷达数据
  • 图像数据(相机传感器)
  • 各传感器外参标定数据
  • 各相机内参标定数据
  • 车辆加速度和角加速度数据

1.2 感知模块 Output

  • 带航向、速度、分类信息的3D障碍物轨迹
  • 红绿灯检测和识别

2 3D障碍物感知模块

3D障碍物模块主要由三个模块组成:

  • 激光雷达感知
  • 毫米波雷达感知
  • 障碍物结果融合

2.1 激光雷达障碍物感知

2.1.1 感知流程

下面的步骤展示了Apollo框架中从激光雷达获取点云数据后的3D障碍物感知处理流程:

  • 高精地图ROI(Region of Interest)区域过滤
  • CNN分割
  • MinBox障碍物边框构建
  • HM障碍物跟踪
  • 时序类型融合
2.1.1.1 高精地图ROI过滤

ROI的作用是确定从高精地图中检索获取的可行驶区域,可行驶区域包括路面和路口。高精地图ROI过滤点云中ROI之外的数据,移除背景对象,例如道路周围的建筑物、数目,只留下之后处理步骤中需要的数据。给定一个高精地图后,点云之间的联系可以确定该点云是否属于ROI内部。每个激光点云点都能通过一张汽车周围2D量化的查询表(lookup table, LUT)查询到。

高精地图ROI过滤输入数据为由激光雷达捕捉到的点云数据,输出由高精地图定义的ROI范围内的点云切片,其中,高精地图的定义为一组多边形,每个多边形都是一个有序的点的集合。

Apollo高精地图ROI过滤通常由三个连续的模块组成:

  • 坐标转换
    在高精地图ROI过滤中,数据交互由一组多边形定义,每个多边形实际上是一组在世界坐标系下有序的点。在点云上执行一次询问要求点云和多边形在同一个坐标系中呈现,因此,Apollo将来自点云的数据和高精地图中的多边形均转换到激光雷达的相对坐标系下。

  • ROI LUT
    为了判断一个输入的点是否处于ROI范围内,Apollo采用了一个网格式的LUT,该LUT将ROI量化成一个鸟瞰2D网格。LUT覆盖了一个矩形区域,该矩形区域与高精地图边界上方的一般视图周围的预定义空间绑定。那么,LUT代表了与ROI关于每个网格之间的关系。为了提高计算效率,Apollo使用扫描线算法和位图编码来构建ROI LUT。

  • 带ROI LUT的点询问
    基于ROI LUT,每个输入点之间的联系通过一个两步确认的方式进行询问。对于点询问过程:

    1. 确认件该点是否在ROI LUT范围内
    2. 询问该点所在的网格,了解其与ROI的从属关系
    3. 收集所有属于ROI的点,输出它们与对应输入点云的切片

    最后,高精地图ROI过滤使用到的参数如下(参数名,用法,默认值):

    1. range,ROI LUT相对于激光雷达传感器的范围,120米
    2. cell_size,2D网格尺寸,0.25米
    3. extend_dist,ROI从多边形框延长的距离,0米
    4. no_edge_table,使用边界框产生多边形掩码,false
    5. set_roi_service,打开感知模块下激光雷达模组的ROI服务,true
2.1.1.2 CNN分割

通过高精地图ROI过滤确定周围环境后,Apollo获取了过滤后的点云,该点云只在ROI范围内,然后将这些点云数据投入分割模块中,该模块将前景障碍物从点云中检测和分割出来,包括汽车,卡车,自行车,行人等。

该模块输入数据是一组点云数据,输出一组与ROI中障碍物对应的一组对象。

Apollo使用一个深度卷积神经网络来检测和分割障碍物,整个CNN分割由一下连续部分构成:

  • 通道特征提取
    给定一个点云处理框架,apollo构建了一个相对坐标系下的2D方格鸟瞰视图,在相对坐标系下,每个预定义范围内的点被量化为一个基于网格坐标的点。经过量化后,Apollo计算了每个方格中点的8个统计测量值,这些值将会作为输入通道特征被投入CNN中。8个统计测量值如下:

    • 方格中的最大高度
    • 方格中最高点的强度
    • 方格中所有点的平均高度
    • 方格中所有点的平均强度
    • 方格中点的数量
    • 方格中心相对于激光雷达的角度
    • 方格中心与激光雷达的距离
    • 表明该方格空/被占用的二进制标志位
  • 基于CNN的障碍物预测
    经过通道特征提取后,Apollo使用一个深度全卷积神经网络(FCNN)来预测方格各自方格障碍物属性,包括相对于潜在对象中心(称为中心偏移)的偏移位移,客观程度,真实程度以及障碍物高等。

    模型输入数据为一个W×H×C方格的点云数据,其中W代表方格列,H代表方格的行,C代表通道特征的数量

    FCNN由三层组成:

    • 下游编码层(特征编码)
    • 上游解码层(特征解码)
    • 障碍物属性预测(预测器)

    特征编码器将通道特征图像(点云)作为输入且对其空间像素进行连续向下取样,不断抽象特征。之后,特征解码器对编码的特征图像向上取样至2D方格输入的空间像素,这一过程能恢复特征图像空间细节,方便各方格障碍物属性预测。

    向下和向上取样是通过带非线性激活函数的堆叠卷积/传递层实现的。经过解码器后输出的属性内容包括:中心偏移,客观程度,真实程度,障碍物高,类概率。

  • 障碍物聚类
    经过上面步骤后,Apollo获取了带五个属性的各方格的预测信息,即解码器输出的属性内容。为了产生障碍物对象,Apollo构建了一个有向图,基于方格中心偏移的预测结果,搜寻连接的组件作为候选对象簇。

    其中每个方格都是有向图中的一个节点,有向边界基于该方格的中心偏移预测结果构建,每个方格根据另一个方格指向它的父节点。

    在生成所有方格的有向图后,Apollo采用了一个压缩联合查找算法来高效查找构成障碍物的组件,每一个组件都是障碍物簇中的候选者。客观性表示一个方格是一个有效对象的概率。因此Apollo定义非对象方格的概率在0.5以下,最终过滤掉每个候选簇中的空的方格和非对象方格,余下构成障碍物的边界框。

    一个对象簇可由多个相邻连接的方格组成,且这些方格的根节点可能是相邻的。

    类概率是一个对象簇中所有障碍物(交通工具、行人、自行车人等)的概率总和。根据最大平均概率,障碍物的类型由对象簇最终分类结果决定。

  • 后处理
    经过聚类后,Apollo获得了一组对象簇,每一个对象簇都包含几个方格。在后处理步骤中,Apollo首先计算每个候选簇检测结果的置信分和对象高,计算由每个簇中方格的真实程度和对象高的平均值构成。之后,Apollo移除每个对象簇中相对于预测对象高过高的点,收集有效方格中的点。最后,Apollo移除低置信率或只有少量点的候选簇,输出最终的障碍物分割。

    cnn分割模块的参数路径于:modules/perception/production/data/perception/lidar/models/cnnseg/velodyne128/cnnseg_param.conf,其中包括的参数和用法如下(参数名,用法,默认值):

    1. objectness_thresh,在障碍物聚类步骤中过滤客观程度的阈值,0.5
    2. model_type,网络类型例如RTNet表示tensorRT加速网络,RTNet
    3. confidence_thresh,后处理步骤中过滤候选簇的检测置信分数阈值,0.1
    4. confidence_range,在相对于激光雷达距离的高质量检测的信任范围,85米
    5. height_thresh,后处理步骤中如果点的高度超过预测对象高的过滤阈值,0.5米
    6. min_pts_num,后处理步骤中过滤候选簇点数量的阈值,3
    7. ground_detector,地标检测类型,SpatioTemporalGroundDetector
    8. gpu_id,CNN障碍物预测网络中使用的GPU id,0
    9. roi_filter,高精地图下ROI过滤器类型,HdmapROIFilter
    10. network_param,不同caffe输入和输出blob类型,由层预定义
    11. feature_param{width},2D网格中X(列)轴的方格数量,864
    12. feature_param{width},2D网格中Y(行)轴的方格数量,864
    13. feature_param{min_height},相对激光雷达的最小高度,-5米
    14. feature_param{max_height},相对激光雷达的最小高度,5米
    15. feature_param{use_intensity_feature},打开输入通道强度特征,false
    16. feature_param{use_constant_feature},打开输入通道恒定特征,false
    17. feature_param{point_cloud_range},2D网格相对于激光雷达的范围,90米
2.1.1.3 MinBox障碍物边框构建

该模块为检测到的障碍物构建边界框。由于遮挡或距离对激光雷达的影响,点云形成障碍物可能存在稀疏或只覆盖了障碍物表面的一部分。因此,边界框构建器的工作就是恢复完整的边界框并给出边界框点。边界框的主要目的是估计障碍物的名称(例如,交通工具),即便点云数据是稀疏的。同样地,边界框也被用于可视化障碍物。

MinBox算法的思想是在给定多边形点的边界后寻找全部区域。例如,当给定两个点(形成一条边界后),Apollo映射其他多边形点到AB上,建立拥有最大距离的交点对。形成的边界是边界框中的一条。然后同样的方法获取边界框的其他边界。最后通过迭代多边形的所有边界,Apollo选择出一个带6条边界的边界框,选择拥有最小面积的解作为最终边界框。

2.1.1.4 HM障碍物跟踪

该模块是对分割步骤分割出的障碍物进行跟踪。通常,该功能通过综合当前检测结果和存在的跟踪表,形成并更新跟踪表。如果障碍物不再存在,则删除旧的跟踪表;如果存在新检测的障碍物而跟踪表上没有,则产生新的跟踪表。经过关联后,将会对新的跟踪表上障碍物的运动状态进行更新。

HM障碍物跟踪使用匈牙利算法进行检测和检测的关联,使用鲁棒卡尔曼滤波(RKF)对运动进行估计。

  • 检测和跟踪关联
    当把检测结果与现有的跟踪表进行关联时,Apollo构建了一个二分图,且使用匈牙利算法,通过衡量最短距离来查找最优的检测和跟踪匹配。

  • 计算距离关联矩阵
    第一步是先建立距离的关联矩阵。给定检测对象和跟踪对象之间的距离会根据一系列关联特征进行计算,部分HM跟踪器的距离计算特征有:位置距离(运动),方向距离(运动),边界框大小距离(外观),点数量距离(外观),直方图距离(外观)。除此之外,还有一些重要的距离权重参数也被使用,这些参数结合了上面提到的关联特征。最终将所有特征和参数都纳入最终的距离测量。

  • 通过匈牙利算法进行二分图匹配
    给定关联距离矩阵后,Apollo构建了一个二分图,并使用匈牙利算法计算最小距离查找出最佳检测和跟踪匹配。它解决了O(n^3)时间复杂度内的分配问题。为了提高计算性能,匈牙利算法是在将原始二分图切割成子图后,通过删除距离大于合理最大距离阈值的顶点来实现的。

  • 跟踪运动估计
    经过检测和跟踪关联后,HM对象跟踪使用鲁棒卡尔曼滤波(RKF)和很俗运动模型对当前跟踪表上的对象进行运动状态估计。运动状态包括信念锚点和信念速度,与3D位置和3D速度对应。为了克服可能存在的由不完美检测导致的干扰,鲁棒统计技术被加入到跟踪滤波算法中。

  • 观察冗余
    作为滤波算法输入的速度测量是从一系列冗余观察中挑选出来的,这些观测值包括锚点漂移,边界框中心漂移,边界框角点漂移。冗余观察增强了滤波测量的稳定性,因为所有观察结果同时失效出现的概率远远低于单个观察失效。

  • 突破
    高斯滤波算法假定噪声来自高斯分布。然而,这一假设在一个运动估计问题中却可能不成立,因为测量噪声可能来自一个厚尾分布。Apollo在过滤过程中使用一个突破阈值来中和更新增益的高估。

  • 根据关联质量更新
    原始卡尔曼滤波在更新状态时没有区分测量质量的好坏,然而测量质量是过滤过程中一个有益的指标且能够被估计。例如,关联步骤中的计算距离就可以是一个测量结果的合理评估。根据关联质量更新滤波算法的状态能够增加运动估计问题中的鲁棒性和平滑性。

    一个HM对象跟踪器的高抽象工作流包括:启动和预处理,预测和匹配,更新和收集。

    HM对象跟踪器工作流的主要点包括:

    1. 构建被跟踪对象,将它们转换到世界坐标
    2. 预测现有跟踪表的状态并且将检测结果与它们匹配
    3. 更新更新后的跟踪表的运动状态,并收集跟踪结果
2.1.1.5 时序类型融合

为平滑障碍物类型、减少整个轨迹中的类型转换,Apollo采用了一个基于线性链条件随机场的时序类型融合算法(a sequential type fusion algorithm based on a linear-chain Conditional Random Field (CRF)),表述如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中一元项对单个节点操作,二元节点对每条边界操作。

一元项中的概率是基于CNN预测的类概率输出。二元项中的状态转移概率由t-1时刻至t时刻障碍物类型转移建模,建模过程是从大量障碍物轨迹中进行统计学习。特别地,Apollo也使用学习后的混淆矩阵来表示从预测类型到实际类型的概率变化,以此优化原始基于CNN的类概率。

利用维特比算法(the Viterbi algorithm),连续的障碍物类型可以通过下面的公式优化:

在这里插入图片描述

2.1.2 实现细节

文件顺序下的实现流程:

  1. segmentation_component.cc
    |—lidar_obstacle_segmentation.cc
    | └pointcloud_preprocessor.cc(点云预处理)
    | └map_manager.cc(ROI高精地图获取)
    | └hdmap_input.cc + hdmap.cc + hdmap_impl.cc
    | └cnn_segmentation.cc(CNN分割)
    | └feature_generator.cc
2.1.2.1 segmentation_component.cc
  • bool SegmentationComponent::Init()
    读取配置文件,做一些变量初始化,创建writer结点,再初始化一些算法插件。

  • bool SegmentationComponent::InitAlgorithmPlugin()
    初始化分割组件segmentor_,计算lidar到novatel的坐标变换矩阵

  • bool SegmentationComponent::Proc()
    新建一个writer结点写到channel里的out_message,调用InitAlgorithmPlugin()函数,将该函数处理的结果写入channel

  • bool SegmentationComponent::InternalProc()
    该函数在前半段主要是做一些变量的更新(时间戳,out_message更新等)

    然后计算了传感器(激光雷达)到障碍物的坐标变换矩阵、传感器(激光雷达)到novatel的坐标变换矩阵,所有矩阵存储在变量lidar2world_trans_

    最后调用了segmentor_的Process方法,进入激光雷达分割(lidar_obstacle_segmentation.cc)

2.1.2.2 lidar_obstacle_segmentation.cc
  • bool LidarObstacleSegmentation::Init()
    除了配置文件读取、赋值,还对cloud_preprocessor_, map_manager_, segmentor_, builder_, filter_bank_进行了初始化

  • LidarProcessResult LidarObstacleSegmentation::Process()
    该函数是一个重载函数,另一个请查阅文件,这里只说被调用的一个

    该函数首先通过cloud_preprocessor_调用了Preprocess()函数对点云进行预处理,紧接着调用ProcessCommon()函数,执行ROI地图过滤、分割、边界框构建、过滤等工作。

  • LidarProcessResult LidarObstacleSegmentation::ProcessCommon()
    函数主要做了以下工作:

    1. 高精地图ROI过滤
    2. CNN点云分割
2.1.2.3 pointcloud_preprocessor.cc
  • bool PointCloudPreprocessor::Init()
    读取配置文件,变量赋值

  • bool PointCloudPreprocessor::Preprocess()
    首先对要处理的数据做了一些指针非空判断;然后开始对点云进行过滤,包括点云点中x, y, z任一维度是否为Nan,是否超过最大值范围(1e3/1000);接着将汽车周围一圈(范围可修改)的零散的点云去掉;最后还可以限制点云高度,将高度超过某一范围的点云过滤掉。

    经过滤后,调用TransformCloud()函数,计算了点云在世界坐标系下的每个点云的坐标。

  • bool PointCloudPreprocessor::TransformCloud()
    将点云从激光雷达坐标系转换到世界坐标系

2.1.2.4 map_manager.cc
  • bool MapManager::Init()
    读取配置文件,变量赋值和更新;初始化hdmap_input_变量

  • bool MapManager::QueryPose()
    该函数没写,但应该更新汽车pose,重新计算变换矩阵,如果时间差很小可以不更新。

  • bool MapManager::Update()
    该函数首先对将要处理的数据进行指针非空判断、变量重置等工作。

    紧接着调用QueryPose()函数对汽车pose进行更新。

    最后调用hdmap_input_对象的GetRoiHDMapStruct()方法,细节见2.1.2.5;执行完该函数后 ,ROI高精地图过滤部分算是完成了。

2.1.2.5 hdmap_input.cc + hdmap.cc + hdmap_impl.cc

(部分函数)

  • bool HDMapInput::GetRoiHDMapStruct()
    首先判断判断指针是否非空;接着调用hdmap_对象的GetRoadBoundaries()方法

  • int HDMap::GetRoadBoundaries()
    直接跳转到impl_对象的GetRoadBoundaries()方法

  • int HDMapImpl::GetRoadBoundaries()
    (该方法是一个重载函数)

    首先判断要处理的数据指针是否非空,重置了存储路面边界的road_boundaries和存储路口的junctions变量指针

    紧接着调用函数GetRoads()获取,该函数首先获取了道路信息,然后对每条道都进行id判断,最后通过id来获取最终所需的道路(我不知道,我乱讲的,反正大概这个意思,我没看,我什么都不知道);在获取到道路信息后,对每条道路都判断是否有路口信息,如果有,则将路口信息取出来。总之,经过该函数后,最终获取到了路面信息和路口信息。

    在获取到路面信息和路口信息后,由于这两类信息分别存储在两个变量中,因此紧接着调用MergeBoundaryJunction()函数,将存储路面和路口信息的变量整合到hdmap_struct_ptr指向的变量中;最后调用 GetRoadBoundaryFilteredByJunctions()利用路口信息过滤掉多余的路面信息。

2.1.2.6 cnn_segmentation.cc
  • bool CNNSegmentation::Init()
    读取cnn分割、推理模型的配置文件,变量赋值,初始化特征生成器feature_generator_、推理inference_、点云映射方格point2grid_

    最后调用了函数InitClusterAndBackgroundSegmentation()对聚类和背景分割做初始化

  • bool CNNSegmentation::InitClusterAndBackgroundSegmentation()
    初始化了背景检测器ground_detector_、ROI过滤器roi_filter_、spp网络spp_engine_、线程优化器worker_

    在这里进行了奇怪的一个功能:背景过滤。按理说不应该放在初始化模块,毕竟初始化模块还没接收点云数据,所以很奇怪。虽然不知道目的是什么,但我们先放个**?**在这里

  • void CNNSegmentation::MapPointToGrid()
    首先计算2D方格中每米有多少个cell;然后对每个点云点进行过滤,超过范围(+5 -5)则舍弃。

    然后调用函数GroupPc2Pixel(),将点云映射到2D网格中。这个函数一开始没看明白,后来发现它并不是将点云的三维数据x, y, z变成二维数据,而是用x, y这二维数据计算出了一个pos_x, pos_y(类似于对数据编码,后面会解码),并且后面会用这两个值做一些过滤工作,最终投入网络进行推理分割。在计算出pos_x和pos_y后,如果pos_x和pos_y的值分别超出范围(0, 5),则被过滤掉;没被过滤掉点使用公式pos_y * width_ + pos_x计算出一个值,存储到向量point2grid_中,其中point2grid_是一个长度等于所有点云长度的一个向量。

    映射到2D网格后,开始调用feature_generator_的Generate()方法,利用原始点云original_cloud_和上一步计算的point2grid_生成特征。

    特征生成后,再调用inference_对象的推理方法Infer(),进行推理

    最后调用GetObjectsFromSppEngine()函数,对分割后的对象进行MinBox聚类处理,处理完毕后该函数执行完毕,返回布尔真。

  • void CNNSegmentation::GetObjectsFromSppEngine()

  • bool CNNSegmentation::GetConfigs()

  • bool CNNSegmentation::Segment()
    首先判断传入的数据指针是否非空,接着判断激光雷达坐标系下的点云和世界坐标系下的点云指针是否非空,指针非空,再判断激光点云数量是否为0,激光点云和世界点云的点数量是否相同(应该相同)

    然后调用函数MapPointToGrid()将点云映射到方格中

    最后进行spp推理,获取障碍物对象

2.1.2.7 feature_generator.cc

(部分函数)

  • void FeatureGenerator::GenerateCPU()
    在接收到original_cloud_和point2grid_后,首先创建了一个864864的向量max_height_data_,并初始化,用于记录每个cell(一共864864个cell,每个cell包含多个点云点)中最高的点云点的值;然后做了一些内存分配。

    接着建立了一个for循环,循环次数为original_cloud_中包含的点云数量,循环内部对original_cloud_和point2grid_同时进行处理,其中original_cloud_和point2grid_中的点是一一对应的。接着开始遍历每个点云点,舍掉original_cloud_对应的point2grid_中值为-1的点,记录每个cell中最高点云的高度于max_height_data_中,并计算了每个cell的平均高度于mean_height_data_中。

2.2 毫米波雷达障碍物感知

考虑来自毫米被雷达的数据,可以使用下面基础的处理步骤。

首先,跟踪ID应该被扩展,因为Apollo需要全局ID进行障碍物关联。初始毫米波雷达提供只有8位的ID,因此这很难判断两幅相连帧中带相同ID的两个对象在跟踪历史中是否指的是同一个对象,尤其是在经历掉帧后。Apollo使用毫米波雷达提供的测量状态来处理这个问题。同时,Apollo为一个远离的对象分配一个新的跟踪ID,该远离的对象在之前帧中拥有和另一个对象相同的ID。

其次,使用假正过滤器来移除噪声。Apollo利用毫米波雷达数据设置了一些阈值来对可能是噪声的结果进行过滤。然后,将毫米波雷达数据作为统一的对象格式构建对象。Apollo通过标定将对象转换成世界坐标系下的对象。原始毫米波雷达提供对象的相对加速度,因此Apollo采用来自定位的主车速度。Apollo使用这两个指标定义被检测对象的绝对速度。

最后,高精地图ROI过滤器被用于获取感兴趣的对象。只有在ROI范围内的对象将被用于融合算法中。

2.3 障碍物结果融合

传感器融合模组的作用是融合激光雷达跟踪结果和毫米波雷达检测结果。Apollo首先根据障碍物跟踪ID将传感器识别结果和融合结果进行匹配。然后计算未被匹配的识别结果和融合结果之间的关联矩阵以寻求最佳匹配结果。

对于被匹配的传感器结果,使用自适应卡尔曼滤波(AKF)器更新相应的融合对象。对于未被匹配的传感器结果,创建一个新的融合对象。移除所有旧的不匹配的融合对象。

2.3.1 融合对象管理

Apollo有发布传感器(publish-sensor)的概念。给定的毫米波雷达结果是缓存的。给定的激光雷达结果触发融合操作。传感器融合输出的频率和发布传感器的频率是相同的。Apollo的发布传感器是激光雷达。传感器结果根据传感器时间戳投入到融合处理管道。Apollo保管所有传感器的结果。对象存活时间是为Apollo中不同传感器对象设定的。一个对象如果在至少一个传感器中存在,那么该对象的状态将保持活跃。Apollo感知模组提供汽车小范围内的激光雷达和毫米波雷达融合结果和长距离范围内的单毫米波雷达结果。

2.3.2 传感器结果与融合列表关联

当关联传感器结果到融合列表时,Apollo首先匹配相同传感器下的相同跟踪ID,然后构建一个二分图,使用最小距离损失的匈牙利算法,查找未被匹配的传感器结果和融合列表之间的最佳结果-融合匹配。这里使用的匈牙利算法和HM对象跟踪使用的匈牙利算法相同。距离损失是由传感器结果和融合结果之间对应锚点的欧氏距离计算得出。

2.3.3 运动融合

Apollo使用带恒定加速运动模型的自适应卡尔曼滤波(AKF)来估计当前对象的运动。运动状态包括信念锚点,信念速度,信念加速度,分别和3D位置,3D速度,3D加速度对应。Apollo只使用来自传感器的位置和速度作为基础。在运动融合中,Apollo捕捉所有传感器结果的状态,通过卡尔曼滤波计算加速度。Apollo提供激光雷达跟踪器和毫米波雷达检测器数据中的位置和速度的不确定性。Apollo将所有状态和不确定性投入自适应卡尔曼滤波器(AKF)中,获取融合结果。Apollo使用过滤过程中的突破阈值来中和更新增益中的过度估计。

  1. apollo感知硬件架构图
  2. apollo感知硬件数据流细节图
PointPillars点云检测在OpenPCDet推理代码详解
NNNNNathan的博客
02-24 7311
在之前的文章中已经详细解析了PointPillars的论文和训练代码的实现和详解,可以参考之前的博客:PointPillars论文解析和OpenPCDet代码解析_NNNNNathan的博客-CSDN博客。 本篇博客将会详细解析PointPillars模型在OpenPCDet中推理代码,并测试推理的效果。 读者可以下载OpenPCDet后根据文章进行阅读和理解。 由于本人才疏学浅,解析中难免会出现不足之处,欢迎指正、讨论,有好的建议或意见都可以在评论区留言。谢谢大家! PointPi...
自动驾驶从理论到实践】感知Apollo平台云实验“基于聚类的CPU感知
Derek_Robbie的博客
12-05 338
Apollo开发者社区 #《Robbie带你入门自动驾驶》免费课程→​自动驾驶感知技术是自动驾驶系统中的重要组成部分,它负责从环境中获取信息,为车辆的决策和控制提供关键的数据支持。自动驾驶感知”系列,将基于百度Apollo自动驾驶平台,介绍自动驾驶感知的原理、技术以及在实践中的应用,旨在帮助读者深入了解自动驾驶感知领域的发展现状和未来趋势。
【百度Apollo】探索自动驾驶:深入了解Apollo平台视觉感知的原理
最新发布
鸽芷咕的博客
04-30 5846
百度Apollo自动驾驶视觉感知模块凭借其高度集成、实时性、准确性、适应性和开放性等特点,在自动驾驶领域具有广泛的应用前景。随着技术的不断发展和优化,Apollo视觉感知模块将为实现更加安全、智能的自动驾驶提供有力支持。
apollo7.0 初探------激光雷达感知测试
龙性的腾飞的博客
05-04 3365
​之前一直有看过apollo的程序,一般都是参考某个模块直接去看代码,并没有完整的安装跑一下官方的程序,趁假期简单安装熟悉了一下基于cyber的apollo7.0, 准备后面完整的调试一下感知各个模块。 我用的笔记本环境:Ubuntu18.04 cuda10.2 nvidia-driver 470.103.01 ,GPU GTX 1650的,只有4个G显存,有点卡,勉强能跑起来, 主要就是参考apollo github和官网的文档, 大部分没什么问题,简单说一下我遇到的需要注意的几个小问题。 ​
Apollo课程学习4——感知
weixin_43476492的博客
08-12 2271
Apollo课程学习4——感知学习前言感知的概述一、什么是感知二、感知的任务1、检测与分类2、跟踪3、语义分割三、图像分类器步骤传感器的选择和标定一、传感器的选择1、相机2、激光雷达3、毫米波雷达二、传感器的安装三、传感器标定四、传感器融合感知算法一、点云感知1、启发式方法:NCut2、深度学习方法:CNNSeg二、视觉感知2.1 CNN检测2.2 CNN分割2.3 后处理三、红绿灯感知四、机器学习五、神经网络1、神经网络简介2、学习(训练)——后向传播3、卷积神经网络(CNN)Apollo感知
Apollo 障碍物感知5大板块(推荐了解)
黎国溥
11-06 6822
本文章来自:Apollo开发者社区 原创:阿波君 环境感知自动驾驶汽车应用中占据了核心地位。一辆车要实现自动驾驶,障碍物感知是最基础也是最核心的功能。 Apollo 障碍物感知系统分为基于3D激光点云的障碍物检测、基于图像的障碍物检测、红绿灯识别、多传感器融合、后处理等五大模块。 环境感知主要包括静态、动态的目标检测和当前环境场景的语义分割。采用人工智能技术中的深度卷...
apollo_构建minbox
qq_33993729的博客
11-21 537
MinBox障碍物边框构建 from https://github.com/YannZyl/Apollo-Note 对象构建器组件为检测到的障碍物建立一个边界框。因为LiDAR传感器的遮挡或距离,形成障碍物的点云可以是稀疏的,并且仅覆盖一部分表面。因此,盒构建器将恢复给定多边形点的完整边界框。即使点云稀疏,边界框的主要目的还是预估障碍物(例如,车辆)的方向。同样地,边框也用于可视化障碍物。 算法背后的想法是找到给定多边形点边缘的所有区域。在以下示例中,如果AB是边缘,则Apollo将其他多边形点投影到
Apollo感知模块详解与实践2
12-08
Apollo感知模块详解与实践2 Apollo感知模块是自动驾驶系统的重要组成部分,负责对车辆周围的环境进行感知和检测,以确保车辆的安全运行。本篇文章将对Apollo感知模块进行详细的介绍和实践,包括感知模块的启动方法...
Apollo感知模块详解与实践
12-08
"Apollo感知模块详解与实践" Apollo感知模块是自动驾驶系统中的一部分,负责对周围环境的感知和理解,以提供必要的信息给后续的规划控制模块。该模块主要包括Camera、LiDAR、Fusion等几个部分,每个部分都有其特定...
Apollo学习笔记-感知简介
12-14
9. Apollo感知Apollo学习笔记-感知简介中,Apollo感知Apollo的核心组件之一。Apollo感知包括三维对象检测、交通灯、技术路线等步骤。 三维对象检测:在高精地图使用感兴趣区域ROI,将ROI过滤器用于点云和图像...
apollo的安装包,版本2.1.0
03-19
apollo配置中心github下载的安装包,版本2.1.0
内部机密!!!Apollo感知模块算法详解.pdf
03-14
内部机密!!!Apollo感知模块算法详解.pdf
Apollo感知模块算法详解.pdf
08-15
Apollo感知模块算法详解
中文翻译 Action Tubelet Detector for Spatio-Temporal Action Localization 中文版本
03-28
本资源 利用人工+机器 翻译了 Action Tubelet Detector for Spatio-Temporal Action Localization 如有错误,望指出
apollo-1.9.2 全部源码
02-25
apollo 全部源码
自动驾驶】基于点云的避障算法笔记
AI知识搬运工
01-14 3206
1,点云数据预处理与可视化 激光雷达数据获取的这一步有一些需要满足的条件: 雷达需确保能够扫描到地面,VLP-16雷达的竖直平面视角为[-15,15 ],需根据这个视角,确保地面可以被扫描到; 地面和非地面数据最好可以有个很明显的竖直维度的落差,以便可以区分地面和非地面。 满足上面两个条件后,可以对采集的数据进行处理。 先将其转换为(x,y,z)的点云数据,拿到数据后,可以使用 MATLAB可视化,也可使用python工具包mayavi来可视化 mayavi使用实列: from ma..
SECOND——论文与代码解析
xiaohu的博客
01-25 1528
基于 LiDAR 或基于 RGB-D 的目标检测被用于从自动驾驶到机器人视觉的众多应用中。一段时间以来,基于体素的 3D 卷积网络在处理点云 LiDAR 数据时被用于增强信息的保留。然而,问题仍然存在,包括推理速度慢和方向估计性能低。因此,我们研究了一种用于此类网络的改进稀疏卷积方法,该方法显着提高了训练和推理的速度。我们还引入了一种新形式的角度损失回归来提高方向估计性能和一种新的数据增强方法,可以提高收敛速度和性能。.............................................
Apollo无人驾驶平台中多传感器标定
南七小僧的学海无涯
06-30 703
是无人车最基础也是最核心的模块之一。作为软件层提供的第一项服务,标定质量和准确度极大地影响着等模块。在 Apollo 开源自动驾驶平台中,我们提供了丰富的多传感器标定服务,如等多种传感器之间的标定。算法覆盖常规 Level 2-Level 4 级别自动驾驶的传感器配置和标定需求。
second.pytorch代码分析(code-framework & tricks)
AutoXTruck专栏
12-06 4250
简述 之所以想写这篇博客,主要原因在于阅读别人的代码时候,首先希望把流程架构弄清楚,然后才方便进行修改。second.pytorch代码量比较大,刚开始拿到时候,我也是一头雾水,硬着头皮往下面去看,配置环境(没有跑起来的建议去下载我的docker镜像,深度学习的利器,避免二次配置软件环境问题),让其跑起来方便调试来进行阅读。话不多说,现在开始进行简要分析一下second.pytorch点云检测这部...
利用Go语言编程实现基于线性同余算法的伪随机数发生器。
04-05
实现基于线性同余算法的伪随机数发生器,可以使用以下代码: ```go package main import ( "fmt" "time" ) const ( a = 1664525 c = 1013904223 m = 4294967296 // 2^32 ) func rand(seed int64) int { return int((a*seed + c) % m) } func main() { seed := time.Now().UnixNano() for i := 0; i < 10; i++ { fmt.Println(rand(seed)) seed = int64(rand(seed)) } } ``` 在代码中,我们定义了三个常量:a、c和m,它们分别对应线性同余算法中的乘数、增量和模数。然后,我们定义了一个rand函数,它接受一个种子值作为参数,并返回一个伪随机数。该函数的实现基于线性同余算法。最后,我们在main函数中使用当前时间戳作为种子值,并输出10个伪随机数。 需要注意的是,线性同余算法的随机性是有限的,因此不能用来生成高质量的加密密钥或者密码。如果需要生成高质量的随机数,建议使用专门的密码学随机数生成器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 「Numpy」解析numpy.mean函数对高维数组求均值 7636
  • 「Apollo」百度Apollo感知模块(perception)红绿灯检测代码完整+详细解析 6861
  • 「Python」超简单!Python返回矩阵最大元素/最小值坐标,三行搞定!(更新:一行搞定!) 6832
  • 「Self-driving: KITTI」KITTI数据集简介 6475
  • 「Ubuntu」仓库 “https://mirrors.tuna.tsinghua.edu.cn/ubuntu focal Release” 没有 Release 文件。 6326

分类专栏

  • C++ 9篇
  • 3dObjectDetection 2篇
  • MacOs 8篇
  • SLAM 2篇
  • Ubuntu 9篇
  • Apollo 6篇
  • Github 1篇
  • Self-driving 1篇
  • Caffe 1篇
  • CV 2篇
  • SVN 5篇
  • Numpy 2篇
  • Docker 1篇
  • ProtocolBuffer 2篇
  • LeetCode 1篇
  • Pandas 1篇
  • TensorFlow 2篇
  • Python 20篇
  • Jupyter 5篇

最新评论

  • 「Apollo」Cyber RT 学习笔记

    青山的青: cyber的实现是这样的,单个文件60s 或 2G 会分片

  • 「Apollo」Cyber RT 学习笔记

    ZCONG呀: 为什么cyber_record录制的数据自动按照2.2G大小分割数据包呢

  • 「Python」python调用多个C++文件生成的动态库(.so)Part II

    Liiipseoroinis: 你把查找的路径打印出来,和存放so库的地方对比就行了

  • 「Python」python调用多个C++文件生成的动态库(.so)Part II

    MisterCC: 我的python也说一直找不到so文件的位置,咋解决的

  • 「Numpy」解析numpy.mean函数对高维数组求均值

    Sss1mple: a[0, :, :, :]与a[1, :, :, :]这个一出来瞬间就懂了,文章非常好

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 「C++」C++ Primer Plus 笔记:第八章 函数探幽
  • 「3D Object Detection」点云目标检测、分割框架
  • 「C++: Cmake」CMake Tutorial 入门笔记
2023年2篇
2022年26篇
2021年43篇
2020年14篇
2019年4篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码福永网站改版西乡网站排名优化大鹏外贸网站建设南联模板网站建设布吉seo网站优化大鹏网站搜索优化大浪推广网站石岩网站推广工具民治网页设计广州SEO按天计费深圳优化横岗SEO按效果付费惠州网站改版爱联网站优化排名爱联关键词按天计费木棉湾外贸网站建设大运网站推广方案平湖模板推广大运标王大浪网站开发沙井网站推广系统福田百度关键词包年推广西乡网站制作民治百姓网标王沙井网站优化按天收费坪山至尊标王福永高端网站设计西乡百姓网标王观澜seo网站推广光明标王歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化