主要内容

模型视觉传感器检测项

这个例子展示了如何为不同的驾驶场景建模和模拟汽车视觉传感器的输出。生成合成视觉检测对于测试和验证跟踪和传感器融合算法在角落情况下或传感器硬件不可用时非常重要。本例分析了前向碰撞预警(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(“结合”, initialDist, initialSpeed, brakeAccel, finalDist);

前方的视觉传感器。

在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...“内部函数”, cameraIntrinsics(800, [320 240], [480 640]),...“BoundingBoxAccuracy”5,...'MaxRange', 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秒进行一次。传感器返回一个逻辑标志,isValidTime,当视觉传感器达到所需的更新间隔时,即为正确,这表明该仿真时间步长将产生检测。

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

位置测量

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

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

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

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

纵向位置测量

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

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

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

横向位置测量

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

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

速度测量和目标遮挡

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

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

%通过创建方案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(场景);

使用helperRunSensorDemoScenario模拟自我车辆和目标车辆的运动。这个功能也收集模拟指标,如以前的FCW驱动方案来完成。

snapTime = 5.9;%抓取发布快照的模拟时间metrics = helperRunSensorDemoScenario(scenario, egoCar, visionSensor, snapTime);

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

helperPlotSensorDemoDetections(指标“速度”“时间”25 [-25]);次要情节(1、2、1);传奇(“引领汽车错误”“Lead car 2\sigma noise”“通过汽车错误”“Pass car 2\sigma噪音”);

纵向速度测量

面向前的视觉传感器测量通过比较传感器的纵向位置测量传感器的更新间隔之间如何变化的纵向速度。由于传感器的纵向位置误差与范围生长,纵向速度误差也将增长随着目标范围。

前面左边的图显示了通过车辆的纵向速度误差。由于前导车与视觉传感器保持恒定的距离,其误差(显示为红点)显示的是相同的美元\σ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);传奇(“引领汽车错误”“Lead car 2\sigma noise”“通过汽车错误”“Pass car 2\sigma噪音”);

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

目标仰角的纵向位置偏差

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

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

%创建FCW下山场景initialDist = 75;% mfinalDist = 1;% minitialSpeed = 50;%公里brakeAccel = 3;% m / s ^ 2[场景,egoCar] = helperCreateSensorDemoScenario(“结合”, initialDist, initialSpeed, brakeAccel, finalDist, false, 2);%在FCW下山场景中使用actor配置文件释放(visionSensor);visionSensor.ActorProfiles = actorProfiles(场景);%运行模拟和收集检测和地面真相离线分析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[场景,egoCar] = helperCreateSensorDemoScenario(“结合”, initialDist, initialSpeed, brakeAccel, finalDist, true);%在FCW下山场景中使用actor配置文件释放(visionSensor);visionSensor.ActorProfiles = actorProfiles(场景);%运行模拟和收集检测和地面真相离线分析snapTime = 5;%抓取发布快照的模拟时间metrics = helperRunSensorDemoScenario(scenario, egoCar, visionSensor, snapTime);

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

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

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

传感器在距离行人小于12米的范围内停止产生检测。在这个范围内,行人从相机光轴的偏移将行人移动到相机的水平视场之外。因为目标车辆在摄像机的正前方,所以在整个FCW测试中,目标车辆始终处于摄像机图像的中心位置。

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

找到行人的物理宽度模型

概要文件= actorProfiles(场景);pedWidth =概要文件(3)。宽度%在相机图像中计算距离ego车辆40米处行人的像素宽度cameraRange = 40-visionSensor.SensorLocation (1);focalLength = visionSensor.Intrinsics.FocalLength (1);pedImageWidth = focalLength * pedWidth / cameraRange
pedmagewidth = 9.4987

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

%配置传感器检测行人范围为40米释放(visionSensor);visionSensor.MinObjectImageSize (2) = pedImageWidth
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.6000 MinObjectImageSize:[15 9.4987]使用get显示所有属性

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

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

前述图显示用于被配置为支持行人检测出范围为40微米的视觉传感器的纵向位置的错误(在左侧)和横向位置的错误(在右侧)。金宝app车辆(以红色显示)仍然检测出到最远的测试范围内,但现在对行人(黄色示出)检测,产生,以从传感器40微米。

车道边界测量和车道遮挡

视觉检测发生器也可以配置来检测车道。用前车和超车再现双车道驾驶场景,以说明视觉传感器车道边界测量的准确性。同样的合并操作被用来遮挡车道标记。

%通过创建方案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(场景);

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

snapTime = 5.9;%抓取发布快照的模拟时间helperRunSensorDemoScenario(scenario, 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属性:SensorIndex: 1 UpdateInterval: 0.1000 SensorLocation:[2.1000 0]高度:1.1000偏航:0节:1卷:0 intrinsic: [1 x1 cameraIntrinsics] DetectorOutput:“车道和对象”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模型:

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

  • 限制检测根据目标的物理尺寸和通过方案中的其他对象的目标的遮挡

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

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

另请参阅

应用程序

对象

相关主题