:從netedit畫路到信號燈配時)
簡介本資源是一份面向交通工程初學(xué)者與SUMO建模入門者的十字路口網(wǎng)絡(luò)配置實踐文件聚焦netedit圖形化建模核心流程解決城市微觀交通仿真中關(guān)鍵節(jié)點——信號交叉口的快速構(gòu)建與參數(shù)化定義問題。壓縮包僅含1個3KB的XML格式網(wǎng)絡(luò)文件cross240327.net.xml該文件已完整實現(xiàn)四臂直角交叉口的道路拓撲、車道連接關(guān)系、默認(rèn)優(yōu)先級交叉口類型及基礎(chǔ)交通流通行邏輯可直接導(dǎo)入SUMO進行后續(xù)車輛路由與仿真運行。資源已獲790人學(xué)習(xí)下載體現(xiàn)了其在教學(xué)演示、課程實驗與小規(guī)模場景驗證中的實用價值。讀者可直接復(fù)用該結(jié)構(gòu)化網(wǎng)絡(luò)文件省去從零繪制邊、定義連接、校驗拓撲等繁瑣步驟同時通過閱讀XML源碼直觀理解netedit操作背后的底層參數(shù)映射為進階自定義信號配時、多相位控制或復(fù)雜渠化設(shè)計奠定實操基礎(chǔ)。 做仿真實驗找了個SUMO搭十字路口這活兒看起來簡單真上手才發(fā)現(xiàn)坑不少。很多人第一次打開netedit面對空蕩蕩的畫布根本不知道從哪里下手要么是節(jié)點畫了半天路網(wǎng)連不起來要么是好不容易畫完了跑仿真的時候車全在路口堵死。這篇不講虛的用實際建好的cross240327.net.zip作為例子完整走一遍從新建路網(wǎng)、畫路、連車道、配信號燈到最終驗證的流程把為什么這么設(shè)、參數(shù)背后的邏輯、以及容易踩的坑一次說清楚。1. 十字路口建模的整體設(shè)計與核心思路1.1 SUMO和netedit在項目中到底扮演什么角色SUMOSimulation of Urban MObility是開源微觀交通流仿真平臺它在交通領(lǐng)域的位置相當(dāng)于PyTorch在深度學(xué)習(xí)里的地位——免費、開源、生態(tài)完善、支持二次開發(fā)。netedit是SUMO自帶的圖形化路網(wǎng)編輯工具用來畫路、定義車道、設(shè)置信號燈和檢測器。交叉口建模是所有SUMO項目的地基。一個城市級網(wǎng)絡(luò)仿真本質(zhì)上就是大量路口節(jié)點和路段邊拼出來的一條路網(wǎng)數(shù)據(jù)畫錯后面所有的交通需求分配、信號配時優(yōu)化、尾氣排放計算全都會跟著出錯。因此把單個十字路口的路網(wǎng)幾何、車道連接、信號邏輯三件事徹底弄明白等于打通了SUMO路網(wǎng)建模的任督二脈。1.2 為什么選netedit而不是寫XML或?qū)懩_本在netedit出現(xiàn)之前SUMO路網(wǎng)主要通過兩種方式建立手寫.net.xml文件或者編寫Python腳本調(diào)用sumolib生成。手寫XML文件極為痛苦一個帶左轉(zhuǎn)待轉(zhuǎn)區(qū)的路口可能要幾百行代碼光是對齊節(jié)點坐標(biāo)就能讓人崩潰寫腳本則需要首先在腦中構(gòu)建立體的路網(wǎng)拓撲這對新手很不友好。netedit把路網(wǎng)的“節(jié)點-邊-連接”三層結(jié)構(gòu)可視化了。“節(jié)點”是路口“邊”是道路“連接”是車道與車道之間允許的通行關(guān)系。你能直接在畫布上拖動、對齊、檢查沖突軟件實時顯示當(dāng)前路網(wǎng)能否被SUMO正常解析。cross240327.net.zip這個壓縮包解壓后里面最核心的就是用netedit保存的.net.xml路網(wǎng)文件它完整記錄了這整套拓撲信息。實操心得如果只是做一個簡單的十字路口netedit就夠用但如果要批量生成大面積路網(wǎng)建議用OpenStreetMap數(shù)據(jù)轉(zhuǎn)成SUMO格式netconvert --osm-files map.osm --output-file map.net.xml。前者適合精雕細琢后者適合快速鋪開。1.3 十字路口建模的核心目標(biāo)拆解一個標(biāo)準(zhǔn)十字路口建模時本質(zhì)上要解決三個約束物理連通性四條進口道、四條出口道每條道有若干車道車道之間需要允許對應(yīng)的行駛軌跡直行、左轉(zhuǎn)、右轉(zhuǎn)。交通規(guī)則完整性路口內(nèi)車輛根據(jù)信號燈或讓行規(guī)則通行需要定義路權(quán)關(guān)系防止沖突車流同時放行。幾何可通行性車道轉(zhuǎn)彎半徑、車道寬度、節(jié)點位置必須保證車輛能夠按SUMO內(nèi)置的車輛動力學(xué)模型安全通過。SUMO里車輛是微觀模型沒有“神仙轉(zhuǎn)彎”半徑過小車輛會原地打轉(zhuǎn)或速度驟降。netedit中的每一項設(shè)置最終都落在滿足這三條約束上。思路清晰了具體操作就不容易迷路。2. 環(huán)境準(zhǔn)備與netedit基礎(chǔ)操作2.1 工具版本與安裝要點不同版本的SUMO在netedit界面上有細微差異。以目前最新的SUMO 1.20.0為例2024年發(fā)布netedit界面已經(jīng)支持暗色模式、多標(biāo)簽頁編輯以及更智能的連接檢查。安裝時建議直接在官網(wǎng)下載安裝包Windows環(huán)境注意勾選添加環(huán)境變量否則后續(xù)命令行調(diào)用neteditnetconvert等工具會報錯。安裝路徑不要包含中文和空格這是老生常談但真的能避免很多詭異問題。如果要用Python腳本與SUMO交互裝好SUMO后需要手動把tools目錄加入PYTHONPATH否則import traci和import sumolib都會失敗。驗證安裝是否成功可以在命令行輸入netedit --version如果輸出版本信息說明環(huán)境沒問題。2.2 netedit界面布局速覽打開netedit后界面分三塊左側(cè)是模式選擇面板最常用的是“網(wǎng)絡(luò)編輯”模式Network、“需求編輯”模式Demand、“出行模式”模式Mode。中間是畫布鼠標(biāo)左鍵選擇元素右鍵彈出上下文菜單滾輪縮放按住中鍵拖動視角。右側(cè)是屬性面板選中節(jié)點、邊或連接后這里會列出所有可修改的屬性。畫十字路口全部工作在“網(wǎng)絡(luò)編輯”模式下完成。這個模式里畫布上有三種核心元素圓形或方形的結(jié)點Node/Junction、連接結(jié)點的邊Edge、以及邊內(nèi)部的車道Lane。2.3 新建路網(wǎng)文件與基礎(chǔ)視圖操作啟動netedit后選擇File - New Network然后馬上File - Save As存成cross.net.xml。保存后用文本編輯器打開看一眼會發(fā)現(xiàn)里面已經(jīng)生成空net根標(biāo)簽后續(xù)所有操作都會寫入這里。畫布導(dǎo)航的幾個快捷鍵建議刻進肌肉記憶Shift 鼠標(biāo)左鍵拖拽平移視角。Ctrl 鼠標(biāo)滾輪縮放視角。Delete刪除選中的元素。Ctrl Z撤銷netedit有撤銷棧但層級較深建議多存盤。Ctrl S保存務(wù)必養(yǎng)成隨手保存的習(xí)慣。注意netedit的撤銷不是萬能的某些批量操作比如自動連接車道一旦執(zhí)行撤銷可能只能回退一步。操作前多保存幾個副本是正道。3. 十字路口路網(wǎng)繪制的完整實操3.1 先畫節(jié)點還是先畫邊SUMO路網(wǎng)的基本構(gòu)成單位是“節(jié)點node”和“邊edge”。一個十字路口中心是一個節(jié)點四個方向各連接一條邊。netedit允許先畫節(jié)點再連接邊也允許先畫邊再自動生成節(jié)點。我的習(xí)慣是先在十字路口中心處放置一個節(jié)點把它作為四條道路的交點。在netedit中切換到“網(wǎng)絡(luò)編輯”模式選擇節(jié)點Node工具在畫布上單擊即可創(chuàng)建節(jié)點。默認(rèn)節(jié)點會顯示為一個圓圈。中心的這個節(jié)點就是未來信號燈的掛載點也是車輛轉(zhuǎn)彎軌跡的匯聚點。以中心節(jié)點為原點在它的上、下、左、右四個方向各自再創(chuàng)建一個節(jié)點作為道路的終點。整體看上去像一個“十”字。距離不用太嚴(yán)格先大致拉開200~300米等會兒可以精確調(diào)整坐標(biāo)。3.2 創(chuàng)建雙向道路的正確姿勢有了節(jié)點下一步是把它們連成邊。選擇“邊”Edge工具從中心節(jié)點拖向四向節(jié)點就能生成一條有向邊。但SUMO默認(rèn)生成的是單向邊需要手動設(shè)置。選中一條邊在右側(cè)屬性面板找到allow和disallow同時找到spread type。對于城市道路最省事的做法創(chuàng)建完一條邊后復(fù)制一條方向相反的邊。可以用快捷鍵Ctrl Shift C復(fù)制選中的邊然后修改方向。更規(guī)范的操作方式在創(chuàng)建邊的同時按住Shift鍵netedit會自動生成雙向道路即在兩個節(jié)點之間創(chuàng)建一對方向相反的邊。很多新手不知道這個功能導(dǎo)致建出來的道路只有單方向仿真時車輛無法返程。雙向道的屬性面板里numLanes建議設(shè)為2四車道雙向總共4條車道speed設(shè)為50表示50km/hSUMO默認(rèn)單位是km/h。priority字段后面再細說先保持默認(rèn)。3.3 車道數(shù)量和方向?qū)傩缘募毠?jié)處理SUMO的車道屬性中allow很重要。默認(rèn)情況下車道允許所有車型通行。但我們做十字路口時往往需要區(qū)分直行、左轉(zhuǎn)、右轉(zhuǎn)專用道。在netedit中選中某條具體的車道注意是車道不是邊屬性面板里會有allow、disallow、width、speed等選項。width默認(rèn)是3.2米這個數(shù)值是SUMO根據(jù)典型城市道路自動生成的。如果做的是窄巷子改成2.8米如果是寬闊的主干道改到3.5米。這里有一個容易忽略的點車道寬度不僅影響視覺效果還影響車輛變道時的橫向間隙計算。車道太窄標(biāo)準(zhǔn)小客車模型也能勉強通過但仿真的變道行為會變得很激進。十字路口進口道的車道方向?qū)傩孕枰謩咏o每條車道設(shè)置轉(zhuǎn)向信息。SUMO中車道方向?qū)傩詔urn并不是直接在車道屬性里打勾而是通過“連接”來隱式定義。也就是說你需要先建好節(jié)點和邊再通過“創(chuàng)建連接”來告訴SUMO哪條車道可以直行、左轉(zhuǎn)、右轉(zhuǎn)。3.4 建立車道連接十字路口最關(guān)鍵的一步車道連接Connection定義的是“進口道某條具體車道 - 出口道某條具體車道”的映射關(guān)系。沒有連接SUMO會自動生成一些默認(rèn)連接但默認(rèn)邏輯很簡單——只允許最右側(cè)車道右轉(zhuǎn)其他車道直行左轉(zhuǎn)往往缺失。這遠遠不夠。在netedit中選中“連接”Connection模式選中進口道的某條車道這時出口道所有車道會高亮顯示為可選狀態(tài)。再點擊對應(yīng)的出口車道就建立了一條連接。依次處理最左側(cè)車道左轉(zhuǎn)連接通常是到對向出口道的最左側(cè)車道中間車道直行連接到對向出口道的中間車道最右側(cè)車道直行右轉(zhuǎn)連接直接右轉(zhuǎn)到垂直方向出口道的最右側(cè)車道連接建立后路口的沖突區(qū)域Conflict Area會在畫布上以灰色網(wǎng)格顯示SUMO會自動計算沖突點并標(biāo)記。如果某個連接和另一個連接沖突netedit會用紅色叉號提示。這個功能非常強大相當(dāng)于實時檢查路權(quán)的合法性。3.5 節(jié)點幾何形狀與轉(zhuǎn)向軌跡檢查SUMO的節(jié)點邊界Geometry決定了車輛駛過路口時的實際路徑。默認(rèn)情況下SUMO會根據(jù)道路夾角自動生成轉(zhuǎn)彎曲線。但如果你發(fā)現(xiàn)仿真時左轉(zhuǎn)車流在路口中央“漂移”或者轉(zhuǎn)了個特別生硬的大彎說明節(jié)點的幾何形狀設(shè)置不合理。選中中心節(jié)點屬性面板里有shape和radius等參數(shù)。radius是轉(zhuǎn)彎半徑默認(rèn)值較小適合普通城市路口。如果做的是大型環(huán)形交叉口或者寬路口需要手動調(diào)大半徑。實時檢查方法很簡單在netedit中把視角縮小按住Shift鍵拖出一條軌跡觀察車輛的既定路徑是否連續(xù)。這一步雖然不起眼但直接影響仿真是否能在后續(xù)正常跑起來。4. 信號燈設(shè)置與車道優(yōu)先級控制4.1 信號燈本質(zhì)上是程序化的“階段表”十字路口必須配信號燈否則車流會全部卡在沖突點。SUMO中的信號燈Traffic Light不是在路口畫一個燈就行了它的核心是一個“程序”Program程序里包含若干階段Phase每個階段定義了哪些信號燈組為綠、哪些為紅、持續(xù)多長時間。在netedit中選中中心節(jié)點右側(cè)屬性面板找到Type將其從priority改為traffic_light。此時節(jié)點會變?yōu)樾盘枱艨刂坡房谕瑫r默認(rèn)生成一個包含三相位Phase的信號燈程序Phase 1東西向綠燈南北向紅燈持續(xù)時間默認(rèn)31秒Phase 2黃燈過渡默認(rèn)4秒Phase 3南北向綠燈東西向紅燈持續(xù)時間默認(rèn)31秒Phase 4黃燈過渡默認(rèn)4秒注意這個默認(rèn)程序沒有考慮左轉(zhuǎn)專用相位。如果你的路口有左轉(zhuǎn)專用車道且流量較大建議改成四相位或八相位即東西直行、東西左轉(zhuǎn)、南北直行、南北左轉(zhuǎn)每個方向之間用黃燈隔開。4.2 相位時間設(shè)置的參數(shù)邏輯為什么默認(rèn)綠燈時間是31秒黃燈是4秒這里涉及一個簡單的車輛啟動波模型。假設(shè)飽和流率是1800輛/小時/車道也就是每2秒通過一輛車。綠燈31秒意味著最多能放行約15輛車黃燈4秒則考慮了車輛在路口制動所需的清空時間通常按3~5秒設(shè)置。如果路口流量更大就需要增加綠燈時間但也要權(quán)衡對向車流的等待時間。SUMO本身不關(guān)心這個它只是機械執(zhí)行你給的時間表。真正研究信號配優(yōu)時會用TraCI或SUMO自帶的flowRouter等工具來動態(tài)優(yōu)化而不是在netedit里拍腦袋。在netedit里修改相位時間很簡單選中信號燈節(jié)點在屬性面板的Program選項卡里直接編輯Duration數(shù)值。想要增加相位可以右鍵點擊相位列表選擇Add Phase。每個相位要保證至少有一個方向的綠燈否則可能出現(xiàn)“全紅”的無效狀態(tài)。4.3 車道優(yōu)先級和讓行規(guī)則怎么設(shè)置不是所有路口都有信號燈。在很多次干道/支路交叉口用的不是信號燈而是“讓行規(guī)則”Right of Way。SUMO里用priority字段來控制。在netedit中選中一條邊屬性面板里的priority數(shù)值越大優(yōu)先級越高。優(yōu)先級高的道路上的車輛可以不停車直接通過路口優(yōu)先級低的道路上的車輛則需要等待沖突區(qū)域清空后才進入。這相當(dāng)于現(xiàn)實中“主干道先行、支路讓行”的規(guī)則。默認(rèn)情況下新建的所有邊優(yōu)先級都是-1意味著所有方向平等SUMO在這種情況下會采用“先到先得”的邏輯容易在路口產(chǎn)生死鎖。所以千萬記得把主干道邊的priority改為兩位數(shù)比如10支路保留-1或設(shè)為0。避坑指南如果做完信號燈后發(fā)現(xiàn)仿真中還是出現(xiàn)叉口沖突99%是因為節(jié)點的Type還是priority而不是traffic_light。netedit只有在節(jié)點類型為traffic_light時才會執(zhí)行信號燈程序。5. 常見問題排查與仿真驗證實錄5.1 路網(wǎng)驗證netedit自帶的檢查功能完成路網(wǎng)繪制后首先要做的不是直接跑仿真而是讓netedit自帶的檢查器掃一遍。打開Processing - Check Network它會列出所有問題包括無出口的邊dead-end無連接的車道沖突區(qū)域未解決信號燈程序與相位不匹配這些問題在列表里點擊就能自動定位到對應(yīng)元素。對照錯誤信息逐一修復(fù)后再跑一次檢查直到零錯誤為止。這一步和編譯器查語法錯誤邏輯相同錯誤不清理干凈后面的仿真必炸。5.2 在SUMO-GUI中運行并觀察細節(jié)用SUMO-GUI打開生成的.net.xml加載后第一件事不是點“開始”而是先把Options - Simulation - Teleport關(guān)掉防止車輛因為路徑不可達直接被“傳送”到終點掩蓋路網(wǎng)問題。然后給四個進口道各放一些車輛最簡單的方式是用Flow工具在每條邊上定義車輛流入。把仿真時間步長設(shè)為0.1秒點擊運行仔細觀察左轉(zhuǎn)車輛是否在路口中央產(chǎn)生明顯阻塞直行車輛是否會因為車道寬度不夠而減速信號燈切換時是否存在某一瞬間所有方向都是紅燈死鎖或者都是綠燈嚴(yán)重沖突我曾遇到一個真實案例左轉(zhuǎn)車道連接到出口道的最右側(cè)車道車輛轉(zhuǎn)完后立刻橫跨三條車道變道到最左側(cè)導(dǎo)致后方直行車流直接剎停。排查后才發(fā)現(xiàn)是連接配置錯了直行車道和左轉(zhuǎn)車道的出口映射關(guān)系反了。這個問題的根源就是連接時沒有想清楚“車道匹配”邏輯在netedit操作時由于視角原因看不太出來只有跑起仿真才現(xiàn)形。5.3 常見問題速查表與解決建議現(xiàn)象可能原因解決方法車輛在路口無限等待信號燈程序無效或節(jié)點類型未設(shè)為traffic_light檢查節(jié)點類型重新生成信號燈程序左轉(zhuǎn)車輛橫穿對向車流缺少左轉(zhuǎn)專用相位添加左轉(zhuǎn)相位或設(shè)置為“允許左轉(zhuǎn)沖突”模式車輛在路口內(nèi)急剎車道寬度不足/連接曲率過小增大節(jié)點radius加寬車道仿真直接崩潰存在無法解析的路網(wǎng)拓撲運行netedit --check-network修復(fù)車道變色但沒車走邊方向設(shè)置錯誤檢查邊的方向必要時復(fù)制反向邊5.4 導(dǎo)出分享交叉口路網(wǎng)文件打包項目最終生成的文件是cross240327.net.xml通常還會附帶.rou.xml車輛需求文件和.sumocfg仿真配置文件。如果整個項目需要分發(fā)建議用ZIP打包。ZIP壓縮后文件名是cross240327.net.zip看起來像是一個單一文件但里面至少包含三個文件cross240327.net.xml # 路網(wǎng)文件 cross240327.rou.xml # 車輛流量定義 cross240327.sumocfg # 仿真入口配置收件人拿到壓縮包后直接用SUMO-GUI打開.sumocfg就能一鍵啟動仿真不需要重新建一遍路網(wǎng)。這也是為什么很多開源項目會以.zip形式發(fā)布路網(wǎng)數(shù)據(jù)——方便、完整、可復(fù)現(xiàn)。6. 進階擴展從交叉口到區(qū)域路網(wǎng)建好一個十字路口后下一個自然思路是把它擴展為一個小型路網(wǎng)。這里涉及netedit的“復(fù)制”功能選中一個交叉口及其四條邊用Ctrl C復(fù)制再Ctrl V粘貼就能快速復(fù)制出另一個交叉口再通過連接道路把它們連成一個網(wǎng)格。但要提醒一句netedit的復(fù)制粘貼只復(fù)制幾何形狀不復(fù)制信號燈程序。新節(jié)點默認(rèn)是priority類型需要手動再次設(shè)為traffic_light。如果你要大規(guī)模建網(wǎng)建議用腳本用netgenerate工具生成網(wǎng)格路網(wǎng)再手動局部調(diào)整效率遠高于純netedit。另外現(xiàn)實路網(wǎng)數(shù)據(jù)導(dǎo)入也是一個高頻需求。從OpenStreetMap導(dǎo)出區(qū)域地圖后用如下命令轉(zhuǎn)換為SUMO格式netconvert --osm-files map.osm --output-file map.net.xml這種做法的優(yōu)勢是路網(wǎng)信息完整包括車道數(shù)、限速、單行道但缺點是需要清理因為OSM數(shù)據(jù)中的非機動車道、人行道、步行區(qū)也會被轉(zhuǎn)換為SUMO路網(wǎng)導(dǎo)致路網(wǎng)過于復(fù)雜。實踐中我一般在導(dǎo)入后用netedit刪除不需要的元素再運行一次檢查。對于做深度學(xué)習(xí)的讀者交叉口建模還能和強化學(xué)習(xí)控制器結(jié)合在SUMO的節(jié)點上配置TraCI信號燈控制接口用Python腳本實時讀取路口車輛排隊長度動態(tài)調(diào)整相位時間從而優(yōu)化平均延誤。這類應(yīng)用的起點就是本文這個看似基礎(chǔ)的十字路口模型。數(shù)據(jù)結(jié)構(gòu)沒建對后面所有強化學(xué)習(xí)、流量預(yù)測都無從談起。再分享一個實用技巧如果后續(xù)要處理大量不同交叉口的批量仿真建議把路網(wǎng)XML和需求XML分開管理。.net.xml只存放路網(wǎng)結(jié)構(gòu)車輛流放.rou.xml兩者通過.sumocfg關(guān)聯(lián)。這樣當(dāng)信號燈配時方案需要反復(fù)實驗時只需修改.sumocfg或.rou.xml不必改動路網(wǎng)主體也方便版本管理。個人在跑多個配時對比實驗時都是維護一套路網(wǎng)文件、多套需求文件用腳本批量修改.sumocfg的route-files字段幾十組實驗一次跑完效率提升非常明顯。本文還有配套的精品資源點擊獲取