主要内容

模型视觉传感器检测

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

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

简介

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

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

视觉传感器模型

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

的优势

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

  • 每个目标报告一个检测

弱点

  • 纵向位置和速度精度差

  • 无法探测被遮挡的目标

  • 提高目标的纵向偏差

FCW驱动场景

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

rng默认的;initialDist = 75;% mfinalDist = 1;% minitialSpeed = 50;%公里brakeAccel = 3;% m / s ^ 2[scenario, egoCar] = helperCreateSensorDemoScenario(“结合”, initialDist, initialSpeed, brakeAccel, finalDist);

前向视觉传感器

创建一个前方视觉传感器安装在自我车辆的前挡风玻璃上,距离地面1.1米。传感器向下倾斜1度,每0.1秒产生一次测量结果。该传感器的相机具有480 × 640像素的成像阵列,焦距为800像素。该传感器可以在单个图像中定位目标,精度为5像素,最大检测范围为150米。的ActorProfiles属性指定视觉传感器在模拟中看到的车辆的物理尺寸。

视觉传感器=视觉检测器(...“SensorIndex”, 1...“UpdateInterval”, 0.1,...“SensorLocation”(0.75 * egoCar。轴距0),...“高度”, 1.1,...“节”, 1...“intrinsic”, cameraIntrinsics(800, [320 240], [480 640]),...“BoundingBoxAccuracy”5,...“MaxRange”, 150,...“ActorProfiles”actorProfiles(场景))
visionSensor = visionDetectionGenerator with properties: SensorIndex: 1 UpdateInterval: 0.1000 SensorLocation: [2.1000 0] Height: 1.1000 Yaw: 0 Pitch: 1 Roll: 0 Intrinsics: [1x1 cameraIntrinsics] DetectorOutput: 'Objects only' FieldOfView: [43.6028 33.3985] MaxRange: 150 MaxSpeed: 100 MaxAllowedOcclusion: 0.5000 MinObjectImageSize: [15 15] DetectionProbability: 0.9000 FalsePositivesPerImage: 0.1000使用get显示所有属性

视觉检测仿真

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

视觉传感器配置为以0.1秒的间隔生成检测,这与典型汽车视觉传感器的更新速率一致。然而,为了准确地模拟车辆的运动,场景模拟每0.01秒向前推进一次。传感器返回一个逻辑标志,isValidTime,当视觉传感器达到所需的更新间隔时为真,表明该仿真时间步长将产生检测。

为FCW场景创建显示[bep, figScene] = helperCreateSensorDemoDisplay(scenario, egoCar, visionSensor);Metrics = struct;初始化结构以收集场景指标推进(场景)%更新车辆位置gTruth = targetpose (egoCar);在自我车辆坐标中获得目标位置生成带有时间戳的视觉检测时间= scenario.SimulationTime;[dets, ~, isValidTime] = visionSensor(gTruth, time);如果isValidTime更新鸟瞰图与探测和道路边界helperUpdateSensorDemoDisplay(bep, egoCar, visionSensor, dets);收集视觉检测和地面真相,用于离线分析。metrics = helperCollectScenarioMetrics(metrics, gTruth, dets);结束为已发布的示例拍摄快照helperPublishSnapshot (figScene、时间> = 6);结束

位置测量

在FCW测试期间,目标车辆与自我车辆的距离范围很广。通过将视觉传感器测量到的目标车辆纵向和横向位置与目标车辆地面真实位置进行比较,可以观察到传感器测量位置的精度。

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

helperPlotSensorDemoDetections(指标、“位置”“反向范围”, [-6 6]);显示目标车辆的后悬垂tgtCar = scenario.Actors(2);rearOverhang = tgtCar.RearOverhang;次要情节(1、2、1);持有;plot(-rearOverhang*[11 1], ylim,“k”);持有;传奇(“错误”“2 \σ噪声”“后方过剩”);

视觉传感器将目标在相机图像中的位置转换为自我车辆坐标系中的纵向和横向位置。传感器通过假设图像中检测到的点位于与自我车辆海拔相同的平坦道路上来进行这种转换。

纵向位置测量

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

物体在图像中的垂直位置与物体在道路上方的高度密切相关,但与物体与相机的距离密切相关。这种弱相关性导致单目视觉传感器的纵向位置误差随着物体远离传感器而变得很大。上图左边的纵向位置误差显示了当目标车辆远离传感器时,传感器的纵向误差迅速增加。传感器纵向美元\σ2美元当地面真实距离目标车辆小于30米时,测量噪声小于1米,但在距离自我车辆超过70米时,测量噪声增大到5米以上。

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

横向位置测量

对于面向前方的视觉传感器配置,横向位置由摄像机图像中的目标水平位置派生。

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

速度测量和目标遮挡

创建一个有两个目标车辆(一辆领先的车和一辆路过的车)的驾驶场景,以说明视觉传感器纵向和横向速度测量的准确性。前车被放置在前车前方40米处,并以相同的速度行驶。超车从左侧车道开始,与自我车辆并排,超过自我车辆,并与领先车辆后面的右侧车道合并。这种合并操作生成纵向和横向速度分量,使您能够在这两个维度上比较传感器的精度。

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

