单目测距那些事儿(上) | 从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处有个相机。有两个假设

  • 道路是平面。

  • 相机光轴与路面平行。

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

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

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

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

2.2 测距误差分析

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

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

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

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

2.3 相对速度

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

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

(7)式可以参考下图:

然后,

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

2.4 相对速度误差分析

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

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

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

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

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

3 后记

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

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

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

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

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

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

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

单目测距那些事儿(上) | 从MobileEye谈起的更多相关文章

  1. form表单那点事儿(上) 基础篇

    form表单那点事儿(上) 基础篇 做为html中最为常见,应用最广泛的标签之一,form常伴随前端左右.了解更深,用的更顺. 目录: 表单属性 表单元素 常识 模拟外观 表单属性 这个表单展示了fo ...

  2. (实用篇)php处理单文件、多文件上传代码分享

    php处理  单文件.多文件上传实例代码,供大家参考,具体内容如下 后台处理文件submit_form_process.php <?php /************************** ...

  3. c# 模拟表单提交,post form 上传文件、大数据内容

    表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每 ...

  4. ajax提交表单、ajax实现文件上传

    ajax提交表单.ajax实现文件上传,有需要的朋友可以参考下. 方式一:利用from表单的targer属性 + 隐藏的iframe 达到类似效果, 支持提交含有文件和普通数据的复杂表单 方式二:使用 ...

  5. 使用ajax提交form表单,包括ajax文件上传【转载】

    [使用ajax提交form表单,包括ajax文件上传] 前言 转载:作者:https://www.cnblogs.com/zhuxiaojie/p/4783939.html 使用ajax请求数据,很多 ...

  6. 基于 Struts2 的单文件和多文件上传

    文件的上传下载是 Web 开发中老生常谈的功能,基于 Struts2 框架对于实现这一功能,更是能够给我们带来很多的便利.Struts2 已经有默认的 upload 拦截器.我们只需要写参数,它就会自 ...

  7. 使用ajax提交form表单,包括ajax文件上传 转http://www.cnblogs.com/zhuxiaojie/p/4783939.html

    使用ajax提交form表单,包括ajax文件上传 前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){ ... },&qu ...

  8. springMVC上传功能(单文件和多文件上传)

    单文件和多文件上传 首先在xxx-select.xml里面配置上传的大小和编码 <bean id="multipartResolver" class="org.sp ...

  9. 关于单CPU,多CPU上的原子操作

    所谓原子操作,就是"不可中断的一个或一系列操作" . 硬件级的原子操作:在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是" 原子操作& ...

  10. c# 模拟表单提交,post form 上传文件、数据内容

    转自:https://www.cnblogs.com/DoNetCShap/p/10696277.html 表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipar ...

随机推荐

  1. Windows、MacOs上 gif 录像软件 LICEcap

    LICEcap 官网:https://www.cockos.com/licecap/ 适用于 windows macos 我自己保持的一版,下载地址:https://files-cdn.cnblogs ...

  2. Linux--Vi编辑命令(复制、粘贴、删除、查找)

    1.复制 1)单行复制 在命令模式下,将光标移动到将要复制的行处,按"yy"进行复制: 2)多行复制 在命令模式下,将光标移动到将要复制的首行处,按"nyy"复 ...

  3. ASCII编码的诞生:解决字符标准化与跨平台通信的需求

    在计算机的发展过程中,字符的表示和传输一直是一个重要的问题.为了实现字符的标准化和跨平台通信,ASCII(American Standard Code for Information Intercha ...

  4. NC20477 [ZJOI2008]树的统计COUNT

    题目链接 题目 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II ...

  5. 金融机构的反洗钱(AML)合规工作和系统建设

    声明 个人原创, 转载需注明来源 https://www.cnblogs.com/milton/p/16252061.html 反洗钱 AML 从国家机器的角度, 集体非法活动, 无论是金融还是非金融 ...

  6. 【OpenGL ES】FBO离屏渲染

    1 前言 ​ OpenGL 默认把 framebuffer 当作渲染目的地,它由窗口系统创建并管理.应用程序也可以创建额外非可显示的 framebuffer object(FBO),以区别窗口系统提供 ...

  7. 骨牌铺方格 SDUT

    状态转移方程:dp[i] = dp[i - 1] + dp[i - 2]. 当前行,可能是由上一行转移过来的,那么当前行就只能横着铺,所以方案数是dp[i - 1]. 当前行,可能是由i-2行转移过来 ...

  8. python-鼠标宏

    按下鼠标左键, 连击 按下鼠标右键, 停止 import win32api import time from pynput.mouse import Button, Controller mouse ...

  9. win32 - 监控DNS是否发生改变

    两种方法: 第一种是使用WMI进行后台轮询 第二种是查询注册表对应的DNS键值 Here: HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameter ...

  10. 以二进制文件安装K8S之高可用部署架构

    在Kubernetes系统中,Master节点扮演着总控中心的角色,通过不间断地与各个工作节点(Node)通信来维护整个集群的健康工作状态,集群中各资源对象的状态则被保存在etcd数据库中. 在正式环 ...