X语言案例1:自动驾驶汽车的案例
为了证明X语言在混合模型下的联合仿真能力,基于实际驾驶模型中的一部分过程进行简化,并利用连续、离散、智能体三个模块对简化后的驾驶模型进行建模。
图1 驾驶模型组成结构图
如图1所示为驾驶模型的模型结构图,其中car1为有人驾驶的汽车,或理解为“智能车”,而car2为无人驾驶的汽车,或理解为“非智能车”。Car1包含三类模型,分别是由智能体模型组成的driver模块,由离散模型组成的car模块,以及由连续模型组成的power模块。而car2则只包含一个离散模型,用于和car1产生交互。为了更清晰地展示基于X语言的整个建模和仿真过程,各个模型之间的交互逻辑和顺序被清晰地定义,如图1所示。智能体模型driver首先利用已经训练好的policy进行决策,并将动作结果传递给离散模型car,car模块将driver的动作传递给power模块,以根据动作产生汽车的动力学反馈,最后car根据power返回的变化量改变自己的实际位置,并通过发送给环境来影响环境中car1的位置,以此完成一个car1的运动周期。在这个过程中,环境也会收集来自car2的位置并反馈给car1,从而让car1主动避让car2以防止事故发生。整个模型模拟了真实世界中驾驶汽车的体系模型,由X语言中的连续、离散、智能体三类模型共同组成。 为了更清晰地展示基于X语言的建模过程,而不是对真实情景模拟的更好,我们将复杂的动力学过程、动态的环境、以及多类型的交互过程进行了合理的简化。
图2 驾驶顶层模型定义图
图3 驾驶顶层模型连接图
针对此案例,本文首先建立整个驾驶模型的顶层模型(包括图形建模和文本建模两种形式),它是由1个驾驶员、2辆汽车、1个汽车动力系统模块以及1个给定环境模块组成。整个系统的系统设计的定义图以及连接图如图2和3所示,其中,图定义了整个系统的组成模块,连接图定义了模块之间的连接关系。图4给出了整个系统的顶层模型的仿真文本。之后,本文对整个系统中的每一个模块都进行详细的建模(包括图形建模和文本建模两种形式).例如,图5和图6分别通过设计car1中的car模块的定义图和状态机图来描述其结构和行为。图7给出了car模块的仿真文本。最后,将所有仿真文本通过X语言解释器解释进行仿真得到仿真结果。
图4 驾驶顶层模型仿真文本
图5 car1中car模型定义图
图6 car1中car模型状态机图
图7 car1中car模型仿真文本
仿真结果
基于上面的模型描述,驾驶模型的仿真结果可视化如图2所示。其中(a),(b),(c)三个图表示了car1在前往目的地途中与car2经历的三个交互阶段,在每一次的交互中car1都会停止当前的动作等待car2远离后再行动,图(d)则展示了car1从初始位置到最终位置的完整轨迹。在图2所示的仿真结果中,car1的每一步都会经历图1所示的t1-t9交互过程。
(a)(b)
(c)(d)
图2 驾驶模型仿真示意图
由于X语言的仿真器是遵循DEVS搭建的,因此在模块的运行过程中存在离散事件的时间推进过程,如图3所示,为整个系统的时间推进过程。图3所示的横坐标为仿真推进时间,而纵坐标代表了X语言描述的不同种类的模型对应的底层原子模型仿真器输出事件和外部事件的转移顺序,例如driver watchfor ext和driver watchfor output分别代表了驾驶员计划这一原子模型的外部事件转移和输出函数的过程,内部事件转移的过程包含在了输出函数的过程中,这一点与DEVS原子模型本身的事件转移过程是一致的。
从图3中可以发现,整个模型的运行顺序与图1的建模顺序是一致的,反映了连续、离散和智能体模型组成的耦合模型的仿真过程。其中,power output会在整个仿真中连续存在,并在满足交互条件时与汽车模型产生交互行为。智能体由于其离散模型的本质,其仿真过程与离散模型的运行情况一致。
驾驶模型案例从建模和仿真两个角度给出了X语言对于连续、离散、智能体模型的支持,演示了X语言在多领域复杂模型中的建模过程。
图3 驾驶模型底层原子模型的仿真时间推进图