文章转自知乎,作者:燃烧的Ackermann
在知乎上看过不少大牛写的自动驾驶技术介绍文章,大多谈到的是AI, Deep Learning, Computer Vision等等感知(Perception)层面的。但在各个传感器(雷达、摄像头、激光雷达等)探测到目标信息及周围环境后,车辆该如何做出反应?自动驾驶的大脑该怎样根据感知层的信息对车辆进行控制?
这些其实都是在自动驾驶软件中的功能应用层中实现,那么功能层还需要做些什么呢?本文试图以最简单的语言就以下几方面聊聊自动驾驶中的功能开发。
- 什么是自动驾驶系统的功能?
- 自动驾驶中的功能要做些什么?
- 功能设计包含了哪些内容?
- 练习一下
1 什么是自动驾驶的功能?
严格来说,本文并不讨论“自动驾驶”这个主题。考虑量产的情况下,所谓的自动驾驶现阶段只能分为高度自动驾驶(Highly Automated Driving, HAD)和部分自动驾驶(Partially Automated Driving, PAD),所以本文出现的自动驾驶字样代表的是HAD和PAD。
HAD--- L3+的功能。Audi A8的交通拥堵引导(Traffic Jam Pilot, TJP)算一个,尽管宣布了很久后依然没有上市。
PAD--- L1-L2的功能。比如国外Tesla的Autopilot,Cadillac CT6的Super Cruise,国内吉利博瑞GE的智能领航,长安CS55的IACC,荣威Marvel X等等,均可以归类到此。
那什么是功能呢?
刚才HAD或PAD里举例展现出来的系统都是由一个个功能组成的,比如Tesla的Autopilot,其实就包括了以下功能:
- 车道偏离预警 Lane Departure Warning (LDW)
- 自适应巡航 Automated Adapt Cruise (ACC)
- 交通拥堵辅助 Traffic Jam Assist (TJA)
- 高速功能辅助 Highway Assist(可变道)(HWA)
吉利和长安的基本也包含以下几个功能:
- 车道偏离预警 Lane Departure Warning (LDW)
- 车道偏离预防 Lane Departure Prevention (LDP)
- 自适应巡航 Automated Adapt Cruise (ACC)
- 交通拥堵辅助 Traffic Jam Assist (TJA)
- 集成式巡航 Integrated Cruise Assist (ICA)
当然,这些功能不同的OEM叫法都不一样。可以看出,无论是什么级别,自动驾驶其实是由一个个小功能组成,甚至Super Cruise中的驾驶员Handsoff也可以算作一个功能。再举例,Audi A8中的L3功能,其实也是在包含了LDW/LDP/TJA/ICA等等一系列功能的基础上,再加上TJP。当然,自动驾驶级别越高,单个的功能也会越复杂。
至于这些功能在哪实现,可以在传感器中,在雷达ECU中,在摄像头ECU中,或是在中央控制器ECU中(发展趋势),均是可以的 。
2 自动驾驶中的功能要做些什么?
现在的车载ECU软件,基本都是按照AUTOSAR架构标准设计,如下:
功能基本都在Application Layer中实现,至于其它层的作用,由于相关性不高,这里就不赘述了。
参考下图,可以把每个功能理解为一个函数,有输入输出,通过获取传感器和车身CAN的信息,经过分析计算,输出CAN信号对车辆进行控制和显示。
具体来说,
输入
- 各个传感器识别到的感知信息,比如摄像头识别到的车道线信息,交通灯/路标信息,雷达识别到的车辆信息,周围物体信息等等
- 车身CAN上传入的信号,一般又能分为几类:
- 车身状态信号(车速,横摆角速率,手力矩等等)
- 驾驶员操作信号(功能开关,转向灯,油门,刹车等)
有了这些输入信息后,就可以通过功能的内部运算来进行输出,输出以下信息:
输出
- 车辆控制信息
- 发送给EPS的车辆转向扭矩角度等
- 发送给EMS/ESP的车辆加减速信息
- HMI信息提示
- 当前功能的状态
- 驾驶员的提示信息等
那么重点来了,功能的内部运算如何实现?我们这里就介绍下功能设计所包含的内容。
3 功能设计包含了哪些内容
功能层设计中主要包含了以下几个方面:
- 状态机 State Machine
- 人机交互 HMI
- 控制器 Controller
分别设计实现以上几个方面,就能相对完善地做出一个功能。这里以车道保持辅助( Lane Keeping Assist, LKA) 功能设计为例,看看要做些什么。
LKA指的是通过摄像头识别车道线,检测本车在自车道中的位置,经过实时计算,连续输出扭矩请求信号至执行器电子助力转向系统EPS,以控制车辆随时保持在车道中间行驶,如下图:
好了,那现在我们要在一辆车上实现车道保持,在感知层已经开发好的基础上,功能层该怎么做呢?
第一步,是需要设计一个状态机。这是功能开发中最复杂也最重要的一部分,因为无论HMI的输出还是控制信号的输出都需要基于状态机。状态机指的就是LKA功能当前处于哪种状态下,这些状态之间在何种条件下如何转换。
在ISO 11270 Intelligent transport systems — Lane keeping assistance systems (LKAS) — Performance requirements and test procedures中,为我们展示了一个状态机,如下图:
可以看出,其将LKAS分为了OFF和ON两个主状态,ON中又分为了standby和active两个子状态,这样设计是最佳的么?其实不一定,这里展示的仅仅是一个最基本的状态机,根据OEM需求的不一样,对于HMI显示的不同要求,是可以将这个状态机扩展开来的。
比如主状态,其实除了ON和OFF,是否需要额外表示ERROR状态,ERROR又可以分为Permanent Error和Temporary Error,那在这些状态之间,如何切换呢?
OFF -> ON:这个比较直观,驾驶员按下开关,软件读取到功能开启的信号后
ON -> OFF:同理,驾驶员将功能关闭
那么如果此时功能是OFF,这时候功能出现故障,比如传感器出现故障,或所需要接收的车速等重要信息报文丢失,此时的状态是继续保持OFF还是转为ERROR呢?这些就是状态机里需要定义的了。
此时功能状态是ON,这时候出现故障, 状态应该跳到ERROR,但之后,故障自动消失,比如之前丢失的报文又重新正常发送,那此时功能是回到ON还是回到OFF(让驾驶员手动重新开启)?这里,一样是取决于功能定义策略,没有哪种一定好或一定不好。
那LKA在ON的状态下,有active和standby两种状态。active顾名思义,功能正在激活,方向盘此时依据软件计算发出的请求扭矩进行自动调整,但出现了一定抑制,比如车速过低,一般而言,LKA只在车速60以上才可以使用,那如果功能开启,但车速在60以下,此时就是standby了。那仅仅standby和active两个状态就够了么?其实也不一定。
这里需要引出抑制条件的概念,这也是LKA功能设计中比较重要的一环,LKA功能设计的初衷是辅助驾驶员打方向盘,使其开车时更加舒适,那么如果驾驶员想要变道,此时如果还发出扭矩牢牢控制住方向盘把车维持在中间,是不是就有问题了?如果车辆处于一些极端工况下,这时候LKA还在正常激活,是否会对驾驶员的操作进行干扰?同样的,如果激活过程中突然丢失了车道线,LKA也应该进入抑制状态。
因此,在驾驶员主动超越或车身状态不适合LKA或周围环境不支持LKA时,功能需要被抑制。常见的抑制条件如下:
- 转向灯开启
- 作用在方向盘上的手力矩过大
- 方向盘转角速率过大
- 猛踩刹车
- ABS/ESP激活
- 等等
那么,那以上这几种情况下,既可以让功能进入standby,也可以增加一个新的状态机override等等,可以将抑制分为几类,不同抑制产生时对应不同的状态。这样做的目的是什么呢?是为了让驾驶员更加了解自身所处在的环境情况,根据这个功能当前处于哪种状态,更清晰地了解该系统。
由状态机中得知,HMI中最基本的就是我们需要知道这功能什么时候是开启的,什么时候是关闭的,也就是说需要接收该功能的开关信号。可以是驾驶员方向盘边上的硬开关,也可以是中控大屏里的软开关,这个不重要,但重要的是功能需要接收驾驶员是否开启功能的信号。
此外,作为驾驶员,我需要知道功能开启后给我的反馈,该功能是否开启,是否可以工作,是否激活,是否有故障等等。这些输入的基础就是状态机了,功能将自身的状态发出给仪表,作出不同的显示,这部分就是HMI要做的内容。
这一块也是不同OEM区别最大的部分,有的可以做的很酷炫,比如特斯拉,可以将摄像头识别到的车道线信息显示出来,是直道还是弯道,且弯道能随道路半径的不一样而变化,实线还是虚线等等。这些信息就是通过HMI直接输出到CAN上,仪表以此作为输入进行显示的。
Tesla Autopilot
所以,一定要理清楚该功能的输入输出是什么?有哪些需要驾驶员输入的信息,有哪些信息需要提供给驾驶员。
车辆控制里大致分为开环控制和闭环控制。
以LKA为例,比较常用的就是PID控制了。
开环里的前馈控制,look up table也是使用频率比较高的。
但既然用在量产的LKA中,实际车辆上的情况还是非常复杂的,实际应用控制算法会基于这些基础版的开环控制和闭环控制有很多改进,这部分比较涉及核心,就不细说了。
4 举个栗子考虑下该怎么设计脱手检测功能
对于一个功能来说,在完成以上几点后,相当于就有了输入输出,有了内部的状态迁移,根据这些状态迁移可以反映出不同的功能状态信息提示驾驶员。对于整车来说,仪表显示交互就完成了,再加上控制算法控制车辆行驶,基本上一个功能就形成了。
这里,大家可以想想如何设计一个脱手检测功能。
图片来源于网络
输入:方向盘上的手力矩信号 or 电容传感器
输出:提醒驾驶员接管信号
要求:在检测到驾驶员脱手驾驶后发出接管提醒,可以分级发送,在仪表上作出不同的提示,在驾驶员始终脱手并没有接管后,将车辆安全刹停。
怎么实现这个功能呢?
一样可以从HMI 状态机 控制器来思考,当然这里涉及的车辆控制部分不多,主要是前两种。大家可以思考下如何从这几方面来设计~