%创建通过场景leadDist = 40;% m速度= 50;%公里passSpeed = 70;%公里mergeFract = 0.55;合并55%进入右车道[scenario, 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(场景,egoCar, visionSensor, snapTime);

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

helperPlotSensorDemoDetections(指标、“速度”“时间”, [-25 25]);次要情节(1、2、1);传奇(“前导车错误”“领先车2\sigma噪声”'传递汽车错误'“超车2\sigma噪声”);

纵向速度测量

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

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

横向速度测量

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

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

部分遮挡目标的检测

在前面的速度误差图中,领先车(红色点)在场景的前6秒内被可靠地检测到。经过的汽车(黄色点)在2秒后首次进入相机视野时被检测到。然后在6秒内对两辆目标车辆进行检测。6秒后,超车进入右车道,行驶在第一辆车和第一辆车之间。在剩下的场景中,路过的汽车部分遮挡了视觉传感器对领头车的视野。前车后侧55%的位置被遮挡,只有45%的位置可以被传感器探测到。前车的遮挡视图阻止传感器在相机图像中找到该车并产生检测。

视觉传感器提供可靠检测的能力强烈依赖于它所检测的物体的无障碍视图。在密集的交通中,车辆的能见度会随着车辆之间的距离变化以及车辆进出车道而迅速变化。这种无法保持对障碍物目标的检测对处理视觉传感器检测的跟踪算法提出了挑战。

使用视觉传感器重新运行通过车辆的场景,该传感器可以检测到多达60%的目标可视区域被遮挡的目标。

配置视觉传感器以支持60%的最大遮挡金宝app释放(visionSensor);visionSensor。MaxAllowedOcclusion = 0.6;运行模拟并收集检测和地面真相以进行离线分析。metrics = helperRunSensorDemoScenario(场景,egoCar, visionSensor);绘制纵向和横向速度误差helperPlotSensorDemoDetections(指标、“速度”“时间”, [-25 25]);次要情节(1、2、1);传奇(“前导车错误”“领先车2\sigma噪声”'传递汽车错误'“超车2\sigma噪声”);

在上面的图中,前车(红色点)和过往车(黄色点)的速度误差都显示出来了。与之前观察到的错误性能相同,但现在在经过的汽车在6秒后与它合并后,对领先汽车的检测仍然保持。通过调整最大允许遮挡,您可以模拟视觉传感器对目标遮挡的敏感性。

从目标仰角的纵向位置偏差

一个物体在相机图像中的垂直位置与它高于道路的高度密切相关。由于单目视觉传感器从其相机图像中物体的垂直位置产生纵向位置测量,因此从自我车辆的不同高度的目标可能会产生较大的误差。当物体改变仰角时,传感器会错误地将相机图像中的垂直位移解释为物体纵向位置的变化。

再次运行FCW场景,将固定的目标车辆放置在比自我车辆初始位置低2米的位置。自我车辆在接近目标车辆时下降一个小山丘。当自我车辆下山时,目标车辆在相机图像中的垂直位置会发生变化,从而在传感器测量的纵向位置中引入偏差。

创建FCW山坡下降场景initialDist = 75;% mfinalDist = 1;% minitialSpeed = 50;%公里brakeAccel = 3;% m / s ^ 2[scenario, egoCar] = helperCreateSensorDemoScenario(“结合”, initialDist, initialSpeed, brakeAccel, finalDist, false, 2);为FCW下山场景使用角色配置文件释放(visionSensor);visionSensor。ActorProfiles= actorProfiles(scenario);运行模拟并收集检测和地面真相以进行离线分析。snapTime = 3;%用于发布快照的模拟时间metrics = helperRunSensorDemoScenario(scenario, egoCar, visionSensor, snapTime, true);

画出当自我车辆下到小山坡时为目标车辆产生的位置误差。

helperPlotSensorDemoDetections(指标、“位置”“反向范围”, [-6 6;0 80]);次要情节(1、2、1);xlim (60 [-10]);ylim (80 [0]);传奇(“错误”“2 \σ噪声”);

前面的图显示了下山情景的纵向位置误差(左边)和横向位置误差(右边)。请注意,在纵向位置误差图中,误差轴的限制已经增加,以适应由于自我车辆下山时目标相对于相机传感器的仰角引起的大偏差。

自我飞行器在距离目标飞行器75米时开始下降。由于自我车辆在下山时是向下倾斜的,目标出现在相机图像顶部附近的高架位置。当自我车辆下山时,目标车辆在摄像机图像中的位置从图像顶部移动并越过地平线。对于单目视觉传感器,位于相机图像中地平线附近的目标被映射到远离传感器的位置。(根据定义,地平线上的点位于无穷远处。)视觉传感器不会对相机图像中地平线以上出现的物体产生检测,因为这些点不会映射到路面上的位置。

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

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

行人及车辆检测

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

再次运行FCW场景,在传感器前面75米处有一辆静止的汽车和行人。这个场景说明了传感器对这两个物体检测范围的差异。自我车辆、静止车辆和行人都被放置在同一高度。

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

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

helperPlotSensorDemoDetections(指标、“位置”“反向范围”, [-6 6]);传奇(“车错误”“Car 2\sigma噪声”“行人错误”“行人2\sigma噪音”);

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

传感器在小于12米的范围内停止对行人产生检测。在这个范围内,行人与相机光轴的偏移将行人移出相机的水平视场。由于目标车辆正处于摄像机的正前方,因此在整个FCW测试中,目标车辆仍位于摄像机图像的中心。

一些视觉传感器可以检测图像尺寸较小的物体,使传感器能够检测更远距离的物体。在前面的场景中,传感器对行人的检测受到行人宽度(0.45米)的限制,这比汽车宽度(1.8米)窄得多。为了将传感器对行人的检测范围增加到40米,计算行人在40米时在相机图像中的宽度。

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

profiles = actorProfiles(场景);pedWidth = profiles(3)。宽度计算相机图像中行人距离车辆40米处的像素宽度。cameraRange = 40-visionSensor.SensorLocation(1);focalLength = visionsensor . intrinsic . focalLength (1);pedImageWidth = focalLength*pedWidth/cameraRange
pedWidth = 0.4500 pedImageWidth = 9.4987

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

配置传感器以检测40米范围内的行人。释放(visionSensor);visionSensor.MinObjectImageSize(2) = pedImageWidth
visionSensor = visionDetectionGenerator with properties: SensorIndex: 1 UpdateInterval: 0.1000 SensorLocation: [2.1000 0] Height: 1.1000 Yaw: 0 Pitch: 1 Roll: 0 Intrinsics: [1x1 cameraIntrinsics] DetectorOutput: 'Objects only' FieldOfView: [43.6028 33.3985] MaxRange: 150 MaxSpeed: 100 MaxAllowedOcclusion: 0.6000 MinObjectImageSize: [15 9.4987] DetectionProbability: 0.9000 FalsePositivesPerImage: 0.1000使用get显示所有属性

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

运行模拟并收集离线检测和地面真相%的分析。metrics = helperRunSensorDemoScenario(场景,egoCar, visionSensor);%目标车辆和行人的位置误差。helperPlotSensorDemoDetections(指标、“位置”“反向范围”, [-6 6]);传奇(“车错误”“Car 2\sigma噪声”“行人错误”“行人2\sigma噪音”);

上面的图显示了视觉传感器的纵向位置误差(左边)和横向位置误差(右边),该视觉传感器配置为支持40米范围内的行人检测。金宝app车辆(红色所示)仍然被检测到最远的测试范围,但现在对行人(黄色所示)的检测是在距离传感器40米的地方生成的。

车道边界测量和车道遮挡

视觉检测生成器也可以配置为检测车道。为了说明视觉传感器测量车道边界的准确性,请重新创建有领头车和过路车的双车道行驶场景。同样的合并机动也用于遮挡车道标记。

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

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

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

配置视觉传感器,同时检测车道和物体释放(visionSensor);visionSensor。DetectorOutput =“车道和物体”为经过的汽车场景使用角色配置文件。visionSensor。ActorProfiles= actorProfiles(scenario);

使用helperRunSensorDemoScenario模拟自我和目标载具的运动。

snapTime = 5.9;%用于发布快照的模拟时间helperRunSensorDemoScenario(场景,egoCar, visionSensor, snapTime);

如上图所示,当呈现未遮挡的视图时,默认检测器可以看到45米左右的车道边界。您可以改变检测器的内在特性来观察其效果。

显示相机的本质。visionSensor。intrinsic
ans = cameraIntrinsics with properties: FocalLength: [800 800] PrincipalPoint: [320 240] ImageSize: [480 640] RadialDistortion: [0 0] TangentialDistortion: [0 0] Skew: 0 IntrinsicMatrix: [3x3 double]
%增大焦距,观察其效果。释放(visionSensor);visionSensor。intrinsic= cameraIntrinsics([1200 1200],[320 240],[480 640]) helperRunSensorDemoScenario(scenario, egoCar, visionSensor, snapTime);
visionSensor = visionDetectionGenerator with properties: SensorIndex: 1 UpdateInterval: 0.1000 SensorLocation: [2.1000 0] Height: 1.1000 Yaw: 0 Pitch: 1 Roll: 0 Intrinsics: [1x1 cameraIntrinsics] DetectorOutput: 'Lanes and objects' FieldOfView: [29.8628 22.6199] MaxRange: 150 MaxSpeed: 100 MaxAllowedOcclusion: 0.6000 MinObjectImageSize: [15 9.4987] MinLaneImageSize: [20 3] DetectionProbability: 0.9000 FalsePositivesPerImage: 0.1000使用get显示所有属性

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

总结

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

  • 在远距离内提供精确的横向位置和速度测量,但在远距离内纵向精度有限

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

  • 包括纵向偏差的目标定位在不同的高度比自我车辆

  • 调整对象和车道检测由于单目相机的本质。

另请参阅

应用程序

对象

相关的话题