嵌入式系统
内容提要
广泛使用的机器学习框架有 Tensorflow、PyTorch、Keras、Gluon、Chainer、Onnx 等,通过分析这些框架的高级 API,可以很容易地认识到 Python 语言具有压倒性的主导地位。在 GPU 上运行的密集计算是用低层级代码编程的,但 Python 对于定义和配置高层级代码中的算法似乎非常方便。本文探讨针对 AUTOSAR 自适应平台的 Python API 如何能帮助研究人员专注于数学问题,而不必等待过长的编译时间,也不必费时费力去掌握 C++ 程序调试可能需要的种种奇技淫巧。
简介
AUTOSAR 基础规范要求在最高级别有“适当的语言绑定”,但未规定要使用何种语言。但是,AUTOSAR 自适应规范集已细化为 C++,更确切地说是 C++ 11。
AUTOSAR 这样做有充分的理由,即所选的语言 C++ 11非常强大且成熟。在适当的约束下,它可以用于性能经过优化的汽车嵌入式系统。因此,人们认为 AUTOSAR自适应标准的其余部分也是指定和引用采用 C++ 语法的变量、类和 API。这是一种多功能且广泛可用的语言,可满足汽车行业对车载应用软件设定的所有目标。
从更广的角度来看,Siemens Digital Industries Software汽车软件团队认为,每个项目应使用最适合达成目标的工具。在此背景下,编程语言只是一种工具。如果使用另一种编程语言对某项开发活动有利,则可在更短的时间内取得更好的结果。
因此,本文的目的是探索将 AUTOSAR 自适应运行时(ARA) 绑定其他编程语言而使软件开发人员受益的几个使用案例。
汽车行业近期变革的结果
过去十年中,汽车行业经历了一次重大变革,围绕 ADAS 和 EV 技术的创新在迅速出现。详细介绍这些创新不属于本文的范畴,但本文会重点说明可证明使用其他编程语言的合理性的若干方面。
快速原型制作的重要性
从构想到最终产品的研发路径很少是简单明了的。用于阐发概念的必要实验工作所需的工具与用于创建最终产品的工具不同。支持快速创建原型的工具是对创新者工具集的有益补充。从这个意义上至少可以说,C++ 通常不是较快的代码编写甚至编译语言。有些编程语言可能更适合早期阶段的快速设计迭代需求。
将创新性和研究性编程语言引入汽车领域
对 ADAS 解决方案越来越多的关注,导致汽车就业市场对数据科学家和研究人员的需求不断增长。这些机器学习 (ML) 专家具有很强的编程技能,非常熟悉 C++。但在机器学习研究中,使用其他高级编程语言更为常见。如果能让这些科学家使用他们最熟悉的编程语言,那么其工作效率将会显著提高。
AUTOSAR 自适应平台的 PYTHON API
最被广泛使用的机器学习框架有 Tensorflow、PyTorch、Keras、Gluon、Chainer、Onnx等,通过分析这些框架的高级 API,可以很容易地认识到 Python 语言具有压倒性的主导地位。
这是有原因的。在 GPU 上运行的密集计算是用低层级代码编程的,但 Python 对于定义和配置高层级代码中的算法似乎非常方便。这让研究人员可以专注于数学问题,而不必等待过长的编译时间,也不必费时费力去掌握 C++程序调试可能需要的种种奇技淫巧。
认识到高级 API、机器学习框架及其汽车应用之间的差距后,Siemens 为 AUTOSAR 创建了一组 Python 包。通过这些包可以简单地对 AUTOSAR API 进行高级访问。
架构考量因素
为了提供 Python API,必须解决两个基本挑战。
#1:API 语法
我们选择了一种高度实用的方法,以一种最切合实际的方式尽可能地模拟 C++ API。主要目的是使 API 名称之间的差异最小化,从而加快后期从原型模型到产品代码的转换。
#2:原生实现抑或绑定?
有两种选择:是构建 Python API 来完全替代 C++ 运行库,还是在 C++ 之上以绑定层的形式构建(图 1)。
图 1:在分层架构中不同程度地使用 Python 的架构选择。
这两种方法各自都有独特的优势,但将 Python 支持构建为现有 C++ 运行时之上的绑定层有更为有力的论据。
具体来说,其优点和优势如下:
较小的代码库可以更轻松地遵循标准 API 变更
通过 C++ 多线程可更好地实现 CPU 负载平衡
仅有 C++ 版本的第三方组件的复用
有人可能认为,任何 Python 应用程序用几行代码就能实现自身的 persistency 和 logging,而不会产生使用 ARA兼容架构时的开销。对于简单使用案例而言确实如此,但使用 ARA persistency 的冗余和加密特性或标准 DLT 日志记录接口的优势也将不复存在。AUTOSAR 的主要优点之一是,它囊括了汽车行业多年来的经验教训。
只要是通过配置动态生成的 API,都会生成相关的 Python API。这主要适用于绑定解决方案的第一次迭代中的 COM。生成器使用与每个 C++ 生成器后端完全相同的清单工件。这意味着无需为了 Python 绑定而增加配置。
在某些功能集群 (Functional Cluster)中,例如日志记录、持久性或执行管理等,PythonAPI保持静态,遵循底层C++ 实现的行为。
图 2 是带有选定功能集群的架构概览。绑定层位于 ARA功能集群 API 之上。
图 2:浅蓝色框是本文的讨论范围。绿色框代表标准自适应协议栈。
实际实现细节
目标是为一组功能提供 Python API工具,使这些功能可立即为算法开发人员所用。因此,最初的绑定包集合可用于通信管理器、持久性、日志和跟踪以及执行管理。1这些 API 支持最新的 19-03 AUTOSAR 规范。
下面展示了一些代表性的代码片段,以便读者对可用Python API 有一些了解。
日志和跟踪
完全支持日志记录。为了方便起见,记录的数据报告为“字符串”。下面这个简单的例子显示了如何记录来自 Python应用程序的信息,其最终存储到 ARA 日志和跟踪中:
初始化日志记录和创建上下文的步骤与 C++ 中的步骤相同。类似地,在创建日志记录器上下文之后,实际的记录可通过常用的 LogFatal、LogError、LogWarn、LogInfo 等方法执行。
持久性 (PER)
支持的功能包括键值存储 (KVS) 和文件存储类型的持久存储。也可以通过几行代码来使用符合 ARA 的持久性:
在上面的例子中,KVS 持久存储机制配合基础数据库使用;在我们的使用案例中,该数据库是 JavaScript对象表示 (JSON)文件。写入一个值,并从数据库中读取另一个值。
通信 (COM)
语言绑定支持发布和订阅服务。API用于处理 Events、Methods 和 Fields,在 Proxy端和 Skeleton 端均可用,包含必需的回调方法。Proxy端和 Skeleton 端的 ARA:COMAPI 均严重依赖于配置。因此,构建于生成的 C++ API 之上的绑定层也会动态地创建。
在下面的例子中,导入的controllerproxyimpl包是一Python 初始化和使用这些功能,必须执行与 C++ 中相同个生成的 Python模块,用于包装 C++ 接口。为了从的步骤。
执行管理
完全支持 ExecutionClient 类的 API 集。因此,Python 应用程序可以向执行管理器报告其操作状态。注:不支持DeterminsticClient API。
在下面的例子中,应用程序仅使用几行代码向ExecutionManager 报告其运行状态。
机器学习支持
完整的机器学习示例不属于本文的讨论范围。因此,这里仅提供了几行代码来演示将机器学习框架与 ARAPython 绑定 API 结合使用的简易性:
在上一页的例子中,PyTorch 模型的随机损失计算结果通过服务事件提供。黄色标示的行与 ARA COM 的服务初始化和事件发送功能有关。蓝色行用于将日志记录到ARA 日志和跟踪。
还遗漏了什么?
尽管涵盖的功能和支持的 API数量可能会随着时间推移而增长,但有些领域根本无法引入解释性语言。与安全性第一的操作或严格实时行为相关的功能不在当前 Python绑定层的范围内。因此,ARA:EXEC DeterministicClientAPI 或平台运行状况管理 API 不在此包的范围内。
操作系统支持和第三方代码
Siemens 提供的 Python 软件包可直接在桌面 Linux. 上运行。基于 YoctoProject的 Linux 也可以使用,只需进行很少的配置。根据需求,也可以支持其他嵌入式解决方案。
结语
有时,面向安全和性能的 C++API 的复杂性使其难以在开发的早期阶段使用。使用 Python 绑定可以发挥 Python语言简易性与 AUTOSAR 自适应平台多功能性的协同作用。Python 是主要机器学习框架中使用最广泛的语言,可帮助有学术背景的数据科学家在汽车原型设计中快速交付成果。API 名称的相似性使团队可以快速熟悉 AUTOSAR 概念和最终 C++ 产品的语法。
认识到高级 API、机器学习框架及其汽车应用之间的差距后,Siemens 为 AUTOSAR 创建了一组 Python 包。这些包在 Python 程序和 AUTOSAR 自适应平台之间提供简单的高级接口。