首页 > 其他分享 >单目测距那些事儿(上) | 从MobileEye谈起

单目测距那些事儿(上) | 从MobileEye谈起

时间:2024-03-19 19:35:05浏览次数:27  
标签:误差 相对速度 距离 MobileEye 单目 相机 测距

单目测距那些事儿(上) | 从MobileEye谈起

全面专业的自动驾驶学习资料:链接

  1. 前言

在ADAS领域,有个功能叫自适应巡航控制(Adaptive Cruise Control, ACC)。 ACC是一种纵向距离控制,具体包括发现目标车辆、判断目标车辆所在路径、测量相对本车的距离和速度,然后进行相应的刹车等制动操作以保持安全驾驶距离。当没有发现目标车辆时,则保持预设的巡航速度。

对于测距而言,最直接的方法是采用毫米波雷达、激光雷达和双目相机。但是考虑到设备成本和计算成本,人们开始考虑能不能用单目相机来做距离控制。当然这种考虑不是空穴来风的,而是有两个直观的动机

  • 生物视觉角度:一方面,人类双眼虽然有立体测距功能,但仅在近距离比较准确,无法准确测量百米距离;另一方面,基于近大远小的原理,人类视觉就可以准确评估TTC (Time To Collision)。(换句话说,在ACC中测距可能不用太准,而近大远小的原理用单目也可实现,那单目测距还是很有希望的嘛)

  • 实践角度:雷达太贵,立体视觉不仅增加额外相机,而且计算量大,标定也是个问题。单目相机则成本很低,易于批量生产。

当然,挑战也是有的,主要两个:

  • 由于缺乏用于目标识别的深度信息,非常依赖基于模式识别的目标检测算法,那么当前的目标检测算法是否足够鲁棒?(目标识别不出来,就没法测距,后果很危险。)

  • 目标检测出来后,利用透视法则近大远小原理测距能否满足制动控制精度。

下面就先介绍MobileEye在2003年一篇论文,主要介绍了测量距离、相对速度的基本方法,以及误差分析。

2. MoibleEye 2003年的论文

论文:Vision-based ACC with a Single Camera: Bounds on Range and Range Rate Accuracy

2.1 测距

首先明确一点,对于单目测距,我们主要是有两个信息可以利用:图像中车辆的尺寸,图像中车辆的位置

而这篇论文主要是利用图像中车辆位置进行测距的(确切地说,是利用车与路面的接触点)。如下图,A,B,C三辆车在路面上,A车上p处有个相机。有两个假设

  • 道路是平面。

  • 相机光轴与路面平行。

image

道路上与本车(A)距离为Z的一点,投影到图像上高度为y。f为焦距,H为相机高度,则满足:

image

为了测距,首先需要检测前车与路面的接触点,然后就可以计算距离了:

image

也就是,根据焦距、相机高度,图像中接触点位置三个量,即可计算距离。

当然在现实中,上述两个假设常常不满足,会造成很大的误差。另外,接地点的估计也会引入误差。

2.2 测距误差分析

如果接地点存在n个像素误差,那么测距误差公式为:

image

所以,测距误差是随着距离而二次方地增长,而误差比例则随着距离线性增长。

在640x480分辨率的图像上,90m的测距误差比例为10%左右,45m的测距误差比例为5%左右。

除了距离,相对速度或许更重要,因为它告诉我们是否在保持一个恒定的距离。

2.3 相对速度

相对速度(range rate, or relative velocity)可以如下表示:

image

也就是测量两个时间的距离,用距离差除以时间差。但是,测距结果充满噪声,这样算出来的相对速度精度自然不高。所以,这里主要使用目标尺寸变化计算相对速度。令W是车辆实际宽度,w和w'是前后两张图像上的车辆宽度,那么满足:

image

(7)式可以参考下图:

image

然后,

image

也就是,根据t1时刻距离,t1和t2的检测尺寸,就可计算出相对速度。

2.4 相对速度误差分析

这一部分公式比较复杂,就不详细展开了。说几个结论:

  • 相对速度误差与相对速度是独立的。

  • 相对速度随着距离二次方增长。

  • 时间间隔越大,相对速度越准。

  • 相机视场角小(焦距大),会线性减小误差。

3 后记

一句话总结下ME的方法:用目标在图像中的位置测距,用目标尺寸变化来计算相对速度。 简单明了,实在是高!

正所谓:单目测距不是梦,无数豪杰往前冲。回首漫漫发展路,MobileEye启征程。

但是,上述方法基于两个很强的假设,在实际应用中存在很大问题,主要两点:

  • 相机光轴很难总是和路面平行的,一是安装固定有难度,二是车辆行驶中难免颠簸,相机角度肯定存在起伏。 -

  • 道路不是一直平坦的,很多道路存在坡度,这时候又该怎么办呢?

