首页 > 其他分享 >SystemVerilog与deep Learning

SystemVerilog与deep Learning

时间:2022-10-30 06:11:06浏览次数:65  
标签:10 deep 路感 时间 驾驶 Learning 转向 线控 SystemVerilog

SystemVerilog与deep Learning

参考文献链接

https://mp.weixin.qq.com/s/ZPhn1Wgys3i0fkeKgAfpsQ

https://mp.weixin.qq.com/s/yyjAPn3d8mLIVE2Ridy18w

https://mp.weixin.qq.com/s/wzQzLzV_eS9zkYB0DW8xyQ

SystemVerilog中的time、time的一些事儿

在搭建验证环境时,经常需要在环境中插入很多info用于输出一定的log信息用于进行debug,在插入这些info方法的时候,经常需要同时输出该方法执行的具体时间,用于方便定位问题,为此在Verilog和SystemVerilog中提供了一堆关于time的方法,如果对于这些方法使用的不是很恰当,可能显示出来的结果与期望有些许差异,本文将通过示例,说明这一对time的方法是如何做的妖。

1 $time

当$time被调用时,将会返回一个64位的整型变量,用于表示该系统函数调用时的仿真时刻,返回的这个值是按照以下步骤得到:

(1)当前延迟值依据模块设置的timescale时间单位和精度得到实际仿真时间;

(2)调用该函数返回的值为上一步得到的时间按照timescale设置的时间单位缩小表示后四舍五入得到的整型值;

【示例】 

 

 

 【仿真结果】 

 

 

 示例中,时间变化主要包括仿真器波形显示时间和$time调用返回显示的时间,这两个时间的变化过程如下:

sig从“00”变成“11”发生在12ns,该时间由当前模块的时间单位和时间精度决定,即(1.234267*10≈12),$time返回的时间是12ns按照设置的时间单位缩小至1.2后四舍五入取整得到的,所以此时log显示时间为1;

sig从“11”变成“01”发生在24ns,该时间由当前模块的时间单位和时间精度决定,即(第一次延迟值1.234267*10≈12,当前延迟值1.225232*10≈12,12+12=24),$time返回的时间是24ns按照设置的时间单位缩小至2.4后四舍五入取整得到的,所以此时log显示时间为2;

sig从“01”变成“10”发生在36ns,该时间由当前模块的时间单位和时间精度决定,即(第一次延迟值1.234267*10≈12,第二次延迟值1.225232*10≈12,当前延迟值1.245678*10≈12,12+12+12=36),$time返回的时间是36ns按照设置的时间单位缩小至3.6后四舍五入取整得到的,所以此时log显示时间为4;

为了进一步理解时间的变化,我们将示例中使用的时间单位和时间精度“10ns/1ns”修改为“10ns/1ps”来看下仿真时间和$time显示的时间之间的关系。

【示例】 

 

 

 【仿真结果】 

 

 

 通过仿真结果可以看到,因为时间精度的修改,此时的仿真时间分别变为了:12.343ns、24.595ns和37.052ns,但是$time调用显示的时间还是1、2和4。可见仿真时间是受当前module的时间单位和时间精度的影响,sig第一次变化时$time返回值为1.234267*10≈12.343ns按照设置的时间单位级缩小至1.2343后四舍五入取整得到,所以此时log显示1,sig第二次变化时$time返回值为当前延迟值(1.225232*10≈12.252ns)与第一次延迟值(12.343ns)之和24.595ns按照设置的时间单位级缩小至2.4595后四舍五入取整得到,所以此时log显示时间为2,sig第三次变化时返回值为当前延迟值(1.245678*10≈12.457ns)与前两次延迟值(12.343+12.252)之和37.052ns按照设置的时间单位级缩小至3.7052后四舍五入取整得到,所以log显示为4。仿真结果汇总如下表。

选项

sig值

2’b11

2’b01

2’b10

Timescale

代码延迟

1.234267

1.225232

1.245678

10ns/1ns

10ns/1ps

$time

Log显示

1

2

4

10ns

-

仿真显示

12

24

36

1ns

-

Log显示

1

2

4

-

10ns

仿真显示

12.343

24.595

37.052

-

1ps

2 $stime

当$stime被调用时,将会返回一个32位的无符号整型变量,用于表示该系统函数调用时的仿真时刻,返回的这个值会按照当前模块设置的时间单位,对调用时刻值进行四舍五入后显示具体时间,其用法与$time类似,只是$stime返回32位整型变量,所以其调用时表示的时间范围相较$time小,示例与$time相同,此处不再赘述。

3 $realtime

当$realtime被调用时,将会返回一个real型变量,所以其表示出来的形式一般为小数形式,用于表示该系统函数调用时的仿真时刻,时间单位为当前模块设置的时间单位。

【示例】 

 

 

 【仿真结果】 

 

 

 示例中,时间变化主要包括仿真器波形显示时间和$realtime调用显示的时间,这两个时间在之间的关系以及变化过程如下:

sig从“00”变成“11”发生在12ns,该时间由当前模块的时间单位和时间精度决定,即(1.234267*10≈12),$realtime返回的时间是12ns按照设置的时间单位缩小至1.2后得到,所以此时log显示时间为1.2;

sig从“11”变成“01”发生在24ns,该时间由当前模块的时间单位和时间精度决定,即(第一次延迟值1.234267*10≈12,当前延迟值1.225232*10≈12,12+12=24),$realtime返回的时间是24ns按照设置的时间单位缩小至2.4后得到,所以此时log显示时间为2.4;

sig从“01”变成“10”发生在36ns,该时间由当前模块的时间单位和时间精度决定,即(第一次延迟值1.234267*10≈12,第二次延迟值1.225232*10≈12,当前延迟值1.245678*10≈12,12+12+12=36),$realtime返回的时间是36ns按照设置的时间单位缩小至3.6后得到,所以此时log显示时间为3.6;

为了进一步理解时间的变化,我们将示例中使用的时间单位和时间精度“10ns/1ns”修改为“10ns/本文示例1ps”来看下仿真时间和$realtime显示的时间之间的关系。

