Disim 高速公路模拟器/创建基础设施控制器
Disim 允许创建完全任意的基础设施控制,而无需修改其内部代码。为了说明这一点,让我们从一个简单的示例开始:假设网络上存在一个匝道计量器,我们希望当同一高速公路上传感器测量的交通密度过低时,增加相应匝道的入口率。脚本看起来像这样
-- Actuator
ramp_meter = nil
-- Sensors
density_sensor = {}
-- Variables
K = 0.1
optimal_density = 60
tprev = 1
last_change = 0
dt_red = 5
dt_green = 3
function init(self)
ramp_meter = self:getRoadActuator("rampmeter")
density_sensor[0] = self:getRoadSensor("densitysensor1")
density_sensor[1] = self:getRoadSensor("densitysensor2")
end
function update(self, t, dt)
-- Setting the ramp meter light
last_change = last_change + dt
if (ramp_meter:getColor() == RED and last_change > dt_red) then
last_change = 0
ramp_meter:green()
elseif (ramp_meter:getColor() == GREEN and last_change > dt_green) then
last_change = 0
ramp_meter:red()
end
-- Aggregation of data happens every minute
if (t - tprev < 60) then
return
end
tprev = t
density = density_sensor[0]:getValue() + density_sensor[1]:getValue()
dt_red = dt_red + (density - optimal_density)*K
if (dt_red < 0) then dt_red = 0; end
end
function destroy(self)
-- Nothing to do here
end
此脚本是使用 LUA (https://lua.ac.cn/manual/5.1/manual.html) 编写的:Lua 是一种扩展编程语言,旨在支持具有数据描述功能的一般过程编程。它还为面向对象编程、函数式编程和数据驱动编程提供了良好的支持。Lua 旨在用作任何需要脚本语言的程序的强大、轻量级脚本语言。Lua 作为库实现,用干净的 C(即 ANSI C 和 C++ 的通用子集)编写。
Disim 允许任何人使用 LUA 作为脚本语言来创建和重新定义基础设施行为。在 LUA 中创建您的基础设施控制器有几个优点:不需要编译,可以获得简化的 API,并且您受益于所有 LUA 功能(表格、匿名函数、字典,...)。正如我们从上面的示例中观察到的,每个脚本都应该提供以下 3 个函数
function init(self)
此函数以单个变量作为输入。此变量是当前高速公路网络上的 LuaInfrastructure 指针。此函数不返回值,但保存网络上我们计划使用的不同传感器和执行器的某些指针可能很有用。
function update(self, t, dt)
此函数以三个变量作为输入
- self:与输入函数一样,这是一个指向受控基础设施的指针。
- t:这是自模拟开始以来的绝对时间。
- dt:这是自上次调用该函数以来的时间步长(以秒为单位)。
此函数不返回值。
function destroy(self)
此函数以单个变量作为输入。此变量是指向当前基础设施的指针。在此函数中,您应该清理由 init 初始化的任何变量。
如上所示,所有提供的函数都以指向当前受控基础设施的指针作为参数。此指针描述了 LUA 中的一个对象:LuaInfrastructure。要查看您可以对该对象执行的操作,请查看 此处 可用的 Disim LUA API。
在下一部分中,我们将看到如何将到目前为止我们所看到的所有内容结合起来,从一条虚拟高速公路上收集数据。