任雨柔,郎誠廉
(同濟大學(xué) 電子與信息工程學(xué)院,上海 200331)
現(xiàn)代有軌電車作為一種新興的公共交通方式,具有綠色無污染,舒適性好,造價低廉等顯著優(yōu)點,近年來在中小型城市得到了迅速發(fā)展,因此對于有軌電車駕駛員的需求也迅速上升[1]。但和地鐵相比,現(xiàn)代有軌電車并非完全獨立路權(quán),其運行需要考慮社會車輛和行人等因素,運行模式比地鐵復(fù)雜,社會車輛侵入軌道的概率高,出現(xiàn)安全事故的概率也相對更高。此外,有軌電車自重大,制動距離長,發(fā)生事故后造成的后果會較為嚴(yán)重,危險指數(shù)更高,所以,對有軌電車的路口信號優(yōu)先控制模擬,以及社會車輛的行駛、行人行動的仿真顯得尤為重要。
現(xiàn)階段對有軌電車信號優(yōu)先控制策略研究較多,張其強等人以上海松江有軌電車為例,針對有延誤和無延誤兩種情況給予不同優(yōu)先控制策略[2];趙昕基于整個有軌電車信號優(yōu)先系統(tǒng)架構(gòu),從空間優(yōu)先、被動優(yōu)先、主動優(yōu)先3個方面進行研究[3];呂柯興提出有軌電車與機動車在交叉口的平衡感應(yīng)信號控制策略,以實現(xiàn)交叉口車輛通行效率最大化[4];但目前對有軌電車路口行駛及有軌電車駕駛員培訓(xùn)系統(tǒng)研究較少,本文模擬路口車輛和有軌電車的行駛,以及行人的行走,在此基礎(chǔ)上,著重添加了路口雨雪霧等天氣因素,這些特殊天氣變化會影響司機視線,通過對不同環(huán)境的模擬可以更加真實有效地模擬路口場景。
本文以南京有軌電車麒麟線路中某一十字路口為例,通過3ds Max建模軟件對有軌電車周邊運行環(huán)境以及社會車輛、行人、交通信號燈等進行三維建模[5],基于Unity3D平臺,設(shè)計有軌電車在路口的兩種運行模式:(1)正常情況下車輛的自動行駛、行人自動尋路,按信號燈過馬路;(2)非正常情況下的路口模擬,包括設(shè)置路口信號燈故障[6]、車輛不遵守交通規(guī)則行駛、行人闖紅燈等突發(fā)情況。
通過仿真路口不同環(huán)境和各類突發(fā)狀況,可以讓有軌電車司機提前熟悉路口場景運行特點和有軌電車信號控制策略[7],培養(yǎng)駕駛員分析判斷與準(zhǔn)確處理故障的能力,使其提高駕駛有軌電車時的自身安全性[8],同時,降低對社會車流的影響,規(guī)避相應(yīng)的道路風(fēng)險。
為了便于研究,本文采用四相位模型,同一方向的直行與右轉(zhuǎn)處于同一相位[9],如圖1所示。信號燈仿真如圖2所示,信號燈的亮滅及黃燈的閃爍效果通過控制物體的MeshRenderer組件來實現(xiàn),在燈罩上添加shake腳本,創(chuàng)建一個變量shaketime用來接收時間的變化值,MeshRenderer.enabled=true,MeshRenderer.enabled=false,交替變化。
圖2 紅綠燈模型
信號燈倒計時:本文設(shè)置綠燈30 s,紅燈55 s,黃燈5 s,總時長90 s,運用Unity3D中UI控件text文本在屏幕中顯示倒計時,采用PlayMaker插件實現(xiàn)信號燈倒計時效果,如圖3所示。PlayMaker是以狀態(tài)機state為原理的可視化編程插件,該有限元狀態(tài)機在Unity3D中應(yīng)用廣泛。
圖3 信號燈倒計時結(jié)構(gòu)
車輛的正常行駛包括直線路段行駛和轉(zhuǎn)彎路段行駛,此模塊采用設(shè)置路徑點的方式讓車輛朝路徑點行駛,實現(xiàn)汽車向前行駛,直線路段行駛較為簡單,一般設(shè)置5個路徑點。在轉(zhuǎn)彎路段,為了讓車輛看起來轉(zhuǎn)得更流暢,一般設(shè)置8個路徑點。在車輛上添加盒子碰撞體,并且通過在車輛正前方添加空物體讓其發(fā)出射線,可以有效地避開前方障礙物,實現(xiàn)自動行駛的效果。
路塊由觸發(fā)器和路徑點組成,引導(dǎo)車輛的行駛。觸發(fā)器是場景中添加盒子碰撞體組件的空物體,如圖4所示,車輛正常行駛中無法看到,勾選IsTrigger選項后就變成了觸發(fā)器,當(dāng)車輛觸發(fā)后,計數(shù)器加1,可以計算場景中車輛數(shù)目。路口路塊如圖5所示,路口添加了盒子碰撞體,在紅燈時加載,從而車輛無法通過,綠燈時卸載,車輛正常通過,實現(xiàn)路口車輛紅燈停綠燈行的效果,并且車輛行駛的對面路口始終不加載碰撞體,因此,不會出現(xiàn)車輛經(jīng)過路口后被擋在下一道路口外的情況。
圖4 路塊模型
圖5 路口路塊
所謂車輛自動生成,就是把車輛預(yù)制體在場景中進行實例化,為了在符合實際情況基礎(chǔ)上讓資源更合理分配,在C#腳本CreateCar中設(shè)置每隔10 s生成1輛車,并且在不同方向的不同車道上隨機產(chǎn)生不同類型的車輛,共有4個方向的道路,每個方向的道路上車輛有直行、左轉(zhuǎn)和右轉(zhuǎn)3個行駛方向,因此,共有12個方向可初始化生成車輛,運用Instantiate(Car,new Vector3(),new Quaternion())隨機選擇道路對車輛實例化,為了節(jié)省內(nèi)存空間,在車輛行駛到遠處時,采用Destroy(Car)自動銷毀車輛,從而釋放內(nèi)存空間。
為了讓場景更加接近現(xiàn)實,車輛模型采用了4種不同的類型,在車輛生成時隨機實例化,除車型之外結(jié)構(gòu)均一樣,其中,對于車燈光的控制,首先創(chuàng)建一個空物體,命名為Lights,用來存放汽車車燈物體,為汽車大燈添加spotlight對象,在Unity3D中,光源共分為4種:直行光源,點光源,區(qū)域光和聚光燈,文中,汽車頭燈采用聚光燈光源,如圖6所示。汽車車燈結(jié)構(gòu)如圖7所示,LightLeft和LightRight分別為左、右轉(zhuǎn)向燈,在車輛轉(zhuǎn)彎時閃爍亮起,backlight為剎車燈,在汽車剎車或者倒車時該燈亮起,并且為該物體添加C#腳本BrakeLight,實現(xiàn)正常行駛時熄滅、剎車時亮起的效果。
圖6 汽車頭燈模型
圖7 汽車車燈結(jié)構(gòu)
使車輛移動有兩種方式:(1)使用Wheel Collider對車輪進行控制,包括直行和轉(zhuǎn)向,進而控制車的移動,這種方法看起來更為逼真,但較耗費計算機內(nèi)存空間;(2)為車輛設(shè)置路徑點,如圖8所示,創(chuàng)建一個obj數(shù)組用來存放這些路徑點,并且在路徑點上設(shè)置觸發(fā)器,使用transform.LookAt和transform.Translate讓車輛不斷地朝目標(biāo)物體移動,從而達到使車輛自動行駛的效果。為節(jié)省計算機資源,本文采用第2種方式。
圖8 直線路段路徑點
汽車前面創(chuàng)建空物體LookAt用來引導(dǎo)汽車行駛和發(fā)出射線,避免與前方物體相撞,為了符合實際情況和道路規(guī)定,采用函數(shù)Physics.Raycast()發(fā)出10 m長的射線探測前方物體。當(dāng)返回有障礙物時,汽車停止前行;當(dāng)沒有檢測到行人、路口碰撞體、其他車輛等物體時,繼續(xù)行駛;當(dāng)路口遇到紅燈時,檢測到路口碰撞體將停止前行;變?yōu)榫G燈時,碰撞體卸載,從而繼續(xù)前行,達到紅燈停綠燈行的效果。
行人行走與車輛行駛不同,具有更大的隨機性,因此,添加行人自動尋路部分,使人物行走更隨機,更貼近現(xiàn)實。人物具有骨骼模型,在行走時有跨步、站立、擺臂等動作,需要在人物模型上添加Animator Controller組件,使其在行走時播放不同的動畫,更加生動逼真。
(1)進行場景的烘焙,在Navigation面板里選擇人物要移動的范圍和區(qū)域,進行烘焙,圖9為行人過馬路而烘焙的路口場景區(qū)域;(2)在人物身上添加碰撞體與剛體,使人物帶有物理屬性而不能穿物體而過,并且添加NavMeshAgent組件,設(shè)置人物的移動速度、角速度、加速度等參數(shù),讓人物可以自動尋路;(3)添加第三人稱角色控制器,在此之前創(chuàng)建一個空物體,命名為WalkTarget,讓人物在場景中跟隨這個物體移動,并且添加C#腳本RandomPosition和LookMoveTo,RandomPosition腳本讓目標(biāo)物體在XZ平面上隨機生成位置,LookMoveTo腳本讓主相機發(fā)出射線并且撞擊到地面后讓目標(biāo)物體朝這個撞擊點移動,從而實現(xiàn)人物在場景中隨機自動尋路的效果。
圖9 路口導(dǎo)航網(wǎng)格
與車輛行駛的路口路塊相同,人行橫道兩側(cè)也添加了盒子碰撞體,如圖10所示,與車輛行駛路口不同的是,人行橫道兩側(cè)都需要添加碰撞體,所以需要考慮行人進入碰撞體的角度。如果紅燈時行人是從人行橫道一側(cè)向路邊進入的這種情況,碰撞體應(yīng)該卸載,避免行人被擋在碰撞體外而無法正常走到路邊;若行人是從路邊一側(cè)走入人行橫道的情況,紅燈時碰撞體就應(yīng)該加載,從而實現(xiàn)行人按信號燈行走的效果。
圖10 人行橫道兩側(cè)碰撞體
為了使行人行走更加逼真,行人行走時需要播放動畫。行人過馬路時,若遇到紅燈,需要進行動畫切換,碰撞體加載;當(dāng)行人遇到碰撞體停止時,需要播放站立動畫,從walk動畫切換到idle狀態(tài);紅燈變綠燈時,碰撞體卸載,行人再從idle狀態(tài)切換到walk狀態(tài),給行人添加Walk狀態(tài)機,如圖11所示,并且引入布爾型變量IsTrigger,當(dāng)IsTrigger為true的時候,播放站立動畫,animator.SetBool("Istrigger", true),值為false的時候,播放行走動畫,編寫C#腳本控制該值的變化。
圖11 Walk狀態(tài)機
為了更加接近現(xiàn)實場景,在系統(tǒng)中添加天氣模塊,讓有軌電車司機可以提前熟悉雨雪天氣等惡劣環(huán)境下的路口場景,該模塊采用Unity3D自帶的Particle System實現(xiàn)。
下雪天氣相當(dāng)于由一片面積很大的云層往下掉落粒子,在場景中添加粒子系統(tǒng),模擬云層的發(fā)射口以產(chǎn)生雪天天氣效果。
在系統(tǒng)中導(dǎo)入一張白色圓形貼圖模擬雪花形狀,將Shader設(shè)置為Particles/Additive,由于雪花比較輕,下落得較慢,為了更貼近現(xiàn)實,設(shè)置Start Speed值為2~5,Start Size設(shè)置為0.3~1,使雪花飄落得更隨機,并且可以在Emission中調(diào)整噴射速率和數(shù)量,從而實現(xiàn)小雪、中雪、大雪的效果,同時由于雨雪天氣相比于晴天更灰暗,需要將場景中光線調(diào)暗,以更好地模擬場景,圖12為路口場景中下小雪的特效。
圖12 雪天場景
下雨天氣與下雪天類似,也是在場景中添加粒子系統(tǒng),模擬云層的發(fā)射口以產(chǎn)生雨天天氣效果。在系統(tǒng)中導(dǎo)入一張長方形貼圖模擬雨滴形狀,將Shader設(shè)置為Particles/Additive,由于雨滴比雪花重,為了更貼近現(xiàn)實,設(shè)置Start Speed值為5~8,同樣,可以在Emission中調(diào)整噴射速率和數(shù)量,從而實現(xiàn)小雨、中雨、大雨的效果。
與下雪天不同的是,雨滴是透明的,所以需要設(shè)置物體的透明度,圖13為雨天效果。
圖13 雨天場景
Unity3D軟件自帶有制作霧效的工具,在Renderer Setting中,可以進行有關(guān)霧參數(shù)的設(shè)置,若合理設(shè)置參數(shù),可制造出逼真的霧效,方便又高效。
一共有3種模式的霧效,分別是線型(Linear)、指數(shù)型(Exponential)和指數(shù)的平方型(Exponential Squared)。Linear模式下主要包含起始位置和終止位置兩個參數(shù),代表起霧的位置和涵蓋的距離,該模式較節(jié)省計算機內(nèi)存;Exponential和Exponential Squared兩種模式較為相似,主要參數(shù)包含Density參數(shù),通過調(diào)整參數(shù)可以設(shè)置霧的濃度,這兩種模式相比于線型模式效果更為逼真,但比較消耗計算機資源,圖14為線型模式下的霧效場景。
圖14 霧天場景
隨著有軌電車在國內(nèi)城市的快速普及,有軌電車司機的需求也快速上升,路面交通變得更為復(fù)雜,而現(xiàn)代有軌電車采用了全新的設(shè)備系統(tǒng),擁有獨立路權(quán)、半獨立路權(quán)和封閉路權(quán)3種路權(quán)形式[10-11],路權(quán)形式更為復(fù)雜,因此,有軌電車路口場景的仿真對有軌電車駕駛員培訓(xùn)具有積極意義。
本文主要研究交叉路口有軌電車與社會車輛行駛的場景模擬,重點介紹了車輛行駛、行人自動尋路和特殊天氣場景的仿真實現(xiàn),包括物體的自動生成與摧毀,以及行人和車輛如何避開障礙物運動等。仿真結(jié)果表明,社會車輛、有軌電車與行人均能按照交通信號燈正確行動,可以較為真實地反映有軌電車與社會車輛的路口行駛場景,給廣大司機提供了一個提前熟悉路口場景的學(xué)習(xí)平臺,具有很好的應(yīng)用價值。本文僅研究了十字路口這一種路口類型,且并未加入故障設(shè)置環(huán)節(jié),各種路口類型的仿真和險情模擬將在后續(xù)工作中開展。