【示例】 

 

 

 【仿真结果】 

 

 

 通过仿真结果可以看到,因为时间精度的修改,此时的仿真时间分别变为了:12.343ns、24.595ns和37.052ns,但是$realtime调用显示的时间还是1.2343、2.4595和3.7052。可见仿真时间是受当前module的时间单位和时间精度的影响,sig第一次变化时$realtime返回值为(1.234267*10≈12.343ns)12.343ns按照设置的时间单位级缩小至1.2343后得到,所以log显示为1.2343。sig第二次变化时$realtime返回值为当前延迟值(1.225232*10≈12.252ns)与第一次延迟值(12.343ns)之和24.595ns按照设置的时间单位级缩小至2.4595后得到,所以log显示为2.4595,sig第三次变化时返回值为当前延迟值(1.245678*10≈12.457ns)与前两次延迟值(12.343+12.252)之和37.052ns按照设置的时间单位级缩小至3.7052后得到,所以log显示为3.7052。仿真结果汇总如下表。

选项

sig值

2’b11

2’b01

2’b10

Timescale

代码延迟

1.234267

1.225232

1.245678

10ns/1ns

10ns/1ps

$time

Log显示

1.2

2.4

3.6

10ns

-

仿真显示

12

24

36

1ns

-

Log显示

1.2343

2.4595

3.7052

-

10ns

仿真显示

12.343

24.595

37.052

-

1ps

通过仿真结果可以看到,仿真时间是按照当前module设置的时间单位和时间精度进行显示,而$realtime函数显示的时间为仿真时间按照时间单位数量级缩小后得到的。

通过上述示例可以看到,在进行仿真时,当出现log显示时间与波形不一致时,要注意产生log信息使用的关于time的函数是什么,同时也要注意当前模块设置的时间单位和精度,如果为了得到与仿真波形时间吻合的时间,可以使用$realtime。

基于自动驾驶需求的线控转向设计方法

本期活动主要分享主要围绕5个方面:一是自动驾驶的横向控制需求;二是线控转向软件架构;三是冗余系统的互诊与仲裁;四是路感协同控制;五是线控转向的测试与评价。

一、自动驾驶的横向控制需求
自动驾驶的横向控制需求和传统的执行部件有些不一样。在实际过程中,比如转向或制动,目前国内研发中很多是逆向开发,或是基于当前状态的开发,缺少一种正向开发观念,所有的执行部件和线控部件都是为了满足驾驶员或整车运动控制的需求。
所以,在设计转向时必须要有一种正向思维方法,不是去编辑MAC的校验方式,而是从驾驶员的需求、自动驾驶的需求来设计线控部件。因此,首先要知道自动驾驶需要底盘做什么,或驾驶员需要底盘做什么样的操作。
目前,转向的发展基本上分为两个等级,一是小于等于L2的电动助力转向EPS,但EPS中除了原先的辅助助力系统,还增加了一些线控接口指令。还有一种是大于等于L3的线控转向,现阶段有它的特殊性,如果小于等于L2,失效时主要功能安全会关掉,是fail off。对于大于等于L3的状态,就要fail-operationl,即在失效时能够保证一定功能或降级功能,基本上具备转向功能,这是一个非常重要的临界点。软件定义底盘

 

 为了实现上述功能,提出了各种各样的技术,首先要有一个正向思维,自动驾驶对底盘有一定需求,左边的软件定义底盘是我们研究院和清车智行提出的。定义软件底盘需要根据自动驾驶的需求或独立移动底盘的需求。以后整车发展可能是底盘加座舱,即三域两平台,三域支持自动驾驶、智能座舱域和线控底盘域;两平台是智能座舱和智能底盘两个硬件平台。随着智能座舱形状的不断改变,首先我们要定义各种座舱形态,即各种座舱的稳定性是要定义的指标。

只有在这个指标下,再考虑自动驾驶的规划指令,定义当前的整车是什么状态,是稳定状态还是失稳状态,还是临界稳定状态,即安全等级预测模型,模型限定后,就可以最大限度地保证横纵协调得到实际执行。
横纵协调指令出来后,还有软件定义来定义执行系统的软硬件解耦,因为底盘域是一个大的运算平台和算法中心,底层转向制动,甚至悬架和驱动相关的应用层算法都可以在平台上不断迭代,所以要进行执行系统线控和系统软硬件解耦,再定义横纵协调相关指令,同时软件定义底盘还可以定义自动驾驶的扩展功能,这就是软件定制底盘的需求。
我们研究院基于大于等于L3的底盘域控,实现了涉及的安全等级预测、动态控制、软硬件解耦的相关架构。右边的线控执行系统对满足底盘控制要求和整车要求提出了不同需求,特别是对转向冗余设计和功能安全,包括高阶路感的体验要求,后期还有独立转向相关功能需求。
从技术路线来说,是从软件定义底盘到域,再到执行组件,在实际生产过程中,产品要落地,还要基于执行部件反过来倒推,以满足一级一级的技术要求,这就是软件定义底盘。

自动驾驶分级

 

 

