一 前言
随着城镇化水平的不断提高以及经济水平的快速增长,人们对汽车的需求量日益旺盛,汽车保有量持续增多。汽车的出现满足了人们的出行需求,但现阶段汽车的行驶永远离不开驾驶员对汽车的操作,到达目的地后,停车成为每个驾驶员需要面对的问题。下班驾车回到小区停车场,在密密麻麻的停泊车辆中忽然发现了一个停车位,带着惊奇与庆幸将汽车开到停车位旁,这时却忽然发现旁边两个汽车停得与空置的车位靠较近,凭借笨拙的车技,根本无法将汽车停进去,只能眼看车位空瞪眼悔科二忘天边。
在各种环境下想要完美的将车停到车位中,是一件并不容易的事情。无论是侧方位停车,还是倒车入库,都是需要每个驾驶员熟练掌握的技巧,而实际情况却远不是想象的那么美好,“停车”这一简单操作,却成为了很多驾驶员的难题。对于驾驶新手来说,开车的过程中最困难的事情是什么?百分之八十的答案都是泊车入库。许多刚出“茅庐”的驾驶新手对于侧方位停车十分的头痛,是一种痛苦的经历,有时侧方车位前后距离太小、有时后方车位前面距离太窄,都让许多新手们为难不已。多倒几次车事小,有时还会出现刮蹭,让人十分恼火。
把又长又大又笨重的前驱车停好,也是一件有点困难的事。前轮驱动的车辆发动机一般是横置安装的,车宽的很大一部分都由发动机占据,所以就算把方向盘打到底,轮胎的转动幅度也不会很大,在低速情况下想要改变方向很难,车体越大,这一点感受得越明显,无论驾驶技术多好都没法避免。由于车辆和人均受自身条件影响而存在“视觉盲区”,泊车往往耗费大量的时间和精力,一直是新老司机的驾驶痛点。
随着城镇化发展的不断加快,交通拥堵现象愈发凸显,城市停车位资源紧张,停车位空间小等问题,停车难题不断发酵。由于城市停车位数有限而车辆数量众多,对于“老司机们”来说,想要找到合适的停车位已经越来越困难,在较大停车场停车容易产生找车位难、找车难等问题,驾车出行变得愈发受到挑战;与此同时大城市停车空间有限,特别是市中心拥挤的停车空间,狭小的停车空间时刻考验着他们的停车技术,将汽车倒入狭小的停车位成为一项必备技能,给驾驶员带来困扰。对于“新司机们”而言,很多情况下都需要颇费周折才能停好车,在这种环境下泊车容易引起局部交通堵塞、神经疲惫和保险杠被撞弯等剐蹭事故的发生。
在这样的背景下,为便捷人们出行、缓解交通压力,解决停车难题便成为了城市管理的重要任务。近年来世界各国从科技的角度不断探索,尝试找到破解城市停车难题的办法。在不同的国家,落实不同场景的自动驾驶的意愿也不相同,唯一确定的是,大家都不爱停车,确切的说是不爱找车位和停车,国外车企也意识到停车难的问题。随着高级辅助驾驶系统的出现,汽车的驾驶体验越发丰富,驾驶员在驾驶汽车的过程中也越来越轻松,驾驶安全性也由于高级辅助驾驶的搭载获得了巨大的提升,作为在驾驶汽车过程中不可避免的动作——停/泊车,也被汽车设计师和汽车制造商考虑到,技术的发展为之提供了解决之道,设计并研发了相关的高级辅助驾驶系统,它就是——自动泊车系统。 经过不懈努力,在自动驾驶技术的前哨应用之中,人们也是看到了问题解决的希望和曙光,那便是借助“自动泊车技术”,率先推出了自动泊车系统。虽然有些车型已经配备了自动泊车技术,但是依然需要驾驶员人为控制档位、油门,并不算真正的自动泊车。随着技术的发展自动化程度的提高,较先进的自动泊车辅助只需要轻轻启动按 钮、坐定、放松,就可以自动完成停车入位,这种功能进一步得到老司机们的喜爱,毕竟可以减少日常通勤停车的重复劳动。目前很多车企推出的新车都有自动泊车功能。 自动泊车技术的应用,对于解决人口密集城区的停车问题和交通问题也确有奇效。因为自动泊车技术可以将汽车停放在较小的空间内,这些空间比大多数驾驶员能自己停车的空间小得多,这使得车主能更容易地找到停车位。与此同时由于相同数量的汽车占用的空间也更小,也使得停车场的利用率也大幅提升。 现在越来越多的厂商都开始研发无需人工干预真正的自动泊车功能,而这就属于无人驾驶的范畴了。这样自动泊车无需驾驶员就可以实现泊车入库,不仅非常方便,同时非常炫酷。因此致力于运用新技术让泊车变得更智能、更安全、更便捷,自动泊车技术的出现和发展为解决泊车问题提供新思路,将有效解决驾驶员找位难、停车难等痛点。 二 概述
三 定义
1.自动泊车系统 自动泊车又称为自动泊车入位,顾名思义就是汽车不用人工干预,系统能够自动帮用户将车辆停入车位。当找到了一个理想的停车地点,只需轻轻启动按钮、坐定、放松,其它一切即可自动完成,彻底消除在停车中遇到的麻烦。自动车辆控制的一个重要目标是提高安全性和驾驶员的舒适性,apas通过泊车操作来实现这个目标。
自动泊车是一个常见的低速操作场景,是解决自动驾驶最后一公里的核心技术,也是自动驾驶技术,相当于低速的自动驾驶,技术难度与自动驾驶相比较为容易,只不过是自动驾驶的一种低配版,就是自动驾驶降低要求后的一种衍生,也是实现自动驾驶的必经之路。 目前真正的自动驾驶虽然距离商业落地和规模普及还有一段距离,但如果降低自动驾驶应用的环境条件和实际限制,其同样具备重大使用价值。 自动泊车已经成了无人驾驶最先落地的应用场景,低速,封闭或者半封闭空间,场景相对固定,最容易落地。
自动泊车系统(automated parking system,aps)/自动泊车辅助系统(auto parkig assist, apa)主要是利用遍布车辆自身和周边环境里的车载传感器,测量车辆自身与周边物体之间的相对距离、速度和角度:通过泊车雷达来实现自动识别可用车位,利用360°全景摄像头的图像信息,并结合超声波雷达传感器,实现对车位、 周边环境的感知和识别,然后通过车载处理器/车载计算平台或云计算平台计算出操作流程,控制器根据识别的信息计算泊车合适的路径以及控制执行机构实施车辆的转向和加减速,并自动正确地完成停车入车位动作的系统,以实现自动泊入、泊出及部分行驶功能,实现车辆安全、平顺的泊车。 搭载有自动泊车功能的汽车可以不需要人工干预,通过车载传感器、处理器和控制系统的帮助收集车辆的环境信息(包括障碍物的位置),就可以实现自动识别车位和找到一个停车位,并自动安全地完成泊车入位操作的过程。
2.自主泊车系统
随着自动驾驶技术的发展,自动泊车逐渐往自主泊车方向演进。自主泊车又称为代客泊车或一键泊车:指驾驶员可以在指定地点处召唤停车位上的车辆,或让当前驾驶的车辆停入指定或随机的停车位。整个过程正常状态下无需人员操作和监管,对应于sae l3级别。
自主泊车系统包含两个功能,即泊车与唤车:
泊车功能:是指用户通过车载中控大屏或手机app选定在园区、住宅区等半封闭区域内的停车位或者选定停车场(有高精地图覆盖),然后车辆通过获取园区、住宅区等半封闭道路上的车道线、道路交通标志、周围其他车辆等交通环境、参与者信息;控制车辆的油门、转向、制动来实现安全自动驾驶,并通过自动寻找可用停车位或识别用户选定停车位;实现自动泊入、自动停车、挂p档、熄火、锁车门,同时防止潜在的碰撞危险的功能。
唤车功能:是指用户通过手机app选定园区、住宅区等半封闭区域内的某一唤车点,然后车辆从停车位自动泊出、低速自动驾驶到达唤车点,从而实现唤车,同时防止潜在的碰撞危险的功能。
avp自主泊车方案中的核心功能“记忆泊车”,就是支持“无人泊车”的。“记忆泊车”顾名思义,可以让车辆“记住”车位,让车根据“记忆”自己找车位。车就可按着记忆中的路线自己找到车位泊进去了。avp的记忆泊车和召唤功能是支持地库停车场和露天停车场的,部分目前具备记忆泊车功能的还只能用于地库,露天停车场是用不了的。
avp自主泊车可以在100米内记住10条行进路线,在用户使用记忆泊车时,系统车辆将优先选择最佳泊车路线。这些路线是可以在用户之间共享的。也就是说,随着使用“记忆泊车”的人越来越多,自主泊车数据库也会越来越完善,其记忆泊车能适应的场景也会越来越多。
四 组成
自动泊车系统组成及功能如下表所示:
要实现自动泊车这样一个复杂的功能,需要车辆的各个子系统协同工作。下图所示的系统示意图展示了can数据总线中的联网关系。
自动泊车aps系统架构一般包括一个环境数据采集系统、一个中央处理器和一个车辆策略控制系统。典型的系统架构如下:
泊车系统典型架构
自动泊车辅助系统主要由信息检测单元、电子控制单元和执行单元等组成,如下图
自动泊车的系统硬件架构可以分为四部分:传感器、执行器、主控制器、其它关联系统
自主泊车系统avp
自主泊车系统方案如下图所示,主要采用智能化车端+智能化场端的方式。车端智能化主要依赖于融合式全自动泊车的传感器配置,外加前视摄像头、v2x设备等实现特定区域内的点到点自动驾驶、自动车位扫描、自动泊入泊出等功能。车辆自身具备车辆、行人等动态障碍物检测和识别功能,可实现自动紧急制动、避障等决策规划。场端智能化主要依托摄像头检测技术,实现停车场车位占用情况检测,并上传至停车场服务器,并实现为自主泊车车辆提前分配车位信息。
1.传感器 环境数据采集系统包括图像采集系统和车载距离探测系统(超声波雷达或者毫米波雷达系统),可采集图像数据及周围物体距车身的距离数据,并通过数据线传输给中央处理器;通过传感器系统感知环境信息,包括视频传感器(摄像头),毫米波雷达, 超声波雷达等。当这些传感器(它们共同组成了车辆的环境数据采集系统)采集到外部的数据信息之后,会将这些信息传输到车辆搭载的中央处理器中,并且在这里得到 车辆的位置、车 位的位置以及周围的环境参 数。
主要任务是探测环境信息,如寻找可用车位,在泊车过程中实时探测车辆的位置信息和车身状态信息。在车位探测阶段,采集车位的长度和宽度;在泊车阶段,监测汽车相对于目标停车位的位置坐标,进而用于计算车身的角度和转角等信息,确保泊车过 程的安全可靠。 不同的自动泊车系统采用不同的方法来检测汽车周围的物体。有些在汽车前后保险杠四周装上了感应器,它们既可以充当发送器,也可以充当接收器,这些感应器会发送信号,当信号碰到车身周边的障碍物时会反射回来,然后车上的计算机会利用其接收信号所需的时间来确定障碍物的位置;其它一些系统则使用安装在保险杠上的摄像头或雷达来检测障碍物。但最终结果都是一样的:汽车会检测到已停好的车辆、停车位 的大小以及与路边的距离,然后将车子驶入停车位。
其中传感器包括4颗远距离传感器(测距5米)和8颗近距离传感器(测距1.5米)), 分别实现车位扫描和距离侦测的功能。
传感器为超声波传感器及摄像头,方案如下图所示,包括12个超声波传感器,4个环视摄像头和1个前视摄像头。
车辆上标配共有8个摄像头,后面有一个倒车摄像头,还有一个毫米波雷达以及一个探测范围8米的超声波传感器。车身上搭载的8个摄像头,视角都会有相当区域的重
合,这就保证了传感器不会有视野盲区,这对实现自动泊车是最重要的一件事了。
▲ 各种传感器的位置和视角示意
其 它 传感器还包括轮速传感器、环境温度传感器、转向灯开关、自动泊车辅助功能按
钮和拖车钩传感器。
(1)超声波传感器为自动泊车系统必要组成,可以无摄像头,因为超声波雷达除了检测车位,另一个更重要的作用是障碍物检测,进行避障。从成本考虑通常选用性价比比较高的超声波传感器,是aps主流的技术方案,探测距离为5~8 m。它们发射超声波信号,然后接收从障碍物反射回来的信号,并根据从发射到接收信号的时间长短来评估与障碍物的距离。车辆保险杠正前方前雷达监测距离为100cm,后方监测的距离为120cm,其中左前和右前外侧距离传感器用于探测停车位的长度和宽度。
泊车雷达采用超声波测距原理,判断障碍物的位置和距离,当距离达到警报限值时,通过声音及模拟显示进行提示;声音警示通过ipk整合实现、泊车模拟显示通过aic整合实现。
远距超声波传感器外形如下图:
主要参数如下表所示:
(2)车载毫米波雷达
(3)摄像头为非必要组成部分,缺少摄像头仍可实现自动泊车,但是泊车应用场景会减少。
avm(around view monitor):全景环视系统/全景影像。在自动驾驶领域,avm属于自动泊车系统的一部分,是一种实用性极高、可大幅提升用户体验和驾驶安全性的功能。360度环绕视频系统的使用, 对自动泊车系统的车位线的识别,驾驶员实时监测系统有了质的提高。
将装在车身前后左右四个方向的摄像头图像信息进行处理,形成一幅车辆周边360度的车身俯视图,并在屏幕上显示,帮助驾驶员轻松停泊车辆。系统自带畸变校正功能、无缝拼接、内部亮度平衡与颜色平衡算法,使输出的画面更加接近车身周围环境。根据车身信号自动切换视角,使得不同场景下给用户呈现出恰当的视角,有用的图像,使驾驶员能够及时观察到车身周围的障碍物,防止车辆发生碰撞。
比较先进的全自动泊车系统,会结合选用毫米波雷达系统,距离检测和抗干扰能力更强。比如为了支持功能强大的自动泊车技术,有的提供了多达12枚泊车雷达,同时360°摄像头也能让驾驶者在车内知晓车辆周围的情况,必要时也可以亲自介入停车动作。现在结合无人驾驶的传感器技术, 包括毫米波雷达和激光雷达的使用, 探测距离和探测精度可以得到很大提升。
自动驾驶——自动泊车之avm环视系统算法框架
avm已是一种较为成熟的技术,中高端车型均有部署,但详细讲述avm系统算法的技术博文并不多。搭建了一套avm算法框架,有一些效果还不错的demo,主要是想将avm算法框架中每个算子讲述清楚,文的风格为理论与实践结合,含有部分代码,适合有一些计算机视觉基础的读者。
avm系统概述
avm汽车环视影像系统如图所示,由安装在前保险杠、后备箱、后视镜上的四个外置鱼眼相机构成。该系统包含的算子按照先后顺序:去畸变、四路鱼眼相机联合标定、投影变换、鸟瞰图微调、拼接融合、3d模型纹理映射等。四路鱼眼捕捉到的图像信息通过上述算子,生成一个2d、3d的全景图。avm算法又分为离线阶段和在线阶段两部分,在线阶段是对离线阶段的简化,更加适合于工程实现。
avm系统示意图
离线阶段算法pipeline
先来粗略浏览下avm算法pipeline包含那些算子:
2d avm
2d avm pipeline
3d avm
3d avm pipeline
基于畸变表的鱼眼相机去畸变
1.1鱼眼相机畸变模型 普通相机和广角相机的投影方式一般为透视投影,即通过三角形相似原理,将相机坐标系下三维世界中的物体投影到平面上,这是基于理想的透视投影模型(无畸变)。但实际情况是得到的最终图像与理想的透视投影模型有一些区别,即径向畸变(桶形、枕型)、切向畸变。因此相机标定中都会对畸变做矫正。 鱼眼相机的投影方式有很多种假设,例如等距投影、等立体角投影、正交投影、体视投影、线性投影。但是真实的鱼眼相机镜头并不完全遵循上述的这些模型假设。因此kannala-brandt提出了一种一般形式的估计,适用于不同类型的鱼眼相机: ,这个也是纳入opencv中的鱼眼相机畸变模型。对照下图: 为光线入射角, 为出射光线在相机归一化平面上或者在相机成像平面上与o之间的距离(在opencv中表示光线在相机归一化平面上的成像位置)。
鱼眼相机模型 相机去畸变通常使用棋盘格标定方法,首先通过矩阵推导得到一个比较好的初始解,然后通过非线性优化得到最优解,包括相机的内参、外参、畸变系数,然后对鱼眼图像做去畸变处理。内参即: 相机内参矩阵 然而,此标定法并不适用于这场景。 1.2基于厂家畸变表的鱼眼图像去畸变 由于棋盘格标定法是在图像的全局进行拟合得到一个全局的最优解,因此需要保证多次拍摄到的标定板的棋盘格可以覆盖整个图像区域。而假设的场景为要求汽车整车上流水线进行标定,即相机已经安装在车上。很显然由于车身遮挡的原因,很难保证上述条件。另外棋盘格标定法并不适用于批量生产。因此选择了基于厂家提供的畸变表对鱼眼相机图像进行去畸变。相机厂家都有专业的光学工程师,大厂提供的畸变表通常情况下比较准确。 当然也有一些在畸变表的基础上进行优化的方法,例如[采用最小重投影的方法计算出最优的相机主点位置,然后使用畸变表进行去畸变处理。在其它场景中,还有些先标定出相机的内参,然后将内参与畸变表联合使用。下面来讲述基于畸变表的去畸变方法:
厂家提供的畸变表 上面的表格展示了相机畸变表的一部分,厂家给出了入射角从 到 的光线在焦距为f的相机真实成像平面上成像点距离成像平面中心的真实距离,单位为mm。如果想用opencv提供的api做去畸变处理,需要使用厂家提供的焦距f,将换算到相机的归一化平面上去(即除以f)。然后通过多项式拟合的方法,计算出 这几个畸变参数,例如可以使用python的curve_fit库进行多项式拟合。调用opencv api,m_distortion_coeffs即为多项式拟合的畸变参数。
fisheye::initundistortrectifymap(m_intrinsic_matrix, m_distortion_coeffs, r, newcoeff, image_size*2, cv_32fc1, mapx, mapy);cv::remap(disimg, undisimg, mapx, mapy, inter_linear);通俗讲:鱼眼相机去畸变的过程实际上就是遍历想要的无畸变图上的坐标点,通过mapx,mapy两个查找表,找到该坐标点在畸变图上的像素位置。通常这个像素的位置为浮点型,需要做双线性插值。否则在纹理边缘上会有锯齿状的问题,这个结论是实现了opencv remap函数验证过的,有兴趣的可以实现一下mapping的过程(查找+插值)。来看图:
鱼眼图 去畸变 右图为基于畸变表去畸变的结果,可以看出去畸变的效果大体上满足要求,例如柱子边、标定布边、车道线为直线。但是仍有部分区域的去畸变效果不好,直线不够直。这个问题会在鸟瞰图中看起来更加突出,也是导致覆盖区域拼接不齐的重要原因。 原因可能有几种:(1)相机光轴与成像平面的交点(主点)与图像平面的中心不重合,即内参矩阵中的 。(2)厂家给的焦距f不准(3)厂家给的畸变表有误差。 理论上相机的标定是一个计算全局最优解的过程,可以理解为:内参可以不那么准,拿到的畸变表也可以不那么准,但是只要优化目标重投影误差很小,或者畸变去的比较干净,那么这个全局最优解就是可以接受的。因此使用了最小化重投影误差的方法得到内参中的 ,然后再使用畸变表;在有的场景中,还有人用棋盘格标定出相机的内参,然后配合畸变表进行使用。这些内容后面都会陆续做优化。
四路鱼眼联合标定 鱼眼相机联合标定的目的是要得到四个鱼眼相机之间的位姿关系,然后将拍摄到的图像搞到同一个坐标系下得到一幅全景环视图。
相机联合标定示意图 如图所示,全景鸟瞰图的视野范围是人为给定的参数,可根据用户喜好进行调节。标定布上的棋盘格大小、黑格子尺寸、汽车与标定布之间的间距这些都是已知的先验信息。上述先验信息在现实世界中与在全景图上的尺度关系为1:1,即1个像素代表1cm(当然这个尺度也可以调节,你想让一个像素代表n厘米也没问题)。这样做联合标定的意义在于:可以知道前、后、左、右四个鱼眼相机去畸变后图像中棋盘格上角点,与前、后、左、右四个鸟瞰图中棋盘格角点之间对应的坐标关系。这样就可以根据投影变换,将整张图像投影到对应的鸟瞰图上去。又由于在联合标定中,四个鸟瞰图是刚好拼接到一块的,因此利用上述方法将四张图全部投影到鸟瞰图上,在不考虑误差的理想情况下,应该是刚好拼接在一起的。以上,就是联合标定的思路。
投影变换
3.1投影变换原理 投影变换的通俗理解就是:假设同一个相机分别在a、b两个不同位置,以不同的位姿拍摄同一个平面(重点是拍摄平面,例如桌面、墙面、地平面),生成了两张图象,这两张图象之间的关系就叫做投影变换。张正友老师的相机标定法使用的就是从标定板平面到图像平面之间的投影模型。
投影变换模型 图中相机从两个不同的角度拍摄同一个x平面,两个相机拍摄到的图像之间的投影变换矩阵h(单应矩阵)为:
其中k为相机内参矩阵,r、t为两个相机之间的外参。这个公式怎么推导的网上有很多,只需要知道,这个单应矩阵h内部实际是包含了两个相机之间的位姿关系即可。这也就解释了:为什么有的avm pipeline的方法是需要标定相机的外参,然后通过厂家提供的相机安装参数将四路鱼眼全部统一到车身坐标系下,而不需要这个过程,只需要用标定布来做联合标定。其实两种方法内部都是相通的,都绕不开计算相机外参这件事情。 3.2 投影变换生成鸟瞰图 生成鸟瞰图的过程可以理解为:将鱼眼相机拍摄到的图像,投影到某个在汽车上方平行地面拍摄的相机的平面上去。这个单应矩阵h具体是多少,由去畸变图中检测到的棋盘格角点坐标和联合标定全景图中棋盘格角点坐标来决定。如图所示,以后置相机为例,联合标定已知图(2)中框出棋盘格的坐标,图(1)中的棋盘格坐标可通过opencv的函数进行检测,从而建立单应矩阵h的求解模型。
(1)去畸变图中棋盘格位置 (2)联合标定全景图中棋盘格位置 (3)瞰图 3.3一些经验之谈 3.3.1尽量选择更多的角点计算单应矩阵 单应矩阵的求解是一个拟合的过程,如果选用过少的点,容易陷入局部最优解。造成的结果是就是鸟瞰图上只有你选择的那些点可以正确的投影,其他像素的投影可能不正确。这一点有点类似于深度学习中训练样本太少,导致过拟合的问题。
单应矩阵三种形式(1)(2)(3) 上面公式可以看出,一对匹配点可以提供两组方程,理论上4对匹配点就可以求解出单应矩阵。opencv求解单应矩阵提供了两个函数,findhomography和getperspectivetransform。 getperspectivetransform的输入是4对点,对(2)中矩阵求逆。理想情况下这种方法是可行的,但由于存在噪声,我们在图像上检测到的角点的误差、标定布棋盘格的误差,这种方法极其不准确。 findhomography求单应矩阵的方法输入点对很多,解一个超定方程(3)。经过一顿推导,单应矩阵为(3)中矩阵的奇异值分解中最小奇异值对应的特征向量。这种方法用于做拟合的样本更多,最终的效果更好。而且opencv还有很多优化算法,例如基于ransac思想的单应矩阵求解方法。当然为了提高效果,可以对标定布进行diy,某宝上很多这种diy标定布,想搞多少格子就搞多少。 如1.2所述,由于畸变去除的不彻底,导致有些直线仍然是弯曲的。这一现象在投影到鸟瞰图上之后尤为明显,通过大量的棋盘格点进行投影变换,可以从一定程度上强制矫正这个问题。至少可以让车身附近的全景图效果更佳,而avm系统最在意的恰好就是车身周围这部分,距离车身远的部分也不会呈现出来。如图所示为某厂diy的标定布示意图。
diy标定布 3.3.2尽量让棋盘格处于相机拍摄图像的中心 鱼眼相机在中心部分畸变小,边缘位置畸变大。去畸变的结果通常也是中间的效果好,边缘残留的畸变多。因此为了使单应矩阵计算的更佳准确,要保证标定布摆放的时候棋盘格位于鱼眼相机中央。这也是为什么某宝上标定布使用的示意图通常是图(2)这种,而不是图(1)。很显然,图(2)中棋盘格位于左侧后视镜附近(左鱼眼相机就在左后视镜上),即相机图像的中间位置,而图1中棋盘格则在相机图像边缘上。
左侧鱼眼相机鸟瞰图(1)(2)
拼接融合
经过3中的投影变换,得到4张包含重叠区域的鸟瞰图如图所示,需要将这些鸟瞰图进行拼接融合。
鸟瞰图 以左、前鱼眼相机俯视图为例,观察下它们的重叠区域重叠区域:
白色为重叠区域、ab为前鸟瞰图边界、cd为右鸟瞰图边界 通常的做法是分别以ab、cd为边界,计算白色区域像素点与ab、cd之间的距离,然后计算一个权重,距离cd越近的位置,前俯视图权重越大;距离ab越近的位置,左俯视图权重越大。但会出现边界效应如图所示:
前俯视图权重图 其原因也很容易理解:如图所示,将ab、cd延长至o点,在eaoce这个区域内,使用上述方法计算权重图才是一个完整连续的模型,如果在eabfdce这个区域内计算权重图相当于把一个完整连续的域强行截断,计算得到的权重图必然是有截断痕迹的。
完整、连续模型示意图 因此需要使用某种策略,让在一个连续的作用域上计算权重,这里提供一个思路:在eafce这个连续的作用域中计算权重,得到一个非常漂亮的权重图:
连续模型和权重图
基于光流的鸟瞰图微调
在整个avm系统中,厂家提供的畸变表、焦距、相机主点位置,联合标定使用的标定布都会引入误差。这些误差会导致生成的鸟瞰图在重叠区域有一些偏移。第4小节中的拼接融合模块是为了让鸟瞰图在覆盖区域过渡平滑,尽量避免伪影现象。但是不能将这个压力全部施加给拼接融合模块。因此需要在拼接融合模块之前,对鸟瞰图进行微调,这个微调功能是供客户或者4s店人员进行手动调节的。 在调研中发现,现在很多部署在车上的avm系统都包含有微调功能。但大部分都存在一个问题:只能保证一边是对齐的,另外一边拼不齐。例如,前面对齐后面对不齐。 使用了,将前、后微调光流图进行融合,得到一个平缓过渡的光流图,兼顾了前后两侧的微调。以左俯视图为例,算法流程如下:
固定住前、后两个鸟瞰图
手动微调左鸟瞰图,使左鸟瞰图与前鸟瞰图之间的重叠区域贴合。记录微调矩阵 m1,并根据矩阵计算光流 map1
手动微调左鸟瞰图,使左鸟瞰图与后鸟瞰图之间的重叠区域贴合。记录微调矩阵 m2,并根据矩阵计算光流 map2
根据像素距离计算 map1 与 map2 的权重图 w,即距离前鸟瞰图越近,map1 的权重越大,反之则越小
使用 w 对 map1 和 map2 进行加权融合
当微调矩阵m1和m2方向正好相反时,这个基于光流的思想可以很好地将两者融合,因为矩阵变换是比较“硬”的一种数学方法,而光流却像水一样的“软”。看下前后对比的融合效果图吧:
左侧为普通的融合效果 右侧为基于光流思想微调后的效果 可以看出这个方法可以兼顾前、后的微调效果。可以理解为将拼接区域的误差均摊给中间的区域,而中间这部分区域不存在拼接融合的问题,而且在泊车的过程中更注重的是车与周围物体的相对位置而非周围物体的精确位置,因此实际看上去也没什么问题。 三维模型纹理映射 2d的avm算法是基于投影变换,将鱼眼图像投影到鸟瞰图上。而单应变换有一个前提:就是平面假设。是把一个平面投影到另外一个平面。存在的问题是:图像中所有的三维物体,例如汽车、柱子、墙,全部被当成平面来处理。这些内容在鸟瞰图上会被拉的很长,如图所示:
2d图像中的三维物体左侧为墙,右侧为车(没错就是车的前杠被拉的好长) 安装在车身周围的鱼眼相机是单目相机,单目相机不能获取三维物体的深度。在图形学中有一种真实感增强的方法:制作一个三维模型,把二维的纹理贴图以某种方式映射到三维模型上,3d avm正是使用了这个纹理映射技术,为驾驶员呈现出一个伪3d的效果。 6.1 avm 3d模型构建 3d模型是由一个个小面片构成的,可以是三角面片、多边形面片等等。面片又是由多个顶点构成的,例如三角面片对应的就是3个顶点。先来直观地看一个三维模型:
3dsmax三维模型 放大看可以看到,3d模型是由很多个小的多边形面片构成。3d模型的文件形式有很多种,但大体上都是包含:模型顶点、面片、纹理坐标、法向量这些三维信息。具体如何使用3dsmax来制作3d模型,就不叙述了,不是专业的美工,方法可能不太聪明,领会精髓即可。 avm 3d模型是一个碗状的三维模型。模拟驾驶员视角,即汽车周围附近是路面,这部分直接映射到碗底平面上;而距离汽车较远的位置可能是楼房、树木、墙等三维物体,这部分内容将使用某种方式映射到三维点上。下面展示的就是3d模型中的必要信息,包含顶点坐标、纹理坐标、法向量、三角面片索引。
//顶点坐标v 166.2457 190.1529 575.8246v 169.0261 192.6147 575.0482v 163.5212 194.2559 576.8094v 160.4214 177.1097 576.3941v 160.5880 183.6252 577.0156......//纹理坐标vt 0.227618 0.463987vt 0.254011 0.468448vt 0.251903 0.470549vt 0.248436 0.466586vt 0.267204 0.509296......//法向量信息vn 0.3556 -0.4772 -0.8036vn 0.3606 -0.4537 -0.8149vn 0.3145 -0.3999 -0.8609vn 0.3101 -0.3998 -0.8626vn 0.3170 -0.3811 -0.8685......//三角面片信息f 5825/5825/4368 5826/5826/4369 5827/5827/4370f 5828/5828/4371 5829/5829/4372 5830/5830/4373f 5831/5831/4374 5832/5832/4375 5833/5833/4376f 5834/5834/4377 5835/5835/4378 5836/5836/4379f 5837/5837/4380 5838/5838/4381 5839/5839/4382 6.2 三维模型纹理映射 这一小节讲述的是: (1)纹理映射是从哪里映射到哪里 (2)采用哪种策略进行映射 最终目标是:找到3d模型上每个顶点对应在鱼眼2d图像上的纹理坐标。 采用的是一种基于虚拟相机思想的3d纹理映射方法,如图所示:
基于虚拟相机思想的3d纹理映射模型 假设2d avm的全景鸟瞰图是由汽车正上方某个虚拟相机拍摄到的图,将其当作2d纹理,以透视投影的方法映射到3d模型上面。图中lw-rw为全景俯视图,虚拟相机与顶点a的直线在鸟瞰图上的交点为a',从而得到a顶点对应的2d纹理映射坐标a'。然后通过逆投影变换h_inverse、畸变mapx、mapy查找到3d模型的顶点a在鱼眼相机上的纹理坐标。遍历3d模型上的每一个点,即可得到三维模型与鱼眼相机纹理坐标之间的映射关系:
根据透视投影原理,计算顶点a对应的鸟瞰图纹理a'
使用矩阵变换和单应变换逆推a'在去畸变图上的坐标a1
通过去畸变的查找表map查找a1在鱼眼相机畸变图上的坐标
遍历上述过程,即可得到3d模型上所有顶点对应鱼眼图上的纹理坐标
具体流程如图所示:
3d模型纹理映射流程 看下效果:这个模型的法向量是反的,所以渲染的结果光线有问题,非常的暗。不过可以看到伪3d的真实感增强效果,领会精神即可。
右侧模型映射 6.3 三维融合 实际上使用的是前、后、左、右4个曲面模型,这4个曲面模型与4路鱼眼图像一一对应,这样做是为了增加opengl渲染的并行,避免在做拼接融合时用到if、else这些判断语句。上图中的3d模型就是左侧鱼眼相机对应的曲面模型。 先来回顾2d avm的做法:生成鸟瞰图,然后做融合。当时生成的鸟瞰图大小为1080*1080,这个分辨率等同于现实世界中的1080cm*1080cm,足以显示车身周围。但是,这个范围最多只能映射到3d碗模型的底部附近区域,如下图:忽略边上的锯齿,那是渲染时插值的bug,先不去管它。从这图可以看出:如果鸟瞰图选的很小,会导致只映射到碗的底部。
小鸟瞰图映射到模型上 把鸟瞰图的尺寸放大,可以看到:
大鸟瞰图映射到模型上 图1为左侧鱼眼相机去畸变后的图像,图2是由图1做投影变换得到的鸟瞰图,图3为映射到左侧模型后的结果 这里要注意:在算法实现上不可以像2d avm那样,去真正地生成一个鸟瞰图。从鸟瞰图不难看出,在远离棋盘格的部分被严重拉长,而图1中接近消失点、消失线的那些像素在鸟瞰图上将会被拉到无穷远。可以这样理解,图一中的消失点、消失线表示:在当前的相机位姿,某一个平面上(例如地面)的点全部在这条消失线以下。而鸟瞰图相当于把相机平行于地面进行拍摄,那么地平面无穷远处(即1中的消失点、消失线)成像在鸟瞰图中必然会被拉长到无穷远处,就像图2一样。有兴趣的可以看看消失点的解释。
消失点 如果想要将整个碗状模型填满纹理,需要生成一个特别大的鸟瞰图。即需要计算一个特别大的map,这个计算量是巨大的。因此在算法实现上,要选用遍历模型上的每个顶点,进行逆向纹理映射的方法计算纹理坐标(不再依赖于生成一个鸟瞰图),顶点之间的空缺将由渲染引擎通过插值的方法进行填充,这个是种成熟的技术。 讲了这么多终于说到三维的融合。2d的融合是对鸟瞰图的覆盖区域做形态学操作,得到下图,然后计算权重。而3d的算法强调的是离散点的思维,不会再生成一个超级大的鸟瞰图。换句话说,算法不会再计算一个像下图一样覆盖区域的图像。因此,要寻找其它的方式来解决3d融合的问题。
左上角重叠区域 如图所示:
右上方重叠区域示意图 大概思路就是计算3d顶点对应鸟瞰图的纹理坐标b。通过ab与m、l的夹角与计算权重。 当然,重叠区域不可能这么理想,这个论文中的示意图l和m正好交于a点。实际情况是它上面那个图的样子。需要使用某种专门针对3d avm融合的策略来实现之。将3d模型顶点对应的权重图映射到二维的示意图:
放大看 总体来讲3d avm算法就是先搞一个3维模型,然后通过纹理映射,将3维模型上的每一个顶点与二维的纹理图进行绑定。opengl利用上述数据进行渲染。最终的3d效果后续会发上来。 在线阶段工程实现pipeline 前面介绍的是离线阶段的算法流程,离线阶段只有在流水线上或者4s店才会用到,是一个初始化的过程。初始化的内容包括:畸变表、投影变换矩阵、纹理映射关系、拼接融合权重图等。最重要的是要将去畸变、投影变换、纹理映射这些过程写入一个查找表,存入内存,在线处理的时候直接调用即可。附上部分代码,对map做remap这块可能会稍微难理解一些。
//4个label是鸟瞰图在avm全景上的位置坐标for (int i = label1; i < label2; i++){ float *map2_x = map2_xr.ptr(i); float *map2_y = map2_yr.ptr(i); for (int j = label3; j < label4; j++) { mat vec = (mat_(3, 1) < 0,因为时间不可以停止和回朔。
由于时间缩放我们修改了沿着路径的时间分布,使其按照时间τ分配:
更高阶的导数和其他状态变量可以用类似的方法计算。通过(14)可见,当τ‘ ≠ 1时,时间缩放不会改变参考路径的几何形状,仅仅是速度和更高阶导数会变化。
6. 跟随控制
仅讨论跟随控制的关键特征。给出了一些两输入车辆动力学(4)控制解决方案。这些方法确保了参考路径的指数跟踪。在单输入情况下,算法需要修改才可以使用,因为控制器无法影响车辆速度。想法是通过时间缩放输入来补偿缺失的速度输入。
可以使用以下的时间缩放方程。
(5)中给出的模型等式随着t的演变可以变形为使用缩放时间,这样我们得到:
这个缩放模型现在有两个输入(us和δ),选择参考文献中的一个控制器做跟踪,它会依据缩放的参考路径和实际路径的跟随误差计算δ 和us。公式(14-16)要求的时间缩放函数及其导数,可以使用以下基于(17)的关系式计算:
如果信号us 和ud 是一样的,那么时间缩放函数满足τ‘ > 0。若其中一个信号等于0,车辆是不可控的。这种情况一般发生在运动最开始和结束的时候。
闭环控制机制如图4。首先,路径规划模块计算以τ 为参数的参考路径。第二步,基于车辆的纵向速度vd 缩放该参考路径。vd 由驾驶员输入,且和由控制器计算的缩放输入us相关。时间缩放后我们得到一个基于t 的缩放参考路径。控制器根据实际和缩放参考路径的误差确定它的输出。这样车辆的输入是驾驶员产生的纵向速度vd 和控制器计算的δ,输出是车辆的位置,包括参考点坐标和朝向。
图4:带时间缩放的跟随控制机制
7. 结果
在某轿车上应用了所展示的方法(见图5),该车使用蒂森克虏伯的epas来实现前轮转向。路径规划和跟随控制在一个固定在车上,且连接到epas执行器和can总线的dspace硬件(专用autobox)中运行。
示例的运动是一个向前泊入的操作,结果如图6。系统能够跟随参考路径,车速是非固定的。
图6:左图 - xy平面的车辆路径
右图 - 车辆vd和δ对时间的曲线
8. 结论
讨论了一个apas系统的两个部分,所示的路径规划方法可以实时计算连续曲率曲线。时间缩放跟随控制在驾驶员输入车速时跟随参考路径。时间缩放函数由车速和一个缩放参数计算得出,缩放参数由控制器基于闭环特性计算。展示的算法在车上做了测试,取得了令人鼓舞的结果。
(5)模拟显示
在自动泊车过程中,还会由传感器反馈构建泊车环境模拟,给驾驶员进行提示与交互,提示用户处理器意图,让驾驶员在车辆自动泊车过程中可以进行必要的操作,并可以在车辆自动泊车过程中发现问题时立刻介入自动泊车过程,从而避免危险的发生。另外路径规划后进行泊车时为了知晓处理器定位和计算路径运行情况,需要将这些处理器信息反馈给用户。如果处理器获取环境信息或者处理过程中出现重大错误,用户可以及时知晓与停止。
编码器与PLC的接线方法
TWS无线耳机的五大核心技术
小米Redmi Note8和荣耀9x你会选择哪一个?
思码光氛围灯带,独一无二描绘你心情
大争之世制造为基,ITES深圳工业展擎旗而来!
什么是自动泊车系统?自动泊车路径规划和跟踪技术分析
【科普小贴士】金属氧化物半导体场效应晶体管(MOSFET)
博世和西门子“洋贵族”风光不再?高端家电市场逐渐失守
Vishay将为设计人员提供符合IrDA®标准的红外收发器模块--TFBR4650
华为荣耀9和和小米6谁更值得买?华为荣耀9和和小米6外观、性能、价格区别对比评测
休眠功能对于低功耗蓝牙模块的重要性
激光振镜运动控制器(一):ZMC408SCAN接口与功能
信息化集成化信号采集处理系统的实验操作说明
LTC3859为现代汽车电子设计提供紧凑型解决方案
佳欣LED节能车灯荣获2010 AMPA创新产品奖
盘点连接器的六种锁定机构
如何加快推动全国有线电视网络整合和广电5G建设一体化发展
220交流接触器如何接线 三相接触器220线圈接线方法
简单led闪灯电路图
星三角启动电路图各符号意义