徽州骆驼 · 1月25日

基于SOA的转向灯设计

image.png

犹记得当年科目三练车,练习靠边停车后车辆起步,依稀记得需要绕车一圈查看车辆状态,教练千叮咛万嘱咐一定要记得打转向灯,然后观察外后视镜,确定后方安全距离内无来车后再起步,自此转向灯的在我心中的地位直线拉升。

转向灯属于车上使用频次较高的功能,运用最多的场景是转弯或变道。此外还有很多场景需要用到转向灯的功能,比如双闪、解锁、闭锁、寻车、防盗报警、自动变道、热失控……等等,在这里就不做一一举例。随着以后功能的丰富,使用转向灯的场景应该还会增加。所以针对这种很多场景都会使用的功能,比较适合运用 SOA 的方法来进行设计。

具体的服务架构方案如下所示:

image.png

一、转向灯服务接口设计

要设计一个服务,首先要思考这个服务本身具备什么样的能力,其次要考虑需要给用户提供什么样的服务。当前转向灯普遍具备以下两个能力:

(1)亮和灭的能力。

(2)流水和非流水能力。

从这两个转向灯的基础能力中可以提取出什么样的服务提供给消费方,以实现不同的功能需求,这需要从具体的场景出发去进行通盘的考虑。

比如当用户打转向时,需要某一侧转向灯以一定的频率闪烁;用户按下危险报警灯开关,需要左右两侧的转向灯以一定的频率同时闪烁;用户锁车时,转向灯闪烁一次,持续时间1s;用户解锁车辆时,转向灯以一定的频率闪烁3次;车辆防盗报警触发时,转向灯以一定频率持续闪烁5分钟……

服务的设计应能满足当前的功能需求,并尽可能为潜在的需求提前设计服务接口。根据上面的需求,转向灯控制的服务接口需要具备以下能力:

(1)转向灯开和关。

(2)转向灯开启方位选择(左侧、右侧和左右两侧)。

(3)转向灯频率可调。

(4)转向可设置闪烁次数。

(5)转向灯可设置闪烁时间。

这5项是比较基础的能力,因为很多场景需要用到转向灯,比如哨兵模式触发报警需要亮转向灯,智能驾驶时主动变道需要亮转向灯。为了满足不同的场景对转向灯的需求,有些场景优先级是比较高的,所以需要定义一个接口,可进行转向灯优先级的设置。

image.png

定义好服务的接口内容后,需要对每一个接口进行详细描述,明确告知用户应该怎么使用该接口。

服务接口使用手册:

TurnLightPosition:用户可以根据需求,控制单侧或者双侧的转向灯,此外还提供了单个转向灯的控制。

TurnLightOnOff:转向灯的开启或者关闭。

TurnLightDutyCycle:转向灯的占空比可以进行设置,默认为50%。

TurnLightCycle:转向灯的亮/灭周期可进行设置,默认为500ms。

TurnLightTimes:可单独设置转向灯工作的时间,当设置该参数时,转向灯执行完设置的时间后会自行熄灭。

TurnLightNumber:可单独设置转向灯工作的次数,当设置该参数时,转向灯执行完设置的周期后会自行熄灭。

TurnLightPriority:转向灯的优先级可进行设定,数字越小代表的优先级越大,比如当优先级1的转向灯在工作时,不响应其他优先级的转向灯控制请求。另外同一个优先级的转向灯控制请求,采用后来者优先的处理方式,意思是同一优先级的转向灯请求可相互打断,服务会响应后一个转向灯请求,并直接丢弃前一个转向灯的请求。

优先级的定义如下:

Default:当用户选择 Default 时,等同于priority4的优先级。

Priority1:安全类。

Priority2:报警类。

Priority3:行车功能类。

Priority4:场景功能类。

Priority5:辅助类。

有了以上这些配菜之后,厨师可以根据需求进行创作。各个产品工程师,可以根据自身的业务需求对转向灯进行控制,每一个业务板块之间相互独立,互不影响。这是各类的 APP 擅长的事情,这些 APP 不单单指的是独立的 APP ,也代表各个控制器内的独立的软件模块。