随着自动驾驶和驾驶辅助系统的不断成熟,自动驾驶的分级已进行了好几轮优化。最新版SAE驾驶自动化等级很关注L3如何实现,去年SAE明确提出L3时,在功能请求时必须由人驾驶,如果整车没有请求,如果整车发生安全事故或其他危险时,责任在于整车;功能请求一旦发布,必须要有人直接接管,这之间的时间延时如何实现,各家有不一样的观点。在安全风险预测方面,功能请求时,必须要有一定缓冲时间留给驾驶员进行相关操作,因为理论上,L3双手可以脱离方向盘,脚可以离开制动踏板,甚至可以短时间阅读手机/报纸。而当整车有自身所无法克服的安全风险时,向驾驶员提出请求,必须由驾驶员接管。
在不断实践过程中,缓冲时间要不断优化和更新,主要还是安全或风险预测的时间,或提前响应的时间,所以L3也是一个很纠结的阶段,甚至有人认为应该是2.99或直接跳过L3,但L3短期内还是一个不可避免的过程,所以很多基于转向的研究都是L3和L2之间或L3之间,L3内自动驾驶和手动驾驶直接切换是一个很大的考验,自动驾驶和手动驾驶切换Switch Ramp处理方式很重要。
到L4、L5时,也有一些典型状态,L4还有方向盘,只不过是完全解耦的状态,L5方向盘已经不存在。对转向来说,各家主流研发目标和研发路径也不一样。欧洲有两种,一种是到L4时就可以取消方向盘,换成驾驶终端,即操作手柄,进行紧急切换,也有的还保留方向盘,设计思路不一样,所以当前阶段还要考虑L3和L3到L2之间的Switch Ramp问题。
横向控制发展趋势

 

 什么是横向发展?如果从自动驾驶的底盘控制层面考虑,以后可能有三轴方向控制,即横向、纵向和垂向的三向控制,转向是横向控制中最主要的操作,包括自动实现转向,所以横向控制是后期发展的重要控制层面。

汽车行业向电动化、智能化、网联化发展,软件定义汽车得到了推广,域控制电子电气架构从分布式到域控制,再到集中域,甚至后期的中央电脑方式,不断快速发展。作为关键的横向控制机构,转向系统是未来发展的方向。
未来的转让系统会有几方面要求,一是路感模拟和性能要求,L3到L4阶段是很重要的阶段,这时还有方向盘,而且是完全解耦的方向盘,这时会有一些要求,比如弱震动噪音减弱、可变转向比、运动控制,都需要在路感模拟和性能需求中体现。
对线控底盘的要求包括转向和方向盘的灵活布置、基于底盘域的结合设计、跨平台应用。从安全可靠性来看,有fail-operationl(失效可运行)、冗余架构和功能安全。自动驾驶方面,L2、L3之间的转换涉及角度控制、方向盘静默/折叠。

自动驾驶等级对转向的需求

 

 自动驾驶对转向的需求完全基于当前的自动驾驶程度,对转向特点提出了要求,首先是从常规的0级到1级、2级,以驾驶员和驾驶员系统为主。常规的电动处理转向选用单纯的三相电机、独立电源、位置传感器和一个或两个核的控制器,不一定有异构冗余,因为L2以下是fail off状态,一旦发生危险或故障就会关掉。

功能安全等级方面需要双核功能,特别是在无法关掉时,必须要实现ASIL D安全等级,即必须关掉时必须要关掉。象限保护也是为了满足ASIL D,出现相间短路、电机短路时能够及时关掉,保证相关通讯、网络安全、机械耦合状态。
到L3会有很大的变化,驾驶主体责任人是系统,整个EPS设计也就是线控转向设计是冗余EPS执行机构设计。转向系统已跨到线控转向,其两部分一是路感模拟,二是转向制动控制或转向执行,需要六相电机或双电机配置,采用双电源、双TAS备份、三内核,当然也可以是两个功能核,再加一个锁步核,以保证功能安全级别和安全的实施。
安全等级达到ASIL D,就必须要有异构冗余措施,有预期功能安全因子分析、象限保护、多通讯模式、硬件安全模块模组,以保证相关的通讯,这时取消了机械耦合,但还有方向盘。
到L4、L5,方向盘是可屏蔽状态,甚至采用一些控制终端去实施。欧洲有两种声音,一是方向盘,二是终端,但美系和日韩系还是偏向于用方向盘,不希望用终端方式。

底层执行机构软件定义集成控制

 

 作为一个大的运算中心和算法平台,底盘域是可以不断地OTA迭代的芯片平台,很多算法会上移。转向系统会将应用层在1或2毫秒层面直接进行算法上移。转向系统以后只会保留电机控制、机械系统和转向电机,特别是电机诊断实时系统,而应用算法都在底盘域中,所以给转向行业的工程师提出了更高要求,需要具备软件的软实力和机构不可替代的硬实力。以后的商业模式将转向系统厂商提供一套硬件系统,再加上打包的一套软件系统,直接给整车厂或Tire 1进行集成。

如何在这个过程中保证软件附加值,是从事转向行业的人需要考虑的事情。同样,制动也是这样,要增强软实力和硬实力,有自己独有的控制算法和一些专利保护,这些都会体现在后期的软件附加值中。
底盘控制软件协调控制封装组件
底盘域封装组件和转向相关的算法包括:前后轮协调转向控制、主动转向前后轮独立运算控制算法和线控转向路感模拟,这三块是软在底盘域中要上传到封装组件中。
线控转向软件组件

在AUTOSAR架构中,线控转向软件组件是SWC层面的软件组件,每一个软件组件都有相关功能描述,比如以正向思维设计转向功能,驾驶员转向自动驾驶、辅助系统功能,如车道保持,需要相关的扭矩接口、力矩接口或横向齿条力接口,通过转向驾驶控制模块、线控转向或EPS实现相应功能。
这个模块分成三部分,一是基础转向,侧重人驾驶的力矩控制,因为不管是L2还是L3都有方向盘,涉及基础助力,只不过会呈现在路感模拟中。通过分析齿条力的大小和路感波动,体现在路感方向盘的力矩控制。
同样,还有回正和阻尼控制、高阶路感反馈、补偿控制、冗余仲裁和力矩指令叠加,以及角度控制,因为目前自动驾驶更流行通过目标角度或目标角速度达到目标角度的精确定位、角度控制和转向轮位置协调,实现脱手控制、手动/自动驾驶切换或L3向L2切换等。角度控制可以让驾驶员主动接管或被动接管整车有一个安全过渡。另外,后轮转向控制算法在很大程度上依赖前轮转向实现,后轮转向是一个执行器,这个过程中还涉及前后轮主动协调。
横向控制不单是方向盘转向控制,还有纵向控制,比如过转向、坡道制动、对接路面等,如何保证更好的制动效果,或在转向失效或异常时保证紧急转向的实施,涉及转向和制动的协调控制。
通过进行协调控制,比如在过转向或在坡道制动时,会有一个主动转向过程;在转向失效时,会有一个强制转向或差速转向过程,以保证整体转向制动的协调,最终达到转向效果。
横向稳定控制流程

 

 横向稳定控制流程是从底盘域基础上实现的横纵向稳定性,根据车辆动力学和轮胎动力学,对轮胎附着系数进行修正。根据线控底盘发展路线图,2025年前,主要是研究轮胎的横向和纵向控制;2030年后,会进行横纵垂相关的研究。基于横向纵向主要进行车辆动力学和轮胎动力学相关研究,以得出动态稳定域,通过安全等级限制进行修正,得到相关指令,再进行车辆受控稳定性研究。

