自动驾驶软件架构之:中间件与SOA(三)
作者 | 肖猛
4.1三个应用领域对SOA的推动
-
传统汽车电子电器架构的 SOA 化; -
车载娱乐系统(IVI, In-Vehicle Infotainment) 与车联网需要SOA进行更广泛的应用集成; -
自动驾驶的软件架构也适合以SOA的方式来组织。
4.2 自动驾驶对于中间件的要求
4.2.1 SOA 架构风格与自动驾驶系统的适用性
-
自动驾驶系统中“多种传感器的感知和融合、复杂多变场景的规划决策、高实时要求的控制执行”涉及大量类型差异很大的计算,需要能被分解成不同的服务子系统,独立进化; -
采用“发布/订阅”的通讯模式可以有效的降低各服务之间通讯的偶合性。
4.2.2 自动驾驶相关软件的特殊要求
高带宽的传感器数据通路要求
-
SOA 的通讯协议采用 DDS, 某些 DDS 的实现已经内置了共享内存通讯,这是目前采用比较多的方式。有数据序列化动作,实现零拷贝有一定难度。优点是已经有成熟的实现。 -
基于共享内存的虚拟网卡,这个适合基于PCIe的跨SoC通讯。有数据序列化动作,实现零拷贝有一定难度。 -
与服务装配相配合,透明实现进程内、跨进程、跨主机的多种优化手段自动适配。后文详述。
高效任务调度与确定性执行
-
单个算法的执行速度尽可能快,从而让整个流水线的总延迟时间尽可能短 -
每个算法的执行时间的波动率尽可能小,从让整个流水线延迟的波动率稳定
-
以“操作系统进程”为单位的调度粒度过大,无法对算法动作执行的时机做精准调度 -
SOA架构风格可能会产生较多的服务数量,当操作系统中的进程过多时,进程切换的系统开销占用整体系统时间的比例过高。
软硬件异构平台的支持
对自动驾驶开发阶段的支持
4.3 构建适用于自动驾驶SOA中间件
4.3.1 相关技术及产品介绍
4.3.1.1 POSIX 标准简述
下图总结了这几个配置的功能范围。
4.3.1.2 Adaptive AutoSAR 简述
“状态管理”和“健康管理”功能组起到了“服务监督”的作用。
4.3.1.3 GENIVI技术栈简介
-
SOA通讯接口定义 IDL规范:Franca。以及Franca的语义解析工具。 -
根据Franca 生成通讯代码的工具 -
通讯通道无关的运行时库,Common API Runtime
-
特定通讯通道的绑定规范 -
特定通讯通道的代码生成工具 -
特定通讯通道的运行时库
-
特定SOA应用的接口定义,需要遵循 Franca 规范 -
特定SOA应用对某一个通讯通道的绑定定义,需要遵循该通讯通道的绑定规范。 -
特定SOA 应用的功能代码。
4.3.2 动态多通讯通道绑定
-
服务1 与服务2 在同一个服务容器进程A 中; -
服务3部署在容器进程B中,容器进程B 与 A 是同一个 OS 内的两个进程, -
服务4、5 在另一个 OS 中的服务容器进程内
-
服务2 的 handle_α直接被容器进程A通API直接调用 -
服务3 所在容器进程通过共享内存获取事件再调用其方法 -
服务4 通过网络(SOME/IP)收到事件并处理
进程内API绑定
多通道绑定能力
进一步的优化
4.3.3 高效任务调度与异步操作
4.3.3.1客户端的“同步/异步”机制分析
4.3.3.2中间件Runtime 对用户代码的调用
-
服务端中间件Runtime收到RPC请求后调用用户代码进行处理 -
服务端中间件Runtime接收到订阅的事件后调用用户代码进行处理 -
客户端中间件Runtime收到RPC的响应后回调用户注册的 callback函数
4.3.3.3中间件的线程模型
线程与任务的映射关系。
a) 如果每个任务到来就分配一个线程去执行,新建线程或从线程池中取一个空闲线程,没有空闲线程就等待。这样任务的调度就等价与线程的调度。
b) 维持较少的线程数量(一般是CPU核心数的两倍),每个线程有个待执行的任务队列,新任务到达就放到线程的任务队列的合适位置。
对同一个客户端的RPC请求是否要按照顺序执行。如何保证顺序?
对同一个客户端的多个RPC请求是否允许在不同的线程执行?如果允许,则用户要在自己的代码中对共享资源做加锁处理;如果不允许,用户代码就不用考虑共享资源的加锁,编程简单。
在为任务分配执行线程的时候,是否考虑请求来自哪个客户端,比如把来自同一个客户端的执行任务分配到同一个线程。
能否为来自不同客户端的请求绑定一个需要访问的资源标识,将需要相同资源标识的任务分配到同一个任务队列中,这样用户代码就不需要为不同客户端来源的请求访问竞争资源时做加锁处理。
4.3.3.4中间件的任务调度
-
用户主动发起的异步任务 -
中间件Runtime对用户代码的调用
-
对完成任务的时间有要求 -
同一个类型的任务会被反复执行 -
排除I/O的影响后,同一个类型的任务的执行时间相对稳定
4.3.4 增强对QoS 的支持
4.3.5 IDL定义的扩展能力
-
接口实现的线程模型需求 (4.3.3.3) -
接口实现对任务调度的需求(4.3.3.4) -
对 QoS 的需求
4.3.6 服务容器增强服务管理能力
4.3.7 服务发现的增强实现
4.3.8 增加对 RTOS 系统的支持
4.3.9 增加新的语言支持
4.3.10 RESTful 接口的自动生成
[rest_enable uri=/math]
interface Math {
methodplus{
in {
Int32x
Int32 y
}
out{
Int64 result
}
}
}
4.3.11 本章小结
全文结语
下图是某 AutoSAR 厂商不同授权方式的阶梯价格示意。最便宜的授权只能用在指定一级供应商开发的单个ECU产品,指定芯片,只能卖给一个OEM。其在量产项目中使用的价格(图中的单个阶梯块)要超过500万RMB,如果需要功能安全,再乘以1.5倍。
[1]. CORBA History https://www.corba.org/history_of_corba.htm
[2]. What is CORBA http://www.ois.com/Products/what-is-corba.html
[3]. omniCORBA http://omniorb.sourceforge.net/
[4]. 反叛之冰:Internet Communications Engine https://blog.csdn.net/grhunter/article/details/45606
[5]. Differencesbetween CORBA and ICE https://forums.zeroc.com/discussion/3035/differences-between-corba-and-ice
[6]. Thrift白皮书 https://thrift.apache.org/static/files/thrift-20070401.pdf
[7]. SOME/IPProtocol Specification 1.4 https://www.AutoSAR.org/fileadmin/user_upload/standards/foundation/1-4/AUTOSAR_PRS_SOMEIPProtocol.pdf
[8]. MFC 文档/视图体系结构 https://docs.microsoft.com/zh-cn/cpp/mfc/document-view-architecture?view=msvc-160
[9]. Apache Structs https://struts.apache.org/
[10]. Franca IDL https://github.com/franca/franca
[11]. FrancaUser Guide https://drive.google.com/folderview?id=0B7JseVbR6jvhUnhLOUM5ZGxOOG8
[12]. Protobuf3语言规范 https://developers.google.com/protocol-buffers/docs/proto3
[13]. Slice IDL语言规范 https://doc.zeroc.com/ice/3.6/the-slice-language
[14]. AdaptiveAutoSAR R20-11 Specification of Manifest https://www.AutoSAR.org/fileadmin/user_upload/standards/adaptive/20-11/AUTOSAR_TPS_ManifestSpecification.pdf
[15]. Web服务描述语言(WSDL)规范 https://www.w3.org/TR/wsdl/
[16]. AutoSARExplanation of ara::com AP https://AutoSAR.org/fileadmin/user_upload/standards/adaptive/20-11/AUTOSAR_EXP_ARAComAPI.pdf
[17]. OPENSYSTEMS INTERCONNECTION (OSI) https://www.iso.org/ics/35.100/x/
[18]. specificationon SOME/IP Transport Protocol AUTOSAR CP Release 4.3.1 https://www.AutoSAR.org/fileadmin/user_upload/standards/classic/4-3/AUTOSAR_SWS_SOMEIPTransportProtocol.pdf
[19]. IEEE802.3 Ethernet https://www.ieee802.org/misc-docs/GlobeCom2009/IEEE_802d3_Law.pdf
[20]. RFC791INTERNET PROTOCOL DARPA INTERNET PROGRAM PROTOCOL SPECIFICATION http://www.ing.unp.edu.ar/asignaturas/rytd/RFC/rfc791_IP.pdf
[21]. AnIntroduction to the Stream Control Transmission Protocol (SCTP) https://datatracker.ietf.org/doc/html/rfc3286
[22]. QUIC:A UDP-Based Multiplexed and Secure Transport https://www.rfc-editor.org/rfc/rfc9000.html
[23]. ArchitecturalStyles and the Design of Network-based Software Architectures https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
[24]. Foundationsfor the Study of Software Architecture https://www.ics.uci.edu/~andre/ics223w2006/perrywolf.pdf
[25]. iceoryx https://github.com/eclipse-iceoryx
[26]. Linux Systemd Man Page https://www.commandlinux.com/man-page/man1/systemd.1.html
[27]. 汽车总线系统W.齐默尔曼,R.施密特加尔著,ISBN:978-7-111-34141-3,2011.07
[28]. POSIX IEEE1003.1-2017 ISOIEC9945
[29]. POSIX IEEE-1003.13-2003
[30]. AUTOSAR SWS Operating System Interface https://www.autosar.org/fileadmin/user_upload/standards/adaptive/20-11/AUTOSAR_SWS_OperatingSystemInterface.pdf
[31]. Understanding the Actor Model https://www.developer.com/design/down-and-dirty-understanding-the-actor-model/
[32]. 协程 https://en.cppreference.com/w/cpp/language/coroutines
[33]. The Real-time Publish-Subscribe
[34]. Protocol (RTPS) DDS Interoperability Wire ProtocolSpecification https://www.omg.org/spec/DDSI-RTPS/2.3/Beta1/PDF
[35]. AutoSAR SWS Communication Management https://www.autosar.org/fileadmin/user_upload/standards/adaptive/20-11/AUTOSAR_SWS_NetworkManagement.pdf
[36]. Adaptive AutoSAR CPP14 Guidelines https://www.autosar.org/fileadmin/user_upload/standards/adaptive/20-11/AUTOSAR_RS_CPP14Guidelines.pdf
[37]. Google C++ Style Guide https://google.github.io/styleguide/cppguide.html
[38]. 图解Rust所有权与生命周期 https://zhuanlan.zhihu.com/p/349644802