主要内容

模型视觉传感器检测

本示例展示了如何为不同驾驶场景建模和模拟汽车视觉传感器的输出。生成合成视觉检测对于测试和验证角落情况下或传感器硬件不可用时的跟踪和传感器融合算法非常重要。本示例分析了视觉检测和传感器融合算法之间的差异前向碰撞警告(FCW)场景、超车场景和下坡场景的确定和车辆-地面真实位置和速度。

在本例中,以编程方式生成视觉检测。您还可以使用驾驶场景设计器例如,请参见以交互方式创建驾驶场景并生成合成传感器数据.

介绍

装有高级驾驶员辅助系统(ADAS)功能或被设计为全自动驾驶的车辆通常依赖多种类型的传感器。这些传感器包括声纳、雷达、激光雷达和视觉。一个可靠的解决方案包括一个传感器融合算法,以结合系统中包含的各种类型传感器的强度。有关多传感器ADAS系统中合成检测的传感器融合的更多信息,请参见基于合成雷达和视觉数据的传感器融合.

当使用合成检测来测试和验证跟踪和传感器融合算法时,了解生成的检测如何模拟传感器的独特性能特征非常重要。每种汽车传感器都提供了一组特定的优点和缺点,这些优点和缺点有助于融合解决方案。本示例介绍了汽车视觉传感器的一些重要性能特征,并说明了如何使用合成检测对传感器性能进行建模。

视觉传感器模型

本例使用visionDetectionGenerator生成合成视觉传感器检测。visionDetectionGenerator为汽车视觉传感器的以下性能特征建模:

的优势

  • 良好的横向位置和速度精度

  • 每个目标报告一次检测

弱点

  • 纵向位置和速度精度差

  • 无法检测被遮挡的目标

  • 高架目标的纵向偏差

结合自动化驾驶场景

创建前向碰撞预警(FCW)测试场景,用于演示如何使用汽车视觉传感器测量目标位置。该场景由一辆移动的自我车和一辆静止的目标车组成。ego车辆的初始速度为50公里每小时,然后使用刹车以达到3米/秒^2的恒定减速。然后车辆在目标车辆后保险杠前1米完全停止。

rng违约; initialDist=75;% mfinalDist=1;% minitialSpeed = 50;%公里brakeAccel = 3;% m / s ^ 2[场景,egoCar]=helperCreateSensorDemoScenario(“FCW”, initialDist, initialSpeed, brakeAccel, finalDist);

前向视觉传感器

创建一个安装在ego车辆前挡风玻璃上的前向视觉传感器,距离地面1.1米。传感器向下倾斜1度,每0.1秒生成一次测量值。传感器的摄像头具有480×640像素的成像阵列和800像素的焦距。传感器可以在单个图像中定位物体精度为5像素,最大检测范围为150米ActorProfiles属性指定仿真中视觉传感器看到的车辆的物理尺寸。

visionSensor=visionDetectionGenerator(...“传感器索引”1....“UpdateInterval”, 0.1,...“传感器位置”(0.75 * egoCar。轴距0),...“高度”, 1.1,...“投球”1....“内在论”,cameraIntrinsics(800、[320 240]、[480 640]),...“BoundingBoxAccurance”5,...“最大范围”, 150,...“ActorProfiles”,actorProfiles(场景))
visionSensor = visionDetectionGenerator属性:SensorIndex: 1 UpdateInterval: 0.1000 SensorLocation:[2.1000 0]高度:1.1000偏航:0节:1卷:0 intrinsic: [1 x1 cameraIntrinsics] DetectorOutput:“对象只有”FieldOfView: [43.6028 - 33.3985] MaxRange: 150 MaxSpeed: 100 MaxAllowedOcclusion: 0.5000 MinObjectImageSize:[15 15]使用get显示所有属性

视觉检测仿真

通过提前场景的仿真时间,模拟视觉传感器测量目标车辆的位置。视觉传感器从自我车辆坐标系中表示的真实目标姿态(位置、速度和方向)生成检测。

视觉传感器配置为以0.1秒的间隔生成检测,这与典型汽车视觉传感器的更新率一致。但是,为了精确地模拟车辆的运动,场景模拟每0.01秒进行一次。传感器返回一个逻辑标志,有效时间,当视觉传感器达到其所需的更新间隔时即为真,表明此模拟时间步将生成检测。