整个过程和路面附着系数、车型参数、轮胎模型相关联,所以横向稳定控制要考虑自动驾驶、整车动力学稳定性需求,以及操纵稳定性指标要求、轮胎动力学要求,还要考虑转向制动如何协调,所以单纯看转向,有很大的局限性,但如果从横向角度去看,很多东西可以在前期进行知识储备。
线控转向组件关键参数

 

 主流线控转向组件目前有两类,一是摇臂式,比如商用车;二是齿轮齿条线控转向器。上图是路感协同管柱,取消了中间轴,构成一个完全解耦的线控转向部件。另外,还有方向盘隐藏或收缩机构、路感协同器、转向执行器。2010年之前这种设计比较少见,基本上都是分离的,2010年后,功率组件形式逐步成为主流,因为环境恶劣,控制器的设计指标、稳定性要求越来越高,需要与执行电机集成在一起,容易受到EMC干扰,也容易受电机发热的影响。

一般过了三年期,电机会出现很多问题,前期是控制器出现问题,在大批量生产中有一些体现,需要有控制精度要求、响应时间要求和齿条力估算要求。随速转向基本上采用AUTOSAR架构,用ASIL D等级要求约束,包括最大转速要求和平顺性相关要求。
商用车线控转向

商用车转向原来基本上是循环球占主导,但研究思路逐步拓展,不管是转向和制动,目前电动助力转向最大的改进就是去掉了液压,实现纯电动助力转向。商用车目前还是以液压助力为主。
液压存在维护困难、安装困难、响应困难和控制困难几个难点,如何取消商用车转向中的液压,国内外都在研究,一些企业已将它列入计划,如舍弗勒、采埃孚,都在做这方面的研究。
随速转向比因车速而异,智能电液需要相关的额外补偿系统,比如多刚度稳定系统。因为助力方式不单是电机助力,还有手助力、液压助力、轮胎反弹力等不同来源,所以要把多刚度系统调制成一个稳态系统。如何通过惯量前馈补偿来增强系统的响应性和换向的快捷性也很重要。因为商用车质量过大或惯量过大,或在减速比过大时,会影响路感体验,如何进行主动路感补偿也是商用车转向要考虑的关键问题。
二、线控转向软件架构
线控转向软件架构与底盘安全架构基本上类似,线控转向一方面要实现自身功能,另一方面要满足功能安全fail-operationl需求;第三是在这个平台上有不断迭代可升级的空间,这些都对转向软件架构提出了相关要求。
线控转向系统功能架构

 

 线控转向分为两部分或三部分,一是转向盘总成,其中有两部分:路感模拟和管柱调节,管柱调节可能是隐藏或可调式,对转向盘总成有相关的要求,涉及一些相关部件;而转向执行机构总成涉及主流的滚动丝杠方式,也有四轮独立360度角模块或±90度角模块转向机构。这些系统与自动驾驶安全等级的渗透率需求直接相关,渗透率越低越难落地。国外也发布了路线图,在2024年/2025年会推出整体L3或L4驾驶,所以对线控转向提出了很高要求。

当然,这种系统在L2时也有一些应用场合,技术的足够成熟必须要有很多市场反馈的数据样本来进行验证,其在L2中的优势包括随速减速比,比如低转速时掉头,打很小的角度车轮就可以达到最大角度,可以很快捷轻便地掉头、转向。虽然有一点需求,但其成熟度必须有大量的市场售后数据支撑。
线控转向冗余架构

 

 冗余架构更侧重硬件层面,但软件离不开硬件,所以要在硬件冗余架构配置基础上去做相关开发,而不是完全脱离硬件系统,或脱离底层软件。因为两者毕竟是硬件载体和算法载体,涉及双电源、双传感、双电机、双控制板、多核冗余。

基于功能安全,一般功能核要再加一个锁步核,在单系统中,可以满足ASIL D要求,但对冗余架构fail-operationl要求来说,就要对功能核进行划分,两个功能核再加一个锁步核进行相关实施,也就是三核。
随着信息安全要求,硬件信息安全也逐步提上日程,当然需要成本比较高的一些工程支持和工具链。多总线校验、力矩仲裁和分配也是双系统要考虑的问题。功能安全要求也必须满足,不能在失效后野蛮地把电机关掉,把域区关掉,把MCU输出关掉,把电源关掉关,而对大于等于L3来说,还要有部分助力或降级助力,甚至是全部助力,ADAS扩展接口要预留。
这套架构不单满足转向执行,也包括路感协同。从安全级别来讲,路感协同不仅是方向盘控制和助力,功能安全还有更高的要求。在实际项目和案例中,功能安全级别、整个软件架构和转向控制是同样的级别要求,甚至某些场景安全级别要比转向控制场景更高。
两路相关系统涉及之间的校验和仲裁,如何进行互相诊断和信息互相校验也是比较重要的内容。
我们申请的一个专利中,在两块硬板之间有一个柔性电路板,通过它实现100兆到200兆通讯速率,在关键算法层面采用单步校验,而不是用接插件。接插件有损耗、干扰,对高频信号有影响。很多高频信号、串行信号都是板级通讯,而不是板和板之间、同板的通讯。在设计过程中,做了很多项目实例,通过两层之间的接插件实现的冗余系统成功率不太高。
线控转向软件安全设计方法

 

 根据AUTOSAR工具链,建立了从ASW到RTE到BSW的平面三层架构。在这个过程中,如何对EGAS的功能安全三层架构进行纵深配置,将整个软件架构构成一个多维度设计方式非常重要。其中有相关设计技巧需要不断讨论,比如一些功能究竟放在哪一个核中,哪一个核作为功能核或监测功能的核,如何实现相互校验。

