初识CPS方法的连续动态建模
01
信息物理融合系统介绍
信息物理融合系统(CPS)是对计算进程与物理进程进行集成所形成的综合系统,其行为由系统的信息部分及物理部分共同定义。嵌入式系统中的计算机与网络监测并控制物理进程,且在通常情况下这些物理进程与计算进程在反馈环路中相互影响。使用CPS方法设计嵌入式系统的过程有三个主要部分,即建模、设计与分析,如下图1。

▲图1 创建嵌入式系统需要一个建模、设计和分析的迭代过程
其中,建模是通过模拟来加深对系统的理解的过程。模型模拟了系统并反映出系统的特性。模型指明了系统能做什么。设计是对嵌入式系统的机构化创建,制定系统如何执行其功能。分析是通过剖析来深入理解系统的过程,指定了系统为什么这样运行。
如图1所示,这个过程的三个部分是有所重叠的,其中,设计过程在这三个部分中不断迭代。通常情况下,该过程从建模开始,其目标是理解问题并设计解决策略。
02
CPS方法对连续动态模型建
连续动态模型是模型中较为简单的一种,我们今天就通过物体六个自由度的建模示例来简单了解一下使用CPS方法对连续动态模型建模。
为了研究物理系统的动态性,我们需要先回顾一些经典力学的原理。首先我们从简单的运动方程着手,该方程以常微分方程(未知函数只含有一个自变量的微分方程)的形式提供了系统的模型。
物理对象的空间运动可以表示为六个自由度,如图2所示。

▲
图2 飞行器的6个自由度建模(空间位置以及滚转角、偏航角和俯仰角)
其中,三个代表三维空间中的位置,另外三个代表空间中的方向。假设有三个轴x、y和z,其中,x轴的绘制递增向左上角,y轴递增向右,z轴递增向下。滚转角(roll)是绕x轴旋转的角度,0弧度表示沿着z轴方向保持水平(即该角度是相对于z轴给出的)。偏航角(yaw)是绕y轴旋转的角度,0弧度表示直接指向下方(即相对于x轴给出的角度)。俯仰角(pitch)是绕z轴的旋转角度,0弧度通常代表水平指向(即相对于x轴给出的角度)。
由此,物体的空间位置就被表示为形如f:R->R的6个函数,其中R表示为实数,定义域(前面的R)表示时间,到达域(后面的R,区别于值域,函数的值域是到达域的子集)表示某个轴上的距离或与该轴的夹角。该类形式的函数被称为时间连续信号,常常被包含在向量值函数x:R -> R³和θ:R -> R³中,其中x和θ分别代表位置与方向。
位置和方向的改变符合牛顿第二定律,该定律中力与加速度相互关联。加速度是位置的二阶导数。我们的第一个公式即公式(1),用于处理位置信息。其中,F是三个方向的力向量,M是物体的质量,x''是x对事件的二阶导数(即加速度)。

速度是加速度的积分,由以下方程给出。其中,x''(0)是三个方向的初始速度。

基于公式1,该方程可进一步演化为如下形式:

位置是速度的积分,

其中,x(0)是初始位置。基于这些方程,如果已知物体的初始位置、初始速度以及施加在物体上的三个方向的作用力(时间的函数),就可以确定物体在任意时刻的加速度、速度以及位置。
这些作用于方向的运动方程使用了转矩,即旋转形式的作用力。这又是一个作为时间函数的三元素向量,代表了作用在物体上的净旋转力。它与角速度相关,形式类似于公式1.

其中,T是三个轴上的转矩向量,I(t)是物体的转动惯量张量。转动惯量是一个3X3矩阵,其取决于物体的集合形状和方向。如果物体是个球形的,那么这个惯性在所有轴上都是相同的,因此,其将归纳为一个常标量I,此时,该方程将与公式1非常相似,如式3所示。

旋转速度是加速度的积分,如下公式所示。其中,θ'(0)即三个轴的初始旋转速度。

如果将物体看作是球形,那么使用公式(3)可以得到以下方程。

方向则是旋转速度的积分,可由以下方程计算。

其中,θ'(0)是初始方向。
如果已知物体的初始方向、初始旋转速度,以及作用在物体三个轴上的转矩是一个时间函数,使用这些方程就能随时确定物体的旋转加速度、速度以及方向。
以上就是对连续动态物体进行简单建模的过程,此方法可以得到三维物体的加速度、速度、位置、旋转加速度和方向等信息,如果物体是在平面上移动的车辆,那么可以不考虑y轴方向的运动,车辆的运动方程也可以使用此方法进行简单的建模。
03
使用ModelCoder进行建模
使用ModelCoder对式(6)进行建模,通过模型观察连续动态模型的变化:
假设参数I为1,θ(0)初始方向 = 1,方程由三部分构成:

因此,我们分别对这三部分进行建模,
第一部分,由于θ(0) = 1,我们直接使用Constant模块进行输出即可:

第二部分,这是初始方向微分与时间的乘积,假设初始方向的导函数的结果是1,用Constans模块表示,与Clock模块相乘。

对于T(α),我们知道它是一个随时间变化而变化的值,我们使用斜率为1的Ramp模块来表示,对其进行两次积分,并乘以系数1/I=1,第三部分建模如下:

最后将方程的三部分用加法器组合在一起,搭建如下模型。

对此模型进行仿真,得到的结果如下图:

通过模型仿真,我们可以看到,模型在开始之初变化不大,但是随着时间的推移,施加在某个方向上的转矩T(α)越大,物体旋转的速度也越快。
Modelcoder(形式化验证的代码生成工具)
由我司自主开发的ModelCoder是一款支持多种嵌入式系统建模并可以自动生成高安全可靠的C代码的软件设计和开发工具。ModelCoder支持同步数据流以及状态机等嵌入式模型,其从模型生成代码的过程经过了形式化验证,保证生成过程的正确无误性,能够用于飞控,航电,核电DCS等多个安全关键领域的嵌入式软件的设计和开发。
ModelCoder采用了最严格的形式化技术,用定理证明的方式对模型到代码的生成过程进行了严格的数学证明。和同类软件SCADE的KCG相比,KCG只是采用了模型检测技术对模型本身进行了证明,而ModelCoder无疑在技术途径上更为可靠。