功能模型接口FMI(Functional Mock-up Interface)是一个开放且与工具解耦的标准。FMI包含了一个C-API(接口),一个用于描述接口的XML文件以及可交换的功能模型单元FMU(Functional Mock-up Unit),通常会是“zip”文件。FMI实际上是提供了容器化形式的模型,能够在不同的目标上轻松进行重复使用和部署,实现在不同的自动驾驶仿真工具之间动态交换仿真模型和联合仿真。
一、FMI的使用
1、导入和导出工具
通常来说在使用FMI时会有包含导入和导出工具。
导出工具通常是开发模型的地方,能够将模型按照FMI标准打包为FMU;导入工具通常独立于导出工具,可以在外部设置由C-API定义的一个变量、一个值或是触发一个计算步骤,在接收FMU后在,可以在导入工具中与其他模型结合并实现联合仿真。
实际上FMI标准只定义了一个FMU的接口,在多个FMU进行耦合并实现联合仿真时,FMI标准并不涉及到的联合仿真算法或是FMU 的求解器。
2、FMU文件结构
FMU作为模型的容器能够自由的进行分发,通常来说是一个以'.fmu'结尾的zip文件。
在一个FMU文件中,至少包含了一个模型描述文件,其描述了模型变量、接口、能力以及模型架构扩展限制的元数据信息。
还至少包含了一个二进制的模型表示,在Linux系统下是.so文件,在window系统中是dll文件。也可以是C源码,能够让使用者进行重新编译创建一个新的二进制文件用于新的目标,这一部署机制可以方便的扩展到不同的系统平台上。
除此以外,可能还包括额外的文件,比如模型文档和相关的头文件。
3、FMI 2.0和FMI 3.0
FMI2.0包括:
带有事件的常微分方程(ODEs),这些方程描述了系统的动态行为,需要通过数值求解器来进行求解;
连续和离散变量,即FMI的模型中,变量可能是随时间变化,也可以是在特定时间点发生变化;
时间概念,或可以理解为更广泛的独立变量,或是自变量,比如可以是一个角度,从而表述系统的动态变化。
FMI3.0增加:
不仅限于动态方程,也支持纯代数方程,可以处理不随时间变化的静态关系;
进一步支持了复杂的离散行为,即通过使用始终和模型分区来管理模型的顺序和同步;
同时不仅仅是基于物理的方程还可以:
vECU模型
机器学习模型
AI模型
......
二、FMI 3.0.1中的联合仿真
1、多个仿真程序耦合
联合仿真时将多个仿真程序耦合在一起,最终实现由多个子系统组成整理自动驾驶HiL系统的行为。
2、子系统耦合
子系统之间是互相耦合的,也就是每个子系统的行为依赖于其他子系统的行为,所以联合仿真必须是以逐步计算的方式进行。
3、示例
每个仿真程序负责计算一个子系统的行为,比如在自动驾驶HiL系统中,aiSim负责场景和传感器仿真,CarSim负责车辆动力学,两个仿真程序互相使用对方产生的输出来进行计算。
CarSim中车辆动力学更新的频率时1kHz,那么需要同步aiSim中场景更新的频率也为1kHz,而且只有在收到动力学信息后才会进行下一步的仿真。
4、同步和误差管理
在联合仿真的过程中,可能会产生附加误差,需要通过合适的联合仿真算法或是通信模式来将其限制在可接受的范围内,比如设置更新步长等。