在不同核中,核与核之间的通讯,核与核之间的校验如何快速响应,也是实际底软配置中要考虑的问题,因为有的单片机满足不了这种设计需求。
线控执行系统功能安全冗余架构

 

 从功能安全层面讲,需要ASIL D等级的双备份系统,而不是一关了之的架构,需要失效时能够运行,比如双路pass的交互,需要满足ASIL D的要求,其中的Master和Slave MCU也要满足ASIL D的要求;域区和芯片也要满足相关要求,执行系统采用六相电机来满足ASIL D的要求。

整体架构理论上可以满足FIT 100要求,即10的9次方小时中所发生的错误次数或个数。根据理论算法,有很多数据支撑,特别是国外的数据,可以达到FIT 100,双电源达到FIT 10。
实际上,功能安全涉及很多内容,有很多依据,比如安全等级的制定、风险概率,国外做的比较完善。美国的很多交通事故数据分析很详细,比如某一次交通事故由什么问题引起,是转向制动,还是方向盘,或者是转向失灵、不可控,都有详细的说明,有足够的样本或数据反馈。在国内这些数据很难取得,所以很多还是依靠国外的数据,特别是危害程度分析国内还比较欠缺。
单纯把国外的样本拿来有一定局限性,功能安全不断往前发展,采集足够的样本后,才能理直气壮说满足了ASIL D,系统是否达到FIT 10和FIT 100。
模式转换与多输入接口

 

 自动驾驶模式下的线控转向涉及驾驶请求、其他方式干预、驾驶员转向干预和模式转换。最重要的是在转换过程中保证安全,如果没有安全保证,风险就很大。特别是在L3向L2或自动向手动转换过程中,如果发生故障,如何处理是需要研究的问题。

指令需求包括直接角度输入、目标力矩输入和直接力矩输入,也包括齿条力估算需求。现在,线控系统中的接口多样化,也要进行研究或预留。
为了满足线控转向的关键技术要求,L3需要基本助力转向,而双系统有管理、仲裁分配等相关需求,在实际过程中需要研究一些关键技术。
路感协同控制器架构,包括方向盘协同控制、齿条力观察器、可变角传动比。在这方面,需要研究如何把软件架构搭建好是整体软件架构要考虑的问题。
三、冗余系统的互诊与仲裁
双系统基本上是基于硬件,中间部分基于软件。冗余系统的互诊和相关仲裁涉及硬件和软件。

冗余系统协作机制

 

 协作机制包括多余度互诊、状态仲裁、同步控制。目前,典型同步控制是为了实现六相电机更低的噪音、更低的力矩波动和更高的效率。现在行业典型的是三同步:采样同步、调用电机算法时间点同步、PWM输出同步,都需要考核。

没有同步,就不能更好地控制噪声和波动。遵循三同步来实现相关设计,可以实现相关MPS余度互诊,当一个MPS出现问题时,另外一路可以实现诊断。两个MPS有一路丢失了,这时是什么状态,安全级别如何,也是要考虑的问题。
任务交互

 

 在上电检测阶段,车只要不动,转向坏了,对安全级别要求都很低;即使短路,只要不起火,转向乱动,也不会构成人身危害;而车一旦动起来,安全需求就非常强烈,因此要把工作做在前面,在上电测试阶段的模式控制最为关键。

所以不要抱怨,上电检测要300毫秒、550毫秒,这是为了后期更好的安全着想,上电检测的东西多才能保证安全,比如上电检测最起码要做上一次驾驶周期的状态回调,还有当前状态的扭距、角度、域区、传感器,甚至车速信号的实时检测。
线控转向的余度设计

 

 余度设计分为片内和双系统,还有一部分是机械,比如片内单核、多核冗余;双系统中信号互诊、主从仲裁、双电源、双电机、冗余机构、双总线,这样的设计对整体余度设计提出了要求,要满足相关类型和冗余交互的要求。在做设计时,要在整个架构中把上述内容提前设计好。

讯的冗余交互

 

 因为是fail operational,需要三种通讯的物理通道,一方有问题要能及时识别,还要知道是什么样的问题,然后辨别出自己的问题,还要辨别出是不是该方自己辨别出了自己的问题,第三方也要清楚当前的状态。所以提出了三种冗余交互的物理通道,为了实现安全级别,通讯级别提的更高。

线控系统力矩仲裁与分配

 

 这个过程还涉及仲裁和分配,双路输出不可避免地需要仲裁,分清主从,以谁为主。如果发生一些故障怎么识别,比如CAN总线或车速信号发生问题,但电机驱动正常,就要利用驱动功能;同样道理,如果电机驱动有问题,可能整体上就会关掉。

异构设计在功能安全中,特别是线控转向过程中非常重要。冗余设计有两种方式,同构是投票机制,必须是3、5、7奇数决定哪一个为主,数据是不是准确,所以不可避免造成硬件成本增加。异构机制是仲裁机制,即根据结果程度,或模型预测方式,分析后果如何,做出决定。异构可以降成本,但算法比较复杂,因此在异构设计中,要进行相应的评价,再进行一个安全的执行。
整个设计是从软硬件异构方面进行互补,单纯靠软件实施效果很差,用双传感实现监测,以后果严重度作为一个评价标准,再来实现安全的执行。对于很多可能会导致安全事件发生的危险事件,宁可判断失误,也要去执行。
四、路感协同技术

 

 路感协同技术涉及齿条助力的控制,比如DP-EPS助力控制器,上面是手感控制器。在这个过程中,需要通过某种方式来实现交互,通过信号体验路感、手感的轻重,体感路面的波动。

