“奋斗了几个月的动画演示终于出来了,拿过来让大家康康。这篇博文主要关注如何进行轨道交通模拟,使用的系统是由作者自己开发的微观车辆仿真系统advanced emulator(AE),着重阐述动画演示部分。如果你对整套AE系统,或者动画演示的模型逻辑感兴趣,可以后台私信。
先来康康实际动画:
极简系统介绍
该系统由GNU C和x86汇编语言混合编写,大概代码行数为20万,其核心仿真理念是构建一套完整的面向交通仿真的计算机仿真语言,并以此为引擎来驱动交通仿真。因此,与传统仿真平台而言,其最大的特点是它不依赖任何具体的交通模型,用户通过AE语言可以自行编写具体的交通模型并且在系统里模拟它们。系统开发始于05年,并延续至今。到目前为止,该系统的主要模块包括如下:
- AE语言编译器;
- AE语言debugger;
- 基于寄存器模式的虚拟机;
- 基于追踪的动态编译器;
- 基于FIFO消息队列的低延误自动内存回收器;
- 基于线程的抢占式并行交通模型模块;
- 基于OpenGL的虚拟现实模块;
- 。。。
这篇博文主要介绍如何利用AE的虚拟现实模块外加AE语言与C语言的混合编程以实现轨道模拟的动画显示。
问题阐述
为了在面向车辆微观仿真的计算机系统中实现对于轨道交通的动画展示,我们需要注意它与传统意义上的车辆仿真的区别:(1)轨道交通中的铁轨与车辆仿真中的道路不同,前者包含了更多的组件,比如钢轨,特别是它有道路所没有的枕木;后者大多数只关注拓扑连通性。(2)除非是大型/特大型客货运车辆,传统汽车车辆一般就是一个车厢。然而对于轨道列车而言,多车厢是常见现象。由此,可以看出为了显示轨道仿真,我们需要解决
- 问题1 改变该系统的道路显示功能从而让道路看起来具有钢轨和枕木等构件;
- 问题2 改变车辆显示功能使得车辆看起来具备多车厢并且容许这些车厢能根据其所处的位置独立改变自身方位;
技术路线
该系统没有提供针对道路路网绘制的回调机制,但是它提供了一个系统函数容许用户显示或隐藏特定的道路。
针对问题一,所采取的技术路线如下:首先我们使用该系统函数将轨道隐藏起来,其次根据轨道的相关几何信息比如其最右侧的几何轮廓,轨道间距,枕木的长、宽、高等等,我们预构建了可以在系统虚拟现实模块显示的OpenGL对象。通过在轨道原本位置显示所构建的OpenGL对象,问题一就能得到完美解决。
系统提供了关于车辆绘制的回调机制,如果用户愿意,可以编写相应C代码使仿真中出现的每一辆车辆以不同的样貌出现。因此,解决问题二的主要思路就是利用该回调机制编写相应代码从而满足列车显示要求。
实现浅析
具体的实现源代码见rail.zip压缩包。后台回复轨道模拟获取。
color.h,entry.cpp,rail.h文件使用C++编写而成,由它们编译而成的可执行文件a.out主要完成两项工作。一根据所提供的轨道最右侧几何轮廓信息文件和几何尺寸文件生成用于显示轨道的OpenGL对象;二根据所提供的轨道最右侧几何轮廓信息文件和几何尺寸文件生成在列车显示中用于定位目的的轨道中线轮廓文件。
f.c是使用C编写而成,它编译成动态链接库并且会在系统执行仿真脚本文件时进行加载。它主要的功能就是根据列车的当前位置,利用之前生成的轨道中线轮廓信息,以及列车的几何信息等等完成列车绘制。核心的绘制函数是位于106行的train函数,该函数在函数f(347行)被用于替换系统自带的车辆绘制函数,除此,函数f还包含其他额外的操作用于支撑train函数,比如编译用于列车车辆绘制的OpenGL list,读入之前生成轨道中线轮廓线文件(行339)等等。
circle.ae是仿真驱动脚本文件,采用AE语言编写而成。它由两种执行模式,依赖是否在执行该文件时定义了宏ROUND_1。如果定义了,它将在该仿真中唯一一条轨道的最右侧轮廓信息导出为相应文件,后者可作为前述的a.out文件的读入文件用于生成仿真时所需的相关文件。如果该宏没有被定义,则位于行37与121之间的代码将会被执行。
在行46到72通过对相关几何尺寸文件解析获取轨间距、列车尺寸等必要的显示信息。之后在行84到89,利用虚拟现实模块相关系统函数完成对于所预构建的OpenGL对象的载入,这相当于完成了轨道的绘制。接下来就是列车显示动态库的加载(行94),在加载完之后,通过调用f.c文件中f函数完成相关的初始化工作。
当这些都完成后,就是编写所需的列车驱动模型并进行仿真。下图为相关截屏。(注:这里出于显示目的,列车驱动模型非常简单,在真实计算分析中,需要额外编写相关模型。)
![c361be3ee1466cb2b59c9ea0b4b8c8ad.png](https://i-blog.csdnimg.cn/blog_migrate/cb3cb6c0d40ca401d01b063113a85e96.png)
附件说明
附件ae.tgz是系统软件包,之前谈及的MITSIMLab重实现就包含其中。另外它的目录(include,include/agl)包含了编译entry.cpp,f.c等文件所需的C和C++头文件。附件rail.zip是相关轨道动画显示的源代码。附件rail.mp4是用手机录制的简单视频。更多细节和讨论欢迎直接邮件联系,邮箱是by@tongji.edu.cn。