任雨柔,郎誠廉
(同濟大學 電子與信息工程學院,上海 200331)
現代有軌電車作為一種新興的公共交通方式,具有綠色無污染,舒適性好,造價低廉等顯著優點,近年來在中小型城市得到了迅速發展,因此對于有軌電車駕駛員的需求也迅速上升[1]。但和地鐵相比,現代有軌電車并非完全獨立路權,其運行需要考慮社會車輛和行人等因素,運行模式比地鐵復雜,社會車輛侵入軌道的概率高,出現安全事故的概率也相對更高。此外,有軌電車自重大,制動距離長,發生事故后造成的后果會較為嚴重,危險指數更高,所以,對有軌電車的路口信號優先控制模擬,以及社會車輛的行駛、行人行動的仿真顯得尤為重要。
現階段對有軌電車信號優先控制策略研究較多,張其強等人以上海松江有軌電車為例,針對有延誤和無延誤兩種情況給予不同優先控制策略[2];趙昕基于整個有軌電車信號優先系統架構,從空間優先、被動優先、主動優先3個方面進行研究[3];呂柯興提出有軌電車與機動車在交叉口的平衡感應信號控制策略,以實現交叉口車輛通行效率最大化[4];但目前對有軌電車路口行駛及有軌電車駕駛員培訓系統研究較少,本文模擬路口車輛和有軌電車的行駛,以及行人的行走,在此基礎上,著重添加了路口雨雪霧等天氣因素,這些特殊天氣變化會影響司機視線,通過對不同環境的模擬可以更加真實有效地模擬路口場景。
本文以南京有軌電車麒麟線路中某一十字路口為例,通過3ds Max建模軟件對有軌電車周邊運行環境以及社會車輛、行人、交通信號燈等進行三維建模[5],基于Unity3D平臺,設計有軌電車在路口的兩種運行模式:(1)正常情況下車輛的自動行駛、行人自動尋路,按信號燈過馬路;(2)非正常情況下的路口模擬,包括設置路口信號燈故障[6]、車輛不遵守交通規則行駛、行人闖紅燈等突發情況。
通過仿真路口不同環境和各類突發狀況,可以讓有軌電車司機提前熟悉路口場景運行特點和有軌電車信號控制策略[7],培養駕駛員分析判斷與準確處理故障的能力,使其提高駕駛有軌電車時的自身安全性[8],同時,降低對社會車流的影響,規避相應的道路風險。
為了便于研究,本文采用四相位模型,同一方向的直行與右轉處于同一相位[9],如圖1所示。信號燈仿真如圖2所示,信號燈的亮滅及黃燈的閃爍效果通過控制物體的MeshRenderer組件來實現,在燈罩上添加shake腳本,創建一個變量shaketime用來接收時間的變化值,MeshRenderer.enabled=true,MeshRenderer.enabled=false,交替變化。

圖2 紅綠燈模型
信號燈倒計時:本文設置綠燈30 s,紅燈55 s,黃燈5 s,總時長90 s,運用Unity3D中UI控件text文本在屏幕中顯示倒計時,采用PlayMaker插件實現信號燈倒計時效果,如圖3所示。PlayMaker是以狀態機state為原理的可視化編程插件,該有限元狀態機在Unity3D中應用廣泛。

圖3 信號燈倒計時結構
車輛的正常行駛包括直線路段行駛和轉彎路段行駛,此模塊采用設置路徑點的方式讓車輛朝路徑點行駛,實現汽車向前行駛,直線路段行駛較為簡單,一般設置5個路徑點。在轉彎路段,為了讓車輛看起來轉得更流暢,一般設置8個路徑點。在車輛上添加盒子碰撞體,并且通過在車輛正前方添加空物體讓其發出射線,可以有效地避開前方障礙物,實現自動行駛的效果。
路塊由觸發器和路徑點組成,引導車輛的行駛。觸發器是場景中添加盒子碰撞體組件的空物體,如圖4所示,車輛正常行駛中無法看到,勾選IsTrigger選項后就變成了觸發器,當車輛觸發后,計數器加1,可以計算場景中車輛數目。路口路塊如圖5所示,路口添加了盒子碰撞體,在紅燈時加載,從而車輛無法通過,綠燈時卸載,車輛正常通過,實現路口車輛紅燈停綠燈行的效果,并且車輛行駛的對面路口始終不加載碰撞體,因此,不會出現車輛經過路口后被擋在下一道路口外的情況。