%创建FCW场景的显示[bep, figScene] = helperCreateSensorDemoDisplay(scenario, egoCar, visionSensor);指标=结构;%初始化结构以收集场景度量虽然推进(场景)%更新车辆位置gTruth = targetPoses (egoCar);%获取目标在车辆坐标中的位置%生成时间戳视觉检测时间=scenario.SimulationTime;[dets,~,isValidTime]=视觉传感器(gTruth,时间);如果有效时间更新鸟瞰图与检测和道路边界helperUpdateSensorDemoDisplay(bep, egoCar, visionSensor, dets);%为离线分析收集视觉检测和地面真相metrics = helperCollectScenarioMetrics(metrics, gTruth, det);结束%为发布的示例拍摄快照helperPublishSnapshot(figScene,时间>=6);结束

位置测量

在FCW测试期间,目标车辆与ego车辆之间的距离跨越了一个大范围的值。通过比较视觉传感器测量的目标车辆纵向和横向位置与目标车辆的地面真实位置,可以观察传感器测量位置的准确性。

使用HelperPlotSensor解调将纵向和横向位置误差绘制为视觉传感器报告的测量位置与目标车辆地面真实值之间的差值。目标车辆的地面真实参考点是目标车辆后轴中心正下方地面上的点,即在汽车保险杠前1米处。

helperPlotSensorDemoDetections(指标、“位置”,“倒车档”6 [6]);显示目标车辆的后悬垂tgtCar = scenario.Actors (2);rearOverhang = tgtCar.RearOverhang;次要情节(1、2、1);持有在…上; 地块(-Rearhang*[1],ylim,“k”);持有;传奇(“错误”,“2 \σ噪声”,“后方过剩”);

视觉传感器将目标在摄像机图像中的位置转换为自我车辆坐标系统中的纵向和横向位置。传感器通过假设图像中检测到的点位于同一高度的平坦道路上进行转换。

纵向位置测量

对于前向视觉传感器配置,纵向位置测量主要来自目标在摄像机图像中的垂直位置。

对象在图像中的垂直位置与对象在道路上方的高度密切相关,但与对象与摄影机的距离弱相关。当物体离开传感器时,这种弱相关性会导致单目视觉传感器的纵向位置误差变大。左侧上图中的纵向位置误差显示了当目标车辆远离传感器时,传感器的纵向误差如何快速增加。传感器的纵向美元\σ2美元当目标车辆的地面真值范围小于30米时,测量噪声小于1米,但在距离目标车辆70米以外的范围内,测量噪声增加到5米以上。

纵向位置误差也显示-1米的偏差之间的经度测量的视觉传感器和目标的地面真实位置。-1米偏差表明传感器一致地测量目标比目标车辆的地面真实位置更接近自我车辆。视觉传感器不是将目标近似为空间中的单个点,而是模拟车辆车身的物理尺寸。在FCW场景下,视觉传感器可以看到目标车辆的后方。在检测中产生的-1米的偏差从这一边对应车辆的后悬架。车辆的后悬架定义了车辆的后侧和后轴之间的距离,这是地面真值参考的位置。

横向位置测量

对于前向视觉传感器配置,横向位置是从目标在相机图像中的水平位置导出的。

与纵向位置不同,在视觉传感器的图像中,物体的横向位置与它的水平位置紧密相关。这种强相关性产生精确的横向位置测量,不会随着物体与传感器的距离而迅速衰减。在前面右边的图中,横向位置误差随着距离的增加而缓慢增长。的美元\σ2美元传感器报告的测量噪声在70米的地面真值范围内保持在0.2米以下。

速度测量与目标遮挡

用两辆目标车辆(一辆引导车和一辆超车)创建一个驾驶场景,以说明视觉传感器纵向和横向速度测量的准确性。引导车位于ego车辆前方40米处,以相同的速度行驶。超车从ego车辆旁边的左车道开始,经过ego车辆,并汇入领头车后面的右车道。此合并操作生成纵向和横向速度分量,使您能够比较传感器沿这两个维度的精度。