二、转向灯场景设计

介绍完服务的接口设计,针对具体的应用场景,进行详细分析。

比如开车时,用户左转需要点亮转向灯,那么该软件模块只要识别到左转向灯开关触发,然后去调用转向灯的服务接口即可,具体设计如下:

image.png

车辆电源为ON挡,且左转灯开关为激活状态时,调用该转向灯服务接口,具体定义为:

TurnLightPosition=0x1

TurnLightOnOff=0x2

TurnLightDutyCycle=0x0

TurnLightTimes=0x0

TurnLightNumber=0x0

TurnLightPriority=0x3

当电源不为ON挡或者左转向灯开关为非激活状态时,调用该服务接口,具体定义为:

TurnLightPosition=0x1

TurnLightOnOff=0x1

TurnLightDutyCycle=0x0    

TurnLightTimes=0x0

TurnLightNumber=0x0

TurnLightPriority=0x3

还有我们比较常见的场景在地下车库找不到爱车时,用户使用钥匙或者手机寻找车辆,寻车功能激活时,一般是转向灯会激活30s或者1min。此时只要检测到钥匙的寻车按键触发或者用户通过手机APP触发了寻车功能,对应的软件APP就可直接去调用转向灯的接口服务,具体设计如下:

image.png

当车辆电源模式为OFF挡,用户按下寻车按键或者激活手机APP的寻车功能时,对应的软件模块调用该转向灯服务接口,具体定义为:

TurnLightPosition =0x3

TurnLightOnOff =0x2

TurnLightDutyCycle =0x0

TurnLightTimes =0x1F

TurnLightNumber =0x0

TurnLightPriority =0x4

只要调用该接口,那么车辆两侧的转向灯亮了30s后会自动停止。如果触发了寻车功能后,用户想暂停寻车功能,那么调用以下的服务定义就可:

TurnLightPosition =0x3

TurnLightOnOff =0x1

TurnLightDutyCycle =0x0

TurnLightTimes =0x0

TurnLightNumber =0x0

TurnLightPriority =0x4

以上是对服务封装以及应用实例的具体描述,根本上和硬件进行了解耦,软件模块不用关心具体的硬件方案,可根据自身需求,对转向灯进行控制。   

三、转向灯驱动设计

分析完上层方案,需要设计服务以下的实现方案,这样才算是一个完整的设计。目前主流的整车架构方案是中央域控,外加几个域控。中央域控和域控之间用以太网相连,这两者之间走的服务还是信号的方式,每家主机厂的设计不一样,我本次设计基于信号的链路。后续有需要的话,可进行服务的分析设计。

域控以下控制器原则上仅仅做一个执行器的功能,控制的信号最终是经过中央域控进行下发,拿转向灯为例,左侧转向灯分别由左前大灯控制器和左后尾灯控制器进行控制,这两个控制器仅仅需要接收中央域控的控制信号,控制转向灯点亮或者熄灭就可以。

image.png

因此控制转向灯仅仅需要一个信号即可,信号可定义如下所示:

TurnLightControl_Left :0x0= No request ,0x1= OFF ,0x2= ON

TurnLightControl_Right :0x0= No request ,0x1= OFF ,0x2= ON

结合前面的两个使用场景,服务被调用时,可以把对应的转向灯控制信号进行赋值。

image.png

当左前大灯控制器和左后尾灯控制器收到相应的 CAN 总线信号时,时时控制转向灯的亮灭即可,同时反馈转向灯实际的工作状态。

四、总结

通过对整个转向灯控制链路的梳理,可以实现软硬件的解耦,上层的应用软件只需要直接调用转向灯的控制接口,就可以实现对转向灯的控制。以上仅仅是个人对转向灯的设计思考,并不一定完美,需要在开发实践中不断地更新优化该服务,不断迭代升级。不同的人对转向灯的服务设计会有不同的想法,各位读者如果有自己的想法,欢迎评论区留言讨论。

作者:黄百万
文章来源:十一号组织

推荐阅读

更多汽车电子干货请关注汽车电子与软件专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
5713
内容数
453
汽车电子与软件行业的相关技术报道及解读。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息