其实,也有不少论文针对上述问题做出了探索,我将在单目测距那些事儿(下)中对相关方法进行梳理,敬请期待!

全面专业的自动驾驶学习资料:链接

标签:误差,相对速度,距离,MobileEye,单目,相机,测距
From: https://www.cnblogs.com/autodriver/p/18083756

相关文章

  • 蓝桥杯单片机快速开发笔记——超声波测距
    一、原理分析        超声波测距是一种常见的测距方法,其原理是利用超声波在空气中传播的速度恒定且较快的特性,通过发送超声波信号并接收回波,计算出物体与传感器之间的距离。以下是超声波测距的原理和应用:原理:发送超声波信号:超声波传感器发送一个短脉冲的超声波信......
  • 单目测距的基本介绍和实现原理
    单目测距的基本介绍和实现原理单目测距是一种常用的测量技术,它通过单个摄像头来测量物体与摄像头的距离。在现代科技的推动下,单目测距术正在不断发展和应用于各个领域。本文将分点阐述关于单目测距的重要性、原理和方法、应用领域以及潜在的挑战和发展方向结尾附赠非常宝贵的自......
  • 基于STM8S103F3P6的超声波测距仪设计
    大三的时候给大四学长做的毕业设计题目文章目录1绪论1.1设计背景1.2设计的主要任务2超声波测距基本理论及总体架构2.1基本知识2.1.1超声波特性2.1.2超声波传感器2.1.3超声波测距原理2.2总体架构2.2.1设计原则2.2.2总体方案介绍2.3主要器件选择与介绍2.3.1主控MCU选型......
  • 基于FPGA的超声波测距
    基于FPGA的超声波测距系统通常涉及超声波传感器、FPGA芯片、时钟模块、距离测量算法等组件。以下是一个基本的系统设计框架:原理详细解释:超声波传感器:用于发送超声波脉冲并接收回波。一般使用的是超声波传感器,其工作原理是发送超声波脉冲,当脉冲遇到障碍物时,部分能量被反射回来,通过......
  • 51单片机超声波测距
    51单片机超声波测距​ 51单片机超声波(HC-SR04)测距,当距离小于10cm,LED1亮,LED2灭#include"reg52.h"sbitLED1=P3^7;sbitLED2=P3^6;sbitTrig=P1^5;sbitEcho=P1^6;voidDelay10us() //@11.0592MHz{ unsignedchari; i=2; while(--i);}voidTime0Ini......
  • 【STM32F103】HC-SR04超声波测距模块详解(附工程文件)
    前言:使用的硬件:STM32F103C8T6,HC-SR04,ST-Link(其他烧录器也可以),0.96寸OLED屏幕(非必须,仅供显示测距结果,可以使用串口助手代替),若干杜邦线。涉及操作stm32的GPIO口,外部中断,定时器,本文中不会详细解释,仅提供代码思路。HC-SR04:HC-SR04超声波测距模块提供2cm~400cm的测距功能,精度达3mm。......
  • AR眼镜_单目光波导AR智能眼镜技术方案
    光波导技术是一项非常先进的技术,可以通过将光线反射180度来传递图像到人眼中。使用了这项技术的MicroLED屏幕被嵌入到眼镜框架中,通过无数次的反射和扩散,最终准确地传递到人眼中。这种技术不仅能显著缩小增强现实智能眼镜的体积,使屏幕只有0.68英寸大小,还能巧妙地隐藏在镜框中。......
  • 单目光波导AR眼镜,双目光波导AR智能眼镜
    AR眼镜是一种智能设备,用于在现实场景中叠加虚拟信息,被称为增强现实(AR)。光学显示方案是AR眼镜的核心技术之一,它对AR眼镜的体积重量、外观设计、佩戴体验和应用场景等起着重要作用。单目AR眼镜相比双目眼镜更轻便且结构更稳定,佩戴者可以长时间稳定地使用,但其显示效果在沉浸......
  • 深度学习---单目标关键点检测网络Stacked Hourglass
    StackedHourglassNetworks是2016年提出的一种用于单人人体姿态估计的网络,并取得了很好的效果。这里我们从网络结构以及一些实现细节简单分析下这个网络。paper:https://arxiv.org/pdf/1603.06937.pdfcode:https://github.com/princeton-vl/pytorch_stacked_hourglasshttps:......
  • 单目操作符
    今天我们来了解一下六个较为常见的单目操作符。分别是!-sizeof~++以及强制类型转换。1、首先我们先来了解一下!的用法。我们知道在C语言中,0表示假,而其他非0的都表示真。而!的用法就是“非”,把真的转为假,假的转为真。举个简单的例子:#include<stdio.h>intmain(){inta=10;pri......