因为前车在传感器的正前方,所以它有一个纯纵向速度分量。通过的汽车具有纵向和横向速度分量的速度剖面。当汽车超过自我车并进入右车道时,这些部件会发生变化。将传感器测量到的目标车辆的纵向和横向速度与地面真实速度进行比较,说明视觉传感器能够观察这两种速度分量。

创建传递场景leadDist=40;% m速度=50;%公里passSpeed = 70;%公里mergeFract = 0.55;%将55%合并到右车道[场景,egoCar]=helperCreateSensorDemoScenario(“传递”, leadDist, speed, passSpeed, mergeFract);

视觉传感器速度测量的配置

视觉传感器无法从单一图像确定物体的速度。为了估计速度,视觉传感器会在多幅图像中比较物体的运动。对多幅图像中提取的目标位置进行平滑滤波处理。除了估计速度外,该滤波器还产生平滑的位置估计。要调整滤波器应用的平滑量,您可以设置传感器的处理噪声强度。传感器的过程噪声应设置为传感器必须检测到的目标的最大加速度量级。

取上一节中使用的视觉传感器,将其配置为从平滑滤波器生成位置和速度估计值,过程噪声强度为5 m/s^2。

%配置平滑滤波器使用的视觉传感器噪声强度释放(visionSensor);visionSensor.ProcessNoiseIntensity=5;% m / s ^ 2%对经过的汽车场景使用角色配置文件visionSensor。ActorProfiles= actorProfiles(scenario);

使用helperRunSensorDemoScenario来模拟自我和目标车辆的运动。该函数还收集模拟的指标,就像之前为FCW驾驶场景所做的那样。

snapTime = 5.9;%为发布而拍摄快照的模拟时间metrics=helperRunSensorDemoScenario(scenario、egoCar、visionSensor、snapTime);

使用HelperPlotSensor解调将视觉传感器的纵向和横向速度误差绘制为传感器报告的测量速度与目标车辆的地面真实值之间的差值。

helperPlotSensorDemoDetections(指标、“速度”,“时间”,[-25]);子批次(1,2,1);图例(“前置车错误”,“铅车2\sigma噪音”,“过车错误”,“超车2\sigma噪音”);

纵向速度测量

前向视觉传感器通过比较传感器的纵向位置测量在传感器更新间隔之间的变化来测量纵向速度。由于传感器的纵向位置误差随距离的增大而增大,因此纵向速度误差也随目标距离的增大而增大。

前面左边的图显示了通过车辆的纵向速度误差。由于前导车与视觉传感器保持恒定的距离,其误差(显示为红点)显示的是相同的美元\σ2美元整个场景中的测量噪声。但是,过往车辆与传感器之间的距离不是恒定的,但随着车辆通过传感器并向前导车辆移动,该距离会增加。超车车辆在2秒时首次进入传感器视野时,其纵向速度误差(显示为黄点)很小。在场景的这一点上,过往车辆靠近视觉传感器。从2秒到6秒,过往车辆正在远离ego车辆并接近领头车。其纵向速度误差随着其与传感器的距离增加而增大。一旦超车进入领头车后面的右车道,它将与传感器保持恒定的距离,并且美元\σ2美元测量噪声保持不变。

横向速度测量

前向视觉传感器通过比较传感器的横向位置测量值在传感器更新间隔之间的变化来测量横向速度。由于传感器的横向位置误差与目标距离传感器的距离没有很强的相关性,因此横向速度误差与目标距离的相关性也很小。

来自过往车辆场景的横向速度误差显示在前面右边的图中。在整个场景中,来自领头车(红点)和通过车(黄点)的误差具有几乎相同的测量噪声。经过的汽车报告的横向速度误差显示,当它离开传感器时,几乎没有变化。

部分遮挡目标的检测

在前面的速度误差图中,在场景的前6秒内可靠地检测到先导车(红点)。当车辆第一次进入摄像机视野时,会在2秒钟内检测到过往车辆(黄点)。然后在两辆目标车辆上生成检测,直到6秒。6秒时,超车并入右车道,并在ego车辆和领头车之间移动。对于场景的其余部分,超车部分遮挡了视觉传感器对领头车的视图。55%的领头车后侧被遮挡,传感器仅能看到45%进行检测。铅车的这种遮挡视图阻止传感器在摄像机图像中找到汽车并产生检测。