从驾驶员、整车模型到车辆状态进行期望路感的时间估算,利用动力学模型、相关补偿得到期望的反馈力矩,进行路感电机控制和路感电机的反馈控制,通过这两个层面进行路感总体控制。
路感模拟器系统技术要求

 

 在路感反馈和角度控制闭环中,包括路感协同控制器和助力控制器,之间的相互关系是通过电机力矩和齿条力相关位移角度来估算,不但呈现力矩的大小和齿条力的大小,还体现低、中、高三个频段波动的影响。将齿条力估算代入控制算法,最终得到相关运算结果——可变转向比的关系,实现路感和协调控制。

根据相关要求,比如路感、方向、可变传动比、主动回正、稳态助力控制、惯性补偿、摩擦补偿、过热、过载、超压、应急转向、零位调整、角度控制、末端保护、路感反馈等,其功能安全的级别比EPS和RWA更高。
其他相关指标包括:响应性、分辨率、延时时间、反馈周期、响应精度、超调量,齿条力估算精度,都是路感模拟器的要求,整体研发周期不会比EPS或RWA低。
齿条力滤波器

 

 齿条力滤波器通过齿条力估算器、观察器、私CAN,进入滤波器、路感力矩MAP,通过转向盘角速度和车速计算摩擦力矩、阻力力矩、惯性力矩和主动回正力矩,以得到期望的反馈力矩,再由路感电机来执行。

五、线控转向测试与评价
在线控转向关键组件及其测试与评价方面,目前国内外都是企业标准,都不是太详细。
操纵稳定性评价指标

 

 主要有两个方面的标准,虽然各企业制定的标准不一样,但不外乎两种来源,一是基于转向相关的操纵稳定性指标要求,或来源于自动驾驶,比如车道保持、APA等,或驾驶辅助系统层面对转向系统的要求,所以评价指标主要是自动驾驶指令要求和操纵稳定性。

线控底盘主要指标

 

 从底盘角度来说,动力性、经济性、通过性是线控转向和线控制动相关的主要指标,当然各个整车厂之间的指标都不一样,出发的层面不一样,一些自动驾驶需求和算法不一样,所选的执行机构也不一样,导致这些指标有所差异,但基本上都是相关的要求。

底盘域集成设计测试工况

 

 操纵稳定性评价指标依据的相关标准是集成测试工况,比较典型和转向关联性非常大的是稳态回转、转向轻便性、转向回正、角阶跃和角脉冲,以及车辆的时域和频域测试、蛇形试验、中心区试验,都是动力学或运动控制经常要做的几个测试。

SBW和EPS力矩阶跃输入信号响应测试

 

 对一个系统来说,都是围绕时域和频域做相关研究,两者有不同的案例和输出要求。比如在做阶跃时,要看实际响应性,对车身稳定性指标是什么要求,特别是前轮转角的响应,比如路感模拟器方向盘打到一个角度,轮胎响应的角度,都可以探讨。

SBW和传统的EPS包括带中间轴和不带中间轴,要看对系统响应指标的要求是好是坏。一方面,增加中间轴会有一些空间间隙的自由度,用线控转向路感模拟会有算法的滞后,需要进行齿条力估算,再去做各种滤波才能得出结果,然后通过总线传送给轮胎,需要实际做一些仿真和测试。
系统正弦信号响应测试

 

 从正弦信号输入可以看到带宽多少,带宽内时间间隔或滞后性是否是设计合理。当然,设计的算法不一样,比如经常用的卡尔曼滤波估算,可能会影响时间间隔,如何把时间间隔缩短,让系统稳定,在实际标定过程中需要考虑,在仿真过程中也要注意。

双移线工况验证评价

 

 转向是一个圆周运动,双移线工况要做相关的测试,EPA状态、前轮转角状态、前后轮转角状态、四轮独立状态都要做双移线测试,与规范做相关对比,才能得出整个系统测试的结果。

线控部件测试平台

 

 这是我们研究院开发的相关测试部件和平台。

线控底盘HIL台架测试内容

 

 新搭建的线控底盘平台可以实现线控转向、线控制动、底盘域等功能安全相关测试。整个测试场景基于智能驾驶功能安全进行设置,同时还开放了一些远程接口,比如长春、深圳或重庆的客户都可以客户可以通过远程客户端接入,做相关的测试,在客户端反馈数据。目前的测试对象包括制动转向和底盘域的相关测试。

以上五个部分都很重要,都可以拿出来进行更详细的探讨。

深度学习优化背后包含哪些数学知识?

深度学习中的优化是一项极度复杂的任务,本文是一份基础指南,旨在从数学的角度深入解读优化器。

深度学习中的优化是一项极度复杂的任务,本文是一份基础指南,旨在从数学的角度深入解读优化器。

一般而言,神经网络的整体性能取决于几个因素。通常最受关注的是网络架构,但这只是众多重要元素之一。还有一个常常被忽略的元素,就是用来拟合模型的优化器。为了说明优化的复杂性,此处以 ResNet 为例。ResNet18 有 11,689,512 个参数。寻找最佳参数配置,也就是在 11,689,512 维的空间中定位一个点。如果暴力搜索的话,可以把这个空间分割成网格。假设将每个维度分成十格,那么就要检查 10^11689512(10 的 11689512 次方)组可能的配置,对每一组配置都要计算损失函数,并找出损失最小的配置。10 的 11689512 次方是一个什么概念?已知宇宙中的原子才只有 10^83 个,宇宙的年龄只有 4.32 x 10^17 秒(约 137 亿年)。如果从大爆炸开始,每秒检查 10^83 个原子,我们现在才检查了 4.32*10^1411 个,远远小于上述网格可能的配置数。所以优化器非常重要。它们就是用来处理这种难以理解的复杂性的。有了它,你就可以将训练网络的时间压缩在几天内,而不是数十亿年间。下文将从数学角度深入研究优化器,并了解它们是如何完成这一看似不可能的任务的。优化的基础我们从简单的地方开始。假设要最大化单变量函数。(在机器学习中,通常以最小化损失函数为目标,不过最小化就等同于最大化函数的负值。)定义:

 

 

 对函数作图:

 

 

 最直观的方法是将这条线划分成网格,检查每个点的值,然后选择函数值最大的点。正如引言中所说,这是不可扩展的,因此要找其他解决方案。将这条线想象成一座要爬到顶峰的山。假设位于红点处:

 

 

 如果要到达山峰,该往哪个方向走?当然,应该向斜率增加的地方前进。这个概念对应的是函数的导数。在数学上,导数定义为:

 

 乍看之下,导数非常神秘,但它的几何意义非常简单。仔细看一下求导的点:

 

 对任何 x 和 y,通过 f(x) 和 f(y) 的这条线定义为:

 

 一般而言,如果用 at+b 定义一条直线,那称 a 为这条线的斜率。这个值既可以是正值也可以是负值,斜率为正,直线向上走;斜率为负,直线向下走。绝对值越大,直线越陡。如果像导数定义中一样,让 y 越来越接近 x,那么这条线就会成为 x 处的切线。

 

 

 (图注)在 x=-2.0 时,f(x)的切线和逼近线。

