主要内容

模型视觉传感器检测

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

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

介绍

包含高级驾驶辅助系统(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()“结合”;;;;;;;;;;

前视传感器

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

visionSensor = visionDetectionGenerator“SensorIndex”, 1“UpdateInterval”, 0.1,“SensorLocation”(0.75 * egoCar。轴距0),“高度”, 1.1,“节”, 1“intrinsic”,相机原理(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 falpositivesperimage: 0.1000使用get来显示所有属性

视觉检测仿真

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

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

%为FCW场景创建显示[bep, figScene] = helperCreateSensorDemoDisplay(场景,egoCar,视觉传感器);Metrics = struct;初始化结构来收集场景指标推进(场景)%更新车辆位置gTruth = targetpose (egoCar);在ego车辆坐标中获取目标位置%生成带有时间戳的视觉检测time = 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]);显示目标车辆的后悬tgtCar = scenario.Actors(2);= tgtCar.RearOverhang;次要情节(1、2、1);持有;plot(-rearOverhang*[11], ylim,“k”);持有;传奇(“错误”“2 \σ噪声”“后方过剩”);

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

纵向位置测量

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

物体在图像中的垂直位置与物体在道路上方的高度有很强的相关性,但与物体到相机的距离的相关性很弱。当物体远离传感器时,这种弱相关性导致单目视觉传感器的纵向位置误差变得很大。左图中的纵向位置误差显示了当目标车辆距离传感器较远时,传感器的纵向误差如何迅速增加。传感器纵向美元\σ2美元测量噪声在距离目标车辆30米以内时小于1米,在距离目标车辆70米以上时大于5米。

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

横向位置测量

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

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

速度测量和目标遮挡

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

因为领头的车直接在传感器的前面,它有一个纯粹的纵向速度分量。超车的速度剖面既有纵向速度分量,也有横向速度分量。这些组件的变化,因为汽车超过自我车辆和移动到右边车道后面的领头车。将传感器测量的目标车辆的纵向和横向速度与其地面真实速度进行比较,说明视觉传感器能够观察到这两个速度分量。

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

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

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

以上一节中使用的视觉传感器为例,将其配置为通过平滑滤波器生成位置和速度估计,过程噪声强度为5m /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号车\ σ噪声”);

纵速测量

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

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

横向速度测量

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

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

局部遮挡目标的检测

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

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

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

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

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

与目标高度的纵向位置偏差

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

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

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

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

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

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

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

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

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

行人及车辆侦测

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

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

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

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

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

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

当距离小于12米时,传感器将停止对行人进行检测。在这个范围内,行人与相机光轴的偏移量将行人移动到相机的水平视场之外。由于目标车辆位于摄像机正前方,因此在整个FCW测试过程中,目标车辆始终处于摄像机图像的中心位置。

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

找到行人的物理宽度模型

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

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

%配置传感器检测40米范围内的行人。释放(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 falpositivesperimage: 0.1000使用get来显示所有属性

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

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

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

车道边界测量和车道遮挡

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

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

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

配置上一节中使用的视觉传感器,并将其配置为从平滑滤波器生成位置和速度估计,过程噪声强度为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: [203] DetectionProbability: 0.9000 falpositivesperimage: 0.1000使用get来显示所有属性

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

总结

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

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

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

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

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

另请参阅

应用程序

对象

相关的话题