视觉传感器提供可靠检测的能力在很大程度上取决于其检测对象的无障碍视图。在密集交通中,场景中车辆的可见性会随着车辆之间距离的变化以及车辆进出车道而迅速变化。无法保持对障碍目标的检测,这对处理视觉传感器检测的跟踪算法提出了挑战。

使用视觉传感器重新运行经过的车辆场景,该传感器可以在目标可视区域被遮挡高达60%的情况下检测目标。

%配置视觉传感器,最大支持60%的遮挡万博1manbetx释放(视觉传感器);visionSensor.MaxAllowedOcclusion=0.6;%运行模拟并收集检测结果和地面真相,以进行离线分析metrics=helperRunSensorDemoScenario(scenario、egoCar、visionSensor);绘制纵向和横向速度误差图helperPlotSensorDemoDetections(指标、“速度”,“时间”,[-25]);子批次(1,2,1);图例(“前置车错误”,“铅车2\sigma噪音”,“过车错误”,“超车2\sigma噪音”);

在上图中,领头车(红色点)和超车(黄色点)的速度误差均显示。观察到的错误性能与以前相同,但现在,在经过的车辆以6秒的速度合并到其后面后,对领头车辆的检测将保持不变。通过调整允许的最大遮挡,可以模拟视觉传感器对目标遮挡的敏感度。

目标高程的纵向位置偏差

对象在摄影机图像中的垂直位置与其高于道路的高度密切相关。由于单目视觉传感器根据其摄像机图像中物体的垂直位置生成纵向位置测量值,因此,对于距离车辆不同高度的目标,可能会产生较大误差。当对象改变高程时,传感器错误地将相机图像中的垂直位移解释为对象纵向位置的变化。

再次运行FCW场景,将目标车辆放置在比ego车辆初始位置低2米的位置。自我飞行器在接近目标飞行器时沿着一个小山坡向下。当自我车辆下坡时,目标车辆在摄像机图像中的垂直位置发生变化,使传感器测量的纵向位置产生偏差。

%创建FCW下山场景initialDist=75;% mfinalDist=1;% minitialSpeed = 50;%公里brakeAccel = 3;% m / s ^ 2[场景,egoCar]=helperCreateSensorDemoScenario(“FCW”,initialDist,initialSpeed,brakeAccel,finalDist,false,2);%在FCW下山场景中使用actor配置文件释放(视觉传感器);visionSensor.ActorProfiles=ActorProfiles(场景);%运行模拟并收集检测结果和地面真相,以进行离线分析snapTime=3;%为发布而拍摄快照的模拟时间metrics=helperRunSensorDemoScenario(scenario、egoCar、visionSensor、snapTime、true);

绘制目标车辆在小丘下降时产生的位置误差。

helperPlotSensorDemoDetections(指标、“位置”,“倒车档”,[-66;080]);子批次(1,2,1);xlim([-1060]);ylim([080]);图例(“错误”,“2 \σ噪声”);

上面的图显示了下山场景的纵向位置误差(在左边)和横向位置误差(在右边)。注意,在纵向位置误差图中,误差轴的极限已被增加,以适应目标相对于摄像机传感器的高度引起的大偏差,因为自我车辆下坡。

当距离目标车辆75米时,ego车辆开始下降。由于ego车辆在下坡时向下倾斜,因此目标出现在靠近相机图像顶部的升高位置。当ego车辆下山时,目标车辆在摄像机图像中的位置从图像顶部移动并穿过地平线。对于单目视觉传感器,位于摄像机图像中地平线附近的目标被映射到距离传感器很远的位置。(根据定义,地平线上的点位于无穷远处。)视觉传感器不会对出现在相机图像中地平线上方的对象生成检测,因为这些点不会映射到道路表面上的位置。

当车辆在图像中的位置远离视界时,其纵向位置的巨大变化也会导致传感器的平滑滤波器产生较大的纵向速度估计。传感器拒绝速度超过它的检测最大速度所有物当目标车辆接近摄像机地平线时,目标高度产生的这些较大纵向速度也会阻止传感器产生检测。

