SUMO入門(八) - TraCI

SUMO入門(八) - TraCI

TraCI
TraCI/Interfacing TraCI from Python

TraCI 是 “Traffic Control Interface” 的簡寫。
通過訪問正在進行的道路交通模擬,它可以檢索仿真對象的值並“在線”操縱它們的行爲。

1 使用TraCI

SUMO啓動

TraCI 使用基於TCP的客戶端/服務器的體系結構來提供對SUMO的訪問。

因此,SUMO充當使用其他命令行選項啓動的服務器:–remote-port <INT> ,其中<INT>是SUMO用於偵聽傳入連接的端口。 可以連接的客戶端數量可以作爲附加選項 –num-clients <INT> 給出,其中1是默認值。 請注意,在多客戶端方案中,您必須使用 SetOrder-command 明確指定客戶端的執行順序。

當使用 –remote-port <INT> 選項啓動時,SUMO僅準備模擬並等待所有外部應用程序連接並接管控制。
SUMO作爲TraCI服務器運行時,將忽略 –end<TIME> 選項,SUMO將一直運行,直到客戶端要求仿真結束
使用 SUMO-GUI 作爲服務器時,必須使用 播放按鈕 或在處理TraCI命令之前設置選項 –start 來啓動仿真。


關閉仿真

使用 TraCI 時,將忽略SUMO的 –end<TIME> 選項。 而是通過發出 close命令 來關閉仿真。
要檢測所有路徑文件是否已用盡且所有車輛都已離開仿真,可以檢查命令 getMinExpectedNumber 是否返回0。一旦所有客戶端發送了 close 命令,仿真將立即結束。

也可以使用load-command通過新的參數列表重新加載模擬。


TraCI命令

TraCI命令分爲13個部分,它們對應於各個模塊: gui,lane,poi,simulation,trafficlight,vehicletype,edge,inductionloop,junction,multientryexit,polygon,route,person,vehicle
有關函數的詳細列表,請參閱 pydoc generated documentation。命令的源代碼可以在eclipse/sumo找到


協議規範

請參閱 TraCI協議規範(包括基本流,消息,數據類型)


2 使用SUMO作爲庫

通常,TraCI用於耦合多個進程:SUMO服務器進程和一個或多個TraCI客戶端進程。

或者,Libsumo可用於將SUMO作爲庫嵌入到客戶端進程中。 這允許使用與客戶端庫中相同的方法簽名,但避免了套接字通信的開銷。 Libsumo支持使用SWIG生成客戶端庫,因此可以與大量編程語言一起使用。


3 使用示例

有一個使用TraCI進行自適應交通燈的教程(使用Python)
Tutorials / CityMobil 教程 使用TraCI爲車輛分配新路線(使用Python)。
Tutorials / TraCIPedCrossing 教程 使用TraCI構建一個帶有行人觸發交通信號燈的交叉路口。

4 資源

4.1 編程語言接口

PythonInterfacing TraCI from Python 允許使用Python與SUMO交互,支持所有TraCI命令
Java,.NET,…任何可以做SOAP的東西: TraaS是TraCI的Web服務適配器,允許爲多個語言生成自動API。 API完整性很高但通常落後於python客戶端。 TraaS也可以用作獨立的TraCI客戶端
Matlab :TraCI4Matlab並非所有TraCI命令都已實現
C++:C++ TraCIAPI 是客戶端庫,它是SUMO源代碼樹的一部分(API範圍幾乎覆蓋)
C++:Veins項目提供了一個用於將SUMO與OMNET ++耦合的中間件。 作爲基礎架構的一部分,它爲TraCI API提供了一個C++客戶端庫(API完整性稍微落後於python客戶端)
.NET:TraCI.NET是一個幾乎覆蓋完整API範圍的客戶端庫

4.2 V2X仿真

TraCI允許將SUMO通信網絡模擬器結合使用,以模擬車輛通信。 有關可用解決方案的列表,請參閱 Topics/V2X


5 性能

使用TraCI會降低仿真速度。 減速量取決於許多因素:每個仿真步驟中TraCI函數的調用數、被調用的TraCI函數的類型、TraCI腳本中的計算過程、客戶端語言

例如,考慮在每個模擬步驟期間檢索每個車輛的x,y位置(使用python客戶端):

   while traci.simulation.getMinExpectedNumber() > 0: 
       for veh_id in traci.vehicle.getIDList():
            position = traci.vehicle.getSpeed(veh_id)
       traci.simulationStep()

該腳本每秒可處理約25000輛汽車。
使用embedded python將其增加到每秒約50000輛
通過使用 subscriptions,相同的值檢索也可以加速到每秒50000輛車:

   while traci.simulation.getMinExpectedNumber() > 0: 
       for veh_id in traci.simulation.getDepartedIDList():
           traci.vehicle.subscribe(veh_id, [traci.constants.VAR_POSITION])
       positions = traci.vehicle.getSubscriptionResults()
       traci.simulationStep()

Bologna scenario中使用此腳本(9000輛車,5000個模擬步驟)時,記錄了以下運行時間:
沒有TraCI :8s
普通位置檢索:90s
使用 subscriptions 檢索:42s
使用embedded python進行檢索:46s
使用 subscriptionsembedded python 進行檢索:34s


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章