圖4 路塊模型

圖5 路口路塊
所謂車輛自動生成,就是把車輛預制體在場景中進行實例化,為了在符合實際情況基礎上讓資源更合理分配,在C#腳本CreateCar中設置每隔10 s生成1輛車,并且在不同方向的不同車道上隨機產生不同類型的車輛,共有4個方向的道路,每個方向的道路上車輛有直行、左轉和右轉3個行駛方向,因此,共有12個方向可初始化生成車輛,運用Instantiate(Car,new Vector3(),new Quaternion())隨機選擇道路對車輛實例化,為了節省內存空間,在車輛行駛到遠處時,采用Destroy(Car)自動銷毀車輛,從而釋放內存空間。
為了讓場景更加接近現實,車輛模型采用了4種不同的類型,在車輛生成時隨機實例化,除車型之外結構均一樣,其中,對于車燈光的控制,首先創建一個空物體,命名為Lights,用來存放汽車車燈物體,為汽車大燈添加spotlight對象,在Unity3D中,光源共分為4種:直行光源,點光源,區域光和聚光燈,文中,汽車頭燈采用聚光燈光源,如圖6所示。汽車車燈結構如圖7所示,LightLeft和LightRight分別為左、右轉向燈,在車輛轉彎時閃爍亮起,backlight為剎車燈,在汽車剎車或者倒車時該燈亮起,并且為該物體添加C#腳本BrakeLight,實現正常行駛時熄滅、剎車時亮起的效果。

圖6 汽車頭燈模型

圖7 汽車車燈結構
使車輛移動有兩種方式:(1)使用Wheel Collider對車輪進行控制,包括直行和轉向,進而控制車的移動,這種方法看起來更為逼真,但較耗費計算機內存空間;(2)為車輛設置路徑點,如圖8所示,創建一個obj數組用來存放這些路徑點,并且在路徑點上設置觸發器,使用transform.LookAt和transform.Translate讓車輛不斷地朝目標物體移動,從而達到使車輛自動行駛的效果。為節省計算機資源,本文采用第2種方式。

圖8 直線路段路徑點
汽車前面創建空物體LookAt用來引導汽車行駛和發出射線,避免與前方物體相撞,為了符合實際情況和道路規定,采用函數Physics.Raycast()發出10 m長的射線探測前方物體。當返回有障礙物時,汽車停止前行;當沒有檢測到行人、路口碰撞體、其他車輛等物體時,繼續行駛;當路口遇到紅燈時,檢測到路口碰撞體將停止前行;變為綠燈時,碰撞體卸載,從而繼續前行,達到紅燈停綠燈行的效果。
行人行走與車輛行駛不同,具有更大的隨機性,因此,添加行人自動尋路部分,使人物行走更隨機,更貼近現實。人物具有骨骼模型,在行走時有跨步、站立、擺臂等動作,需要在人物模型上添加Animator Controller組件,使其在行走時播放不同的動畫,更加生動逼真。
(1)進行場景的烘焙,在Navigation面板里選擇人物要移動的范圍和區域,進行烘焙,圖9為行人過馬路而烘焙的路口場景區域;(2)在人物身上添加碰撞體與剛體,使人物帶有物理屬性而不能穿物體而過,并且添加NavMeshAgent組件,設置人物的移動速度、角速度、加速度等參數,讓人物可以自動尋路;(3)添加第三人稱角色控制器,在此之前創建一個空物體,命名為WalkTarget,讓人物在場景中跟隨這個物體移動,并且添加C#腳本RandomPosition和LookMoveTo,RandomPosition腳本讓目標物體在XZ平面上隨機生成位置,LookMoveTo腳本讓主相機發出射線并且撞擊到地面后讓目標物體朝這個撞擊點移動,從而實現人物在場景中隨機自動尋路的效果。