当自我车辆距离目标车辆约40米时,目标车辆的图像位置已经越过地平线,传感器的速度估计满足其最大速度约束。在此距离,视觉传感器开始从目标车辆产生检测。将摄像机视界附近的目标位置映射到远离传感器的道路上的点,解释了单目视觉传感器在开始检测目标车辆时所建模的巨大纵向误差。纵向偏差继续减少,因为自我车辆接近山底,目标的位置远离摄像机图像的地平线。在自我载具下降的最后,目标与自我载具处于同一高度。只有-1米的偏差对应的目标车辆的后悬垂是存在的。传感器的横向位置误差没有显示偏差,因为自我飞行器在下坡时的俯仰不会改变目标在摄像机图像中的水平位置。

行人和车辆检测

视觉传感器在其相机图像中检测物体的能力取决于物体在图像中所占的像素数。当图像中物体的大小较大(数百像素)时,传感器可以轻松识别物体并生成检测。然而,当图像中物体的大小较小(数十像素)时传感器可能找不到它,也不会产生检测。物体在摄像机成像阵列上的投影尺寸是物体物理尺寸及其与摄像机距离的函数。因此,当车辆距离摄像机比行人更远时,车辆和行人的尺寸可能相似这意味着视觉传感器将比较小的物体(行人)在更长的范围内检测到较大的物体(车辆)。

在传感器前面75米处有静止的汽车和行人的情况下再次运行FCW场景。此场景说明了这两个对象的传感器检测范围的差异。ego车辆、静止车辆和行人都放置在同一标高上。

%创建FCW测试场景initialDist=75;% mfinalDist=1;% minitialSpeed = 50;%公里brakeAccel = 3;% m / s ^ 2[场景,egoCar]=helperCreateSensorDemoScenario(“FCW”,initialDist,initialSpeed,brakeAccel,finalDist,true);%在FCW下山场景中使用actor配置文件释放(视觉传感器);visionSensor.ActorProfiles=ActorProfiles(场景);%运行模拟并收集检测结果和地面真相,以进行离线分析snapTime=5;%为发布而拍摄快照的模拟时间metrics=helperRunSensorDemoScenario(scenario、egoCar、visionSensor、snapTime);

绘制FCW场景中目标车辆和行人产生的位置误差。

helperPlotSensorDemoDetections(指标、“位置”,“倒车档”, [-6 6]); 传奇(“汽车故障”,“汽车2西格玛噪音”,“行人错误”,“行人2西格玛噪声”);

上图显示了视觉传感器检测目标车辆和行人时产生的纵向位置误差(左侧)和横向位置误差(右侧)。目标车辆(显示为红色)的检测误差产生于本试验中包括的最远范围(75 m),但行人(显示为黄色)的误差不会出现,直到ego车辆达到约30 m的距离。探测范围的差异是由于这两个物体的大小不同造成的。

传感器在距离小于12 m时停止从行人产生检测。在此范围内,行人与摄影机光轴的偏移会将行人移动到摄影机水平视野之外。由于目标车辆直接位于摄像头前面,因此在整个FCW测试中,目标车辆将保持在摄像头图像的中心位置。

一些视觉传感器可以检测图像尺寸较小的物体,使传感器能够在更长的范围内检测物体。在前面的场景中,传感器对行人的检测受到行人宽度(0.45米)的限制,行人宽度比汽车宽度(1.8米)窄得多。要将传感器对行人的检测范围增加到40米,请计算摄像头图像中40米处行人的宽度。

查找为行人建模的物理宽度

profiles=actorProfiles(场景);pedWidth=profiles(3).Width%在相机图像中计算距离ego车辆40米处行人的像素宽度摄像机范围=40视觉传感器。传感器位置(1);focalLength=visionSensor.Intrinsics.focalLength(1);pedImageWidth=焦距长度*pedWidth/摄像机范围
pedWidth=0.4500 pedImageWidth=9.4987

在40米处,行人在相机图像中的宽度为9.5像素。将视觉传感器的最小物体宽度设置为与40米处的行人宽度相匹配。

