单目测距那些事儿(上) | 从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. layui 的tab标签,选项卡的删除,是先切换,后删除,其实这样设计挺好的。

    layui的 tab关闭时,是先触发 切换事件,然后再触发删除事件,这一点留意,其实这样设计挺好的.那么留意点,就是先向主进程发送切换消息,然后再向主进程发送删除消息, 这样反而更加有利于,主进程代码 ...

  2. RAPTOR:递归摘要与树形检索的结合,提升RAG检索性能

    RAPTOR:递归摘要与树形检索的结合,提升RAG检索性能 来源:ICLR'24 https://arxiv.org/pdf/2401.18059.pdf 随着 LLM 技术的发展,RAG 的价值也来 ...

  3. NC16886 [NOI2001]炮兵阵地

    题目链接 题目 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&qu ...

  4. 【Android】使用Binder实现进程间传递对象案例

    1 前言 使用AIDL实现进程间通讯简单案例 和 使用AIDL实现进程间传递对象案例 中介绍了使用 AIDL 进行进程间通讯,其本质仍然是Binder,aidl 文件对应生成的接口中,将服务端调用的抽 ...

  5. spring boot读取json文件并实现接口查询

    0.源码下载 https://download.csdn.net/download/IndexMan/84238085 1.说明 最近需要在spring boot项目启动时读取json文件并保存到Li ...

  6. 24个javascript最佳实践

    1. 使用 === 代替 == JavaScript utilizes two different kinds of equality operators: === | !== and == | != ...

  7. 骨牌铺方格 SDUT

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

  8. win10 wsl 运行后没有反应

    wsl 运行一段时间后执行没有反应, 需要重启LxssManager 管理员模式打开 powshell 找到pid, 结束pid >tasklist /svc /fi "service ...

  9. Qt5.15.0 升级至 Qt5.15.9 遇到的一些错误

    按照之前我写的文章教程,可以很简单的编译出静态库(仅供学习交流) 编译 windows 上的 qt 静态库 编译出静态库后,替换旧版本的库,见我另一篇文章教程 VS2019 配置 QT 库 之所以没有 ...

  10. 好用的OCR文本识别工具

    之所以会用到OCR工具,是因为在看一些扫描版的PDF文档时,有时候需要复制粘贴一些文字,特别是技术性文档,对于一些命令或者代码片段需要复制出来执行验证. 网络上有许多推荐OCR工具的文章,但是大多数都 ...