圖9 路口導航網格
與車輛行駛的路口路塊相同,人行橫道兩側也添加了盒子碰撞體,如圖10所示,與車輛行駛路口不同的是,人行橫道兩側都需要添加碰撞體,所以需要考慮行人進入碰撞體的角度。如果紅燈時行人是從人行橫道一側向路邊進入的這種情況,碰撞體應該卸載,避免行人被擋在碰撞體外而無法正常走到路邊;若行人是從路邊一側走入人行橫道的情況,紅燈時碰撞體就應該加載,從而實現行人按信號燈行走的效果。

圖10 人行橫道兩側碰撞體
為了使行人行走更加逼真,行人行走時需要播放動畫。行人過馬路時,若遇到紅燈,需要進行動畫切換,碰撞體加載;當行人遇到碰撞體停止時,需要播放站立動畫,從walk動畫切換到idle狀態;紅燈變綠燈時,碰撞體卸載,行人再從idle狀態切換到walk狀態,給行人添加Walk狀態機,如圖11所示,并且引入布爾型變量IsTrigger,當IsTrigger為true的時候,播放站立動畫,animator.SetBool("Istrigger", true),值為false的時候,播放行走動畫,編寫C#腳本控制該值的變化。

圖11 Walk狀態機
為了更加接近現實場景,在系統中添加天氣模塊,讓有軌電車司機可以提前熟悉雨雪天氣等惡劣環境下的路口場景,該模塊采用Unity3D自帶的Particle System實現。
下雪天氣相當于由一片面積很大的云層往下掉落粒子,在場景中添加粒子系統,模擬云層的發射口以產生雪天天氣效果。
在系統中導入一張白色圓形貼圖模擬雪花形狀,將Shader設置為Particles/Additive,由于雪花比較輕,下落得較慢,為了更貼近現實,設置Start Speed值為2~5,Start Size設置為0.3~1,使雪花飄落得更隨機,并且可以在Emission中調整噴射速率和數量,從而實現小雪、中雪、大雪的效果,同時由于雨雪天氣相比于晴天更灰暗,需要將場景中光線調暗,以更好地模擬場景,圖12為路口場景中下小雪的特效。

圖12 雪天場景
下雨天氣與下雪天類似,也是在場景中添加粒子系統,模擬云層的發射口以產生雨天天氣效果。在系統中導入一張長方形貼圖模擬雨滴形狀,將Shader設置為Particles/Additive,由于雨滴比雪花重,為了更貼近現實,設置Start Speed值為5~8,同樣,可以在Emission中調整噴射速率和數量,從而實現小雨、中雨、大雨的效果。
與下雪天不同的是,雨滴是透明的,所以需要設置物體的透明度,圖13為雨天效果。

圖13 雨天場景
Unity3D軟件自帶有制作霧效的工具,在Renderer Setting中,可以進行有關霧參數的設置,若合理設置參數,可制造出逼真的霧效,方便又高效。
一共有3種模式的霧效,分別是線型(Linear)、指數型(Exponential)和指數的平方型(Exponential Squared)。Linear模式下主要包含起始位置和終止位置兩個參數,代表起霧的位置和涵蓋的距離,該模式較節省計算機內存;Exponential和Exponential Squared兩種模式較為相似,主要參數包含Density參數,通過調整參數可以設置霧的濃度,這兩種模式相比于線型模式效果更為逼真,但比較消耗計算機資源,圖14為線型模式下的霧效場景。

圖14 霧天場景
隨著有軌電車在國內城市的快速普及,有軌電車司機的需求也快速上升,路面交通變得更為復雜,而現代有軌電車采用了全新的設備系統,擁有獨立路權、半獨立路權和封閉路權3種路權形式[10-11],路權形式更為復雜,因此,有軌電車路口場景的仿真對有軌電車駕駛員培訓具有積極意義。
本文主要研究交叉路口有軌電車與社會車輛行駛的場景模擬,重點介紹了車輛行駛、行人自動尋路和特殊天氣場景的仿真實現,包括物體的自動生成與摧毀,以及行人和車輛如何避開障礙物運動等。仿真結果表明,社會車輛、有軌電車與行人均能按照交通信號燈正確行動,可以較為真實地反映有軌電車與社會車輛的路口行駛場景,給廣大司機提供了一個提前熟悉路口場景的學習平臺,具有很好的應用價值。本文僅研究了十字路口這一種路口類型,且并未加入故障設置環節,各種路口類型的仿真和險情模擬將在后續工作中開展。