切线为:

 

 

 切线方向记为向量(1,f’(x))。如果从 x_0=-2.0 的位置开始登山,应该沿切线上升的方向前进。如果切线的斜率较大,可以大步迈进;如果斜率接近零,应该小步小步往上爬,以免越过峰值。如果用数学语言表示,我们应该用下面这种方式定义下一个点:

 

 式中 λ 是个参数,设置前进的步长。这就是所谓的学习率。通常,后续步骤定义为:

 

 

 正导数意味着斜率在增加,所以可以前进;而负导数意味着斜率在减少,所以要后退。可视化这个过程:

 

 

 如你所见,这个简单的算法成功地找到了峰值。但如图所示,这并非函数的全局最大值。在所有的优化算法中,这都是一个潜在的问题,但还是有解决办法的。在这个简单的例子中,我们只最大化了单变量函数。这样虽然可以有效地说明这个概念,但在现实生活中,可能存在数百万变量,神经网络中就是如此。下一部分将会介绍,如何将这样简单的算法泛化到多维函数的优化。多维优化在单变量函数中,可以将导数视为切线的斜率。但遇到多个变量,则不能如此。先来看个具体的例子。定义函数:

 

 这个函数将是这部分的 toy example 。

 

 

 对 f(x,y)作图。这是一个有两个变量的函数,图像是一个曲面。马上可以发现,这样很难定义切线的概念,因为与曲面上一个点相切的线有很多。事实上,可以做一个完整的平面。这就是切平面。

 

 

 f(x,y)在点 (0,0) 处的切平面。但切平面有两个非常特别的方向。以点 (0,0) 处的切平面为例。对每一个多变量函数来说,先固定所有变量只取一个能动的变量,这样这个函数基本上就变成单变量函数了。示例函数变为:

 

 

和:

 

 

 可以用垂直于坐标轴的平面分割曲面,来可视化上面这两个函数。平面和曲面相交处就是 f(x,0) 或 f(0,y),这取决于你用哪个平面。

 

 用垂直的平面切割曲面,可视化 f(0,x)。对这些函数,就可以像上文一样定义导数了。这就是所谓的偏导数。要泛化之前发现峰值的算法,偏导数起着至关重要的作用。用数学语言定义:

 

 每个偏导数表示切平面上的一个方向。

 

 切平面上偏导数的方向。偏导数的值是特殊切线的斜率。最陡的方向根据梯度确定,定义为:

 

 注意,梯度是参数空间中的方向。可以轻松在二维平面中绘制出梯度,如下图所示:

 

 f(x,y)的梯度。综上所述,发现峰值的算法现在成为:

 

 这就是所谓的梯度上升(gradient ascent)。如果要求函数最小值,就要沿负梯度的方向迈出一步,也就是下降最陡的方向:

 

 这就是所谓的梯度下降(gradient descent),你可能会很频繁地看到它,因为在机器学习中,实际上是要最小化损失。

为什么梯度指向最陡的上升方向?在这种情况下,要知道为什么梯度给出的是最陡峭的上升方向。为了给出精确的解释,还要做一些数学计算。除了用垂直于 x 轴或 y 轴的垂直平面切割曲面外,还可以用 (a,b) 任意方向的垂直平面切割曲面。对于偏导数,有:

 

 可以将它们视为 f(x,y) 沿 (1,0) 和(0,1)方向的导数。尽管这些方向特别重要,但也可以任意规定这些方向。也就是说,假设方向为:

 

 这个方向的导数定义为:

 

 注意,最后一个等式就是方向向量和梯度的点积,这可能和高中几何课堂上遇到的点积是相同的。所以:

问题是,哪个方向的方向导数最大?答案是上升程度最陡峭的方向,所以如果要优化,得先知道这个特定的方向。这个方向就是之前提过的梯度,点积可以写作:

 

 

 

 式中的 |.| 表示向量长度,α是两向量间的夹角(这在任意维数上都是成立的,不只是二维)。显而易见,当 cosα=1,即 α=0 时,表达式取最大值。这就意味着这两个向量是平行的,所以 e 的方向和梯度方向是相同的。训练神经网络现在要从理论转战实践了,了解如何训练神经网络。假设任务是将有 n 维特征向量的图像分成 c 类。从数学角度看,神经网络代表将 n 维特征空间映射到 c 维空间的函数 f:

 

 神经网络本身是参数化的函数。方便起见,将参数标记为 m 维向量:

 

 为了表现出对参数的依赖,习惯记为:

 

 

 将神经网络的参数空间映射为实数。损失函数记为:

 

 的是观测值为第 i 个数据点L 是损失函数项。例如,如果 J 是交叉熵损失,则:

 

 

式中

 

 式中

