python文件路径过滤器_SUMO入门(八) - 从Python引入TraCI接口
SUMO入門(八) - 從Python引入TraCI接口
TraCI
TraCI/Interfacing TraCI from Python
TraCI命令分為13個部分,它們對應于各個模塊: gui,lane,poi,simulation,trafficlight,vehicletype,edge,inductionloop,junction,multientryexit,polygon,route,person,vehicle
有關函數的詳細列表,請參閱 pydoc generated documentation。命令的源代碼可以在eclipse/sumo找到
1 在腳本中引入TraCI
要使用該庫,/tools 目錄必須位于python加載路徑上。 通常如下:
import os, sys
if 'SUMO_HOME' in os.environ:
tools = os.path.join(os.environ['SUMO_HOME'], 'tools')
sys.path.append(tools)
else:
sys.exit("please declare environment variable 'SUMO_HOME'")
這假定在運行腳本之前設置了環境變量SUMO_HOME。 或者,您可以直接在行中聲明 sumo/tools 的路徑
sys.path.append(os.path.join('c:', os.sep, 'whatever', 'path', 'to', 'sumo', 'tools'))
2 第一步
通常,從Python接入SUMO非常容易(以下示例是 tutorial / traci_tls 的修改)
首先,編寫命令行以啟動 SUMO 或 SUMO-GUI:
(省略在0.28.0版本之前需要的遠程端口選項 --remote-port)
sumoBinary = "/path/to/sumo-gui"
sumoCmd = [sumoBinary, "-c", "yourConfiguration.sumocfg"]
然后開始仿真并使用腳本連接到它:
import traci
traci.start(sumoCmd)
step = 0
while step < 1000:
traci.simulationStep()
if traci.inductionloop.getLastStepVehicleNumber("0") > 0:
traci.trafficlight.setRedYellowGreenState("0", "GrGr")
step += 1
traci.close()
連接到仿真后,可以發出各種命令并執行仿真步驟,直到您想要關閉連接。 默認情況下,close命令將一直等到sumo過程真正完成,你可以通過調用來禁用它:
traci.close(False)
3 Subscriptions 訂閱
Subscriptions 可以被視為用于 檢索變量的批處理模式。 您可以在每個時間步之后自動檢索感興趣的值,而不是一遍又一遍地請求相同的變量。 TraCI訂閱基于每個模塊進行處理。 也就是說,您可以在每個時間步之后向模塊詢問所有當前訂閱的結果。 為了訂閱變量,您需要知道它們的變量 id,可以在 traci/constants.py 文件中進行查找。
import traci
import traci.constants as tc
traci.start(["sumo", "-c", "my.sumocfg"])
traci.vehicle.subscribe(vehID, (tc.VAR_ROAD_ID, tc.VAR_LANEPOSITION))
print(traci.vehicle.getSubscriptionResults(vehID))
for step in range(3):
print("step", step)
traci.simulationStep()
print(traci.vehicle.getSubscriptionResults(vehID))
traci.close()
檢索到的值始終是上一個時間步的值,無法檢索較舊的值。
3.1 上下文訂閱
上下文訂閱的工作方式與訂閱類似,因為它們會在每個仿真停止自動檢索變量列表。 但是,這樣做是通過設置引用對象和范圍,然后在引用對象的范圍內檢索給定類型的所有對象的變量。
TraCI上下文訂閱是基于每個模塊處理的。 也就是說,您可以在每個時間步之后向模塊詢問所有當前訂閱的結果。 為了訂閱變量,你需要檢索要檢索對象的域id,以及可以在 traci/constants.py 文件中查找的變量id。 域ID的格式始終為 CMD_GET_ _VARIABLE。 以下代碼檢索交叉點范圍(42m)內的所有車輛速度和等待時間(隱式檢索車輛ID)。
import traci
import traci.constants as tc
traci.start(["sumo", "-c", "my.sumocfg"])
traci.junction.subscribeContext(junctionID, tc.CMD_GET_VEHICLE_VARIABLE, 42, [tc.VAR_SPEED, tc.VAR_WAITING_TIME])
print(traci.junction.getContextSubscriptionResults(junctionID))
for step in range(3):
print("step", step)
traci.simulationStep()
print(traci.junction.getContextSubscriptionResults(junctionID))
traci.close()
檢索到的值始終是上一個時間步的值,無法檢索較舊的值。
3.2 上下文訂閱過濾器
對于車輛到車輛的上下文訂閱(即,上下文訂閱,其參考對象是車輛并且其請求的上下文對象也是車輛),可以請求在服務器側已經應用的附加過濾器。 一般過程是通過對 addSubscriptionFilter() 的成功調用,在調用 subscribeContext() 之后直接為請求的上下文訂閱配備過濾器,例如在下面的代碼片段中:
traci.vehicle.subscribeContext("ego", tc.CMD_GET_VEHICLE_VARIABLE, 0.0, [tc.VAR_SPEED])
traci.vehicle.addSubscriptionFilterLanes(lanes, noOpposite=True, downstreamDist=100, upstreamDist=50)
第一行請求具有ID “ego” 的參考車輛附近的車輛速度的上下文訂閱。上下文訂閱的范圍(指通常訂閱機制的徑向上下文區域)可以設置為等于0.0。
可以使用以下過濾器類型:
Lanes:返回相對于參考車輛指定的車道上的周圍車輛
CFManeuver:返回參考車輛車道的領導者和追隨者
LCManeuver:返回參考車輛車道和相鄰車道的領導者和追隨者
Turn:沿著車輛路線返回即將到來的交叉路口的沖突車輛
VType:僅返回指定vType的車輛
VClass:僅返回指定vClasses的車輛
有關詳細規范,請參閱 pydoc文檔。
4 添加StepListener
每次調用 traci.simulationStep() 時都需要調用一個函數,為了讓它自動發生(總是在每次調用simulationStep() 之后)可以添加一個StepListener對象 'listener’(更確切地說是traci.StepListener的子類的一個實例)
class ExampleListener(traci.StepListener):
def step(self, t=0):
# do something at every simulaton step
print("ExampleListener called at time %s ms." % t)
# indicate that the step listener should stay active in the next step
return True
listener = ExampleListener()
traci.addStepListener(listener)
警告:在一個traci客戶端控制多個SUMO實例的情況下,不能使用TraCI StepListener。
5 從同一個TraCI腳本控制并行仿真
TraCI python庫可用于通過單個腳本同時控制多個仿真。 函數 traci.start() 有一個可選的label參數,允許您使用不同的仿真實例和標簽多次調用它。 然后可以使用函數 traci.switch() 切換到任何初始化標簽:
traci.start(["sumo", "-c", "sim1.sumocfg"], label="sim1")
traci.start(["sumo", "-c", "sim2.sumocfg"], label="sim2")
traci.switch("sim1")
traci.simulationStep() # run 1 step for sim1
traci.switch("sim2")
traci.simulationStep() # run 1 step for sim2
如果您更喜歡面向對象的方法,也可以使用連接對象與仿真進行通信。 它們具有與靜態traci相同的接口調用,但您仍需要手動啟動仿真:
traci.start(["sumo", "-c", "sim1.sumocfg"], label="sim1")
traci.start(["sumo", "-c", "sim2.sumocfg"], label="sim2")
conn1 = traci.getConnection("sim1")
conn2 = traci.getConnection("sim2")
conn1.simulationStep() # run 1 step for sim1
conn2.simulationStep() # run 1 step for sim2
6 嵌入式Python
作為一個實驗性功能,還可以直接將SUMO與python連接,并在SUMO中執行腳本。 語法完全相同,只是你省去了對init和close的調用,你需要使用選項 –python-script 啟動sumo。 此功能被視為已棄用,將由libsumo替換。 但它目前不適用于sumo的GUI版本。
由于該功能尚未經過良好測試,因此建議您需要在構建SUMO時顯式啟用嵌入式python。 為此,請按照以下說明操作:
6.1 Linux
– 安裝python devel包文件
– 使用–with-python選項調用configure
– 像往常一樣make && make install
6.2 Windows
– 確保安裝了python并且在你的PATH中
– 調用tools \ build \ pythonPropsMSVC.py來生成或修改build \ msvc10 \ config.props文件
– 像往常一樣構建Win32發行版
– 來自PCbuild目錄副本
python27_d.dll到Python目錄(類似于C:\ Python27)
python27_d.lib,python27_d.pdb,python27_d.exp到libs目錄(C:\ Python27 \ libs)
每個* _d.pyd到DLL的目錄(C:\ Python27 \ DLLs)
– 通過編輯build \ msvc10 \ Win32.props啟用python調試版本
– 現在,您可以為SUMO執行Win32 Debug構建
7 用法示例
運行仿真直到所有車輛到達
while traci.simulation.getMinExpectedNumber() > 0:
traci.simulationStep()
動態添加行程(不完整路徑)
定義包含起始邊和目標邊的路線:
traci.route.add("trip", ["startEdge", "endEdge"])
然后添加具有該路線的車輛:
traci.vehicle.add("newVeh", "trip", typeID="reroutingType")
這將導致車輛根據出發時網絡中的估計行程時間計算從startEdge到endEdge的新路線。
坐標轉換
x, y = traci.vehicle.getPosition(vehID)
lon, lat = traci.simulation.convertGeo(x, y)
x2, y2 = traci.simulation.convertGeo(lon, lat, fromGeo=True)
edgeID, lanePosition, laneIndex = traci.simulation.convertRoad(x3, y3)
edgeID, lanePosition, laneIndex = traci.simulation.convertRoad(lon2, lat2, True)
注意:使用TraCI時,有一些常見的任務沒有被traci庫覆蓋,例如分析道路網絡、解析仿真輸出。
對于此功能,建議使用 Tools / Sumolib
總結
以上是生活随笔為你收集整理的python文件路径过滤器_SUMO入门(八) - 从Python引入TraCI接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git灰度发布版本_spring clo
- 下一篇: websocket python爬虫_p