%配置传感器以检测40米范围内的行人。释放(视觉传感器);visionSensor.MinObjectImageSize(2)=图像宽度
visionSensor=visionDetectionGenerator,具有以下属性:SensorIndex:1 UpdateInterval:0.1000 SensorLocation:[2.1000 0]高度:1.1000偏航:0俯仰:1滚动:0内部函数:[1x1 cameraIntrinsics]检测器输出:“仅对象”视野:[43.6028 33.3985]最大范围:150最大速度:100最大允许遮挡:0.6000最小对象图像大小:[15 9.4987]检测概率:0.9000误报图像:0.1000使用get显示所有属性

再次运行场景并绘制位置错误,以显示车辆和行人的修正检测范围。

%运行模拟和收集检测和地面真相脱机%的分析。metrics=helperRunSensorDemoScenario(scenario、egoCar、visionSensor);目标车辆和行人的位置错误。helperPlotSensorDemoDetections(指标、“位置”,“倒车档”, [-6 6]); 传奇(“汽车故障”,“汽车2西格玛噪音”,“行人错误”,“行人2西格玛噪声”);

上图显示了视觉传感器的纵向位置误差(左侧)和横向位置误差(右侧),视觉传感器配置为支持40米范围内的行人检测。车辆(显示为红色)仍然检测到最远的测试范围,但现在检测到行人(显示为黄色)在距离传感器40米的地方产生。万博1manbetx

车道边界测量和车道遮挡

视觉检测生成器也可以配置为检测车道。重新创建领头车和超车的双车道驾驶场景,以说明视觉传感器车道边界测量的准确性。相同的合并操作用于车道标记的遮挡。

创建传递场景leadDist=40;% m速度=50;%公里passSpeed = 70;%公里mergeFract = 0.55;%将55%合并到右车道[场景,egoCar]=helperCreateSensorDemoScenario(“传递”, leadDist, speed, passSpeed, mergeFract);

视觉传感器车道边界测量的配置

配置上一节中使用的视觉传感器,并将其配置为从平滑滤波器生成位置和速度估计值,过程噪声强度为5 m/s^2。

配置视觉传感器来检测车道和物体释放(visionSensor);visionSensor。DetectorOutput =车道和对象的;%对经过的汽车场景使用角色配置文件visionSensor。ActorProfiles= actorProfiles(scenario);

使用helperRunSensorDemoScenario来模拟自我和目标车辆的运动。

snapTime = 5.9;%为发布而拍摄快照的模拟时间helperRunSensorDemoScenario(scenario, egoCar, visionSensor, snapTime);

如上图所示,当呈现一个未被遮挡的视图时,默认检测器可以看到45米左右的车道边界。你可以改变探测器的性质来观察它的效果。

显示相机固有。visionSensor.Intrinsics
ans=具有以下属性的cameraIntrinsics:FocalLength:[800]PrincipalPoint:[320 240]图像大小:[480 640]径向失真:[0 0]切向失真:[0 0]倾斜:0内部矩阵:[3x3双精度]
%增加焦距并观察其效果。释放(视觉传感器);visionSensor.Intrinsics=cameraIntrinsics([1200 1200]、[320 240]、[480 640])HelperUnsensorDemoScenario(scenario、egoCar、visionSensor、snapTime);
visionSensor=visionDetectionGenerator,具有以下属性:SensorIndex:1 UpdateInterval:0.1000 SensorLocation:[2.1000 0]高度:1.1000偏航:0俯仰:1滚动:0内部函数:[1x1 cameraIntrinsics]检测器输出:'车道和对象'视野:[29.8628 22.6199]最大范围:150最大速度:100最大允许遮挡:0.6000最小对象图像大小:[15 9.4987]MinLaneImageSize:[20 3]检测概率:0.9000误报图像:0.1000使用get显示所有属性

在x方向和y方向上将焦距从800像素改变为1200像素可以使相机变焦,使其能够探测到更远的范围。

总结

该示例演示了如何使用合成检测对汽车视觉传感器的输出进行建模。特别是,它介绍了visionDetectionGenerator型号:

  • 提供精确的横向位置和速度测量,但在长期纵向精度有限

  • 根据场景中目标的物理尺寸和目标被其他目标遮挡的情况限制检测

  • 包括位于不同于ego车辆高度的目标的纵向偏差

  • 由于单目摄像头的固有特性,调整对象和车道检测。

另见

应用程序

物体

相关话题