这看似简单,但难以计算。在真实世界中有数百万个数据点 N,更别说参数 m 的数量了。所以,一共有数百万项,因此要计算数百万个导数来求最小值。那么在实践中该如何解决这一问题?随机梯度下降要用梯度下降,得先计算:

 

 如果 N 很大,那么计算量就很大,而一般都希望 N 大一点(因为想要尽量多的数据)。可以化简吗?一种方式是忽略一部分。尽管这看起来像个不靠谱的方案,但却有坚实的理论基础。要理解这一点,首先注意 J 其实可以写成期望值:

 

 是训练数据给出的(经验)概率分布。可以将序列写成:

 

 这样就成了独立同分布的随机变量。根据大数定律:

 

 式中

 

 是真正的总体分布(这是未知的)。再详细点说,因为增加了训练数据,损失函数收敛到真实损失。因此,如果对数据二次采样,并计算梯度:

 

 对某些 i,如果计算足够,仍然可以得到合理的估计。这就是所谓的随机梯度下降,记为 SGD (Stochastic Gradient Descent)。

我认为,研究人员和数据科学家能有效训练深度神经网络依赖于三个基础发展:将 GPU 作为通用的计算工具、反向传播还有随机梯度下降。可以肯定地说,如果没有 SGD,就无法广泛应用深度学习。与几乎所有新方法一样,SGD 也引入了一堆新问题。最明显的是,二次采样的样本量要有多大?太小可能会造成梯度估计有噪声,太大则会造成收益递减。选择子样本也需要谨慎。例如如果所有子样本都属于一类,估计值可能会相差甚远。但在实践中,这些问题都可以通过实验和适当随机化数据来解决。改善梯度下降
梯度下降(以及 SGD 变体)存在一些问题,因此这些方法在某些情况下可能会无效。例如,学习率控制着梯度方向上前进的步长。在这个参数上一般会犯两个错误。第一,步长太大,以至于损失无法收敛,甚至可能分散;第二,步长太小,可能因为前进太慢,永远都无法到达局部最小值。为了阐明这个问题,以 f(x)=x+sin x 函数为例进行研究:

 

 假设从 x_0=2.5 开始进行梯度下降,学习率 α 分别为 1、0.1 和 0.01。

 

 理解起来可能不够直观,所以对每个学习率的 x-s 绘图:

 

 当 α=1 时,图像在两点间震荡,无法收敛到局部最小值;当 α=0.01 时,收敛得似乎很慢。在本例中,α=0.1 似乎是合适的。那在一般情况下该如何确定这个值呢?这里的中心思想是,学习率不一定是恒定的。同理,如果梯度幅度很大,就应该降低学习率,避免跳得太远。另一方面,如果梯度幅度较小,那可能意味着接近局部最优值了,所以要避免超调(overshooting)的话,学习率绝对不能再增加了。动态改变学习率的算法也就是所谓的自适应算法。

最流行的自适应算法之一是 AdaGrad。它会累积存储梯度幅度和大小,并根据记录调整学习率。AdaGrad 定义了累积变量 r_0=0 并根据规则进行更新:

 

 

 式中的

 

 

 表示两个向量的分量乘积。将其用于度量学习率:

 

 

 式中的 δ 是为了保持数据稳定的数值,平方根是根据分量取的。首先,当梯度大时,累积变量会很快地增长,学习率会下降。当参数接近局部最小值时,梯度会变小,学习率会停止下降。当然,AdaGrad 是一种可能的解决方案。每一年都会有越来越多先进的优化算法,来解决梯度下降相关的问题。但即便是最先进的方法,使用并调整学习率,都是很有好处的。另一个关于梯度下降的问题是要确定全局最优值或与之接近的局部最优值。看前面的例子,梯度下降通常会陷入局部最优值。为了更好地了解这一问题和更好的解决办法,建议您阅读 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 所著的《深度学习》(Deep Learning)第八章(https://www.deeplearningbook.org/)。深度神经网络的损失函数什么样?前面的例子只可视化了非常简单的玩具示例,比如 f(x)=25sin x-x^2。这是有原因的:绘制超过两个变量的函数图像很难。考虑到固有的局限性,我们最多只能在三个维度上进行观察和思考。但为了了解神经网络中的损失函数,可以采取一些技巧。Hao Li 等人发表的论文《Visualizing the Loss Landscape of Neural Nets》(https://arxiv.org/pdf/1712.09913.pdf)就是有关这个的,他们选择两个随机方向,对二变量函数绘图,从而可视化损失函数。

 

 

 (为了避免因尺度不变而引起的失真,他们还在随机方向中引入了一些归一化因素。)他们的研究揭示了在 ResNet 架构中,残差连接是如何影响损失,让优化变得更容易的。

 

 

 图像来源:Hao Li 等人所著《Visualizing the Loss Landscape of Neural Nets》(https://arxiv.org/pdf/1712.09913.pdf)。无论残差连接做出了多显著的改善,我在这里主要是想说明多维优化的难度。在图中的第一部分可以看出,有多个局部最小值、峰值和平稳值等。好的架构可以让优化变得更容易,但完善的优化实践,可以处理更复杂的损失情况。架构和优化器是相辅相成的。

总结

我们在前文中已经了解了梯度背后的直观理解,并从数学角度以精确的方式定义了梯度。可以看出,对于任何可微函数,无论变量数量如何,梯度总是指向最陡的方向。从概念上来讲非常简单,但当应用在有数百万变量的函数上时,存在着很大的计算困难。随机梯度下降可以缓解这个问题,但还存在陷入局部最优、选择学习率等诸多问题。因此,优化问题还是很困难的,需要研究人员和从业人员多加关注。事实上,有一个非常活跃的社区在不断地进行改善,并取得了非常惊人的成绩。

 

 

参考文献链接

https://mp.weixin.qq.com/s/ZPhn1Wgys3i0fkeKgAfpsQ

https://mp.weixin.qq.com/s/yyjAPn3d8mLIVE2Ridy18w

https://mp.weixin.qq.com/s/wzQzLzV_eS9zkYB0DW8xyQ

 

标签:10,deep,路感,时间,驾驶,Learning,转向,线控,SystemVerilog
From: https://www.cnblogs.com/wujianming-110117/p/16840415.html

相关文章