Disim 高速公路模擬器/建立新的汽車行為
Disim 允許建立完全任意的行為,而無需修改其內部程式碼。為了說明這一點,讓我們從一個簡單的例子開始:想象一輛汽車應該加速以達到其當前車道的速度限制,並且如果它離前方的汽車太近,應該減速。指令碼將如下所示
K = 1.0
safety_distance = 5
function init(self)
-- Nothing to do here
end
function think(self, dt, neighbors)
-- Current maximal speed allowed on this lane
lane_speed = self:getLane():getSpeedLimit()
lane_acceleration = (lane_speed - self:getSpeed())*K
-- Get distance to leading car
lead = neighbors[LEAD].car
if (lead) then
f = self:getGeometry()
phi,r = lead:getGeometry()
lead_distance = neighbors[LEAD].distance - f - r
lead_acceleration = (lead:getSpeed()^2 - self:getSpeed()^2)/(lead_distance-safety_distance)
else
lead_acceleration = 1000
end
return math.min(lane_acceleration, lead_acceleration), 0
end
function destroy(self)
-- Nothing to do here too
end
該指令碼是使用 LUA (http://www.lua.org/manual/5.1/manual.html) 編寫的:Lua 是一種擴充套件程式語言,旨在支援具有資料描述功能的通用程序式程式設計。它還為面向物件程式設計、函數語言程式設計和資料驅動程式設計提供了良好的支援。Lua 旨在用作任何需要指令碼語言的程式的強大、輕量級指令碼語言。Lua 作為庫實現,用乾淨的 C 語言編寫(即,在 ANSI C 和 C++ 的通用子集中)。
Disim 允許任何人使用 LUA 作為指令碼語言來建立和重新定義汽車行為。在 LUA 中建立汽車行為有幾個優點:不需要編譯,提供簡化的 API,並且您可以從 LUA 的所有功能中受益(表、匿名函式、字典等)。正如我們在上面的例子中看到的那樣,每個指令碼都應該提供以下 3 個函式
function init(self, options)
該函式接受兩個變數作為輸入。self 變數是指向當前正在初始化的汽車的 LuaCar 指標(該汽車剛剛進入高速公路),options 變數是透過 lua-args 命令列選項傳遞給 Disim 的字串。請注意,如果指令碼需要儲存與該汽車相關的特定資料,它應該在外部變數或陣列中這樣做(例如 vars[self] = { max_speed = 10.0 })。指令碼不會針對每輛車單獨載入,因此 self 在每次呼叫此函式時都可能不同。此函式不返回任何值。
function think(self, dt, neighbors)
該函式接受三個變數作為輸入
- self:與輸入函式一樣,這是一個指向當前正在控制的汽車的指標。
- dt:這是自上次針對特定汽車呼叫該函式以來的時間步長持續時間(以秒為單位)。
- neighbors:此陣列至少包含 6 個元素,您可以使用 LEAD、TRAIL、LEFT_LEAD、LEFT_TRAIL、RIGHT_LEAD、RIGHT_TRAIL 鍵訪問它們(例如 neighbors[LEFT_LEAD])。此陣列的每個元素都是一個帶有 2 個鍵的陣列:car 和 distance。因此,您可以使用 neighbors[LEAD].car 訪問引導車輛的汽車指標,並使用 neighbors[LEAD].distance 訪問與該車輛的縱向距離。
此函式需要返回 2 個值:第一個是加速度(將應用於汽車,直到下一個時間步長),第二個是車道變更命令。例如,要讓汽車以 2.0 m/s2 的速度加速並變道到左側車道,您可以執行以下操作:return 2.0, -1。要以 -1.0 m/s2 的速度變道到右側車道制動,您可以執行以下操作:return -1.0, 1,並且要什麼也不做,您可以執行以下操作:return 0, 0。
function destroy(self)
該函式接受一個變數作為輸入。此變數是指向當前正在銷燬的汽車的指標(該汽車剛剛駛出高速公路)。在此函式中,您應該清理所有由 init 為該車輛初始化的變數。
如上所示,所有提供的函式都將指向當前正在控制的車輛的指標作為引數。此指標描述了 LUA 中的一個物件:LuaCar。要檢視您可以使用此物件執行的操作,請檢視 Disim 的 LUA API,可在此處獲得 此處。
在 下一部分中,我們將看到如何建立指令碼以控制基礎設施。