• 沒有找到結果。

第四章 程式模擬系統之發展

4.1 程式撰寫

在程式方面,將建立一段高速公路三車道之路段,其中內線之兩車道分別用 來當作自動控制車道及其鄰近車道。主要係以主程式main()控制模式整體的運作 流程,在使用者輸入資料完成後,進行產生路段車輛副程式,分為產生AC 車輛 A_gene()跟產生 MC 車輛 M_gene()兩種,而兩個車輛產生的方式做不同的產生控 制,以下將有較詳細的說明。

系統模擬時間採用時階(time step)的方式,由於時間為連續的,若以一秒為 單位容易造成誤差,故以此方式將系統時間改成時階的方式,至於每一時階的長 度已經變數化,本模擬程式訂為 0.1 秒,若需要變更只需在程式最前面之 TIMESLICE 的值進行變動即可。

在模擬時間內進行多個副程式:DrawRoad()副函式為繪製高速公路車道以及 事故位置;DrawVeh()為繪製在自動控制車道上移動的 AC 車輛及在一般車道上 移動的車輛,以及從自動車道變換成功之AC 車輛都會繪製;A_move()為設定在 自 動 控 制 車 道 上 的 車 輛 下 一 秒 的 移 動 , 其 間 還 會 進 行 變 換 車 道 及 搜 尋 trans_ctrl( )、trans_check( )等等之副函式;M_move()為設定在一般車道上車輛下 一秒的移動,並且會依據安全車間距副函式safe_head()做跟車行為;

在模擬時間結束後,藉由資料輸出副函式 output()來輸出模擬資料。主程式 模擬流程圖如圖4-1 所示。

圖4-1 主程式 main( )流程圖

程式中以建立資料結構 struct 分別代表所有的車輛資料,struct 分別包含了 時間、車輛種類、X 軸距離、Y 軸距離、速率、加速度、與前車車間距、與後車 車間距、三個門檻值,另外還建立有兩個指標變數(pointer),以鏈串列(link-list) 的方式來實作,分別針對兩個車道內之車輛進行串聯的動作,其優點為每輛車隨 時以指標變數指向其前車及後車,若要進行變換車道,則原本的車輛只要切斷其 前後指標,切換到鄰近車道之後,再建立起指標,車輛便可以重新排列。上述之 X 軸距離為車輛前進行駛的距離,亦可稱為縱向距離;Y 軸距離表示車輛所位於 之車道,亦可稱為橫向距離。資料型態說明如表4-1、4-2:

表4-1 程式變數說明

TOTALTIME 系統總時間(sec)

TIMESLICE 時階單位時間(sec)

TOTALSTEPS 系統總步驟

INCIDENT_X 事故地點(m)

INCIDENT 事故範圍(m)

ROADLEN 道路長度(m)

CAR_TYPE_1 “A” 車輛種類(自動車)

CAR_TYPE_2 “M” 車輛種類(手動車)

MAX_ACC 車輛最大加速度(m/s2)

MAX_DEACC 車輛最大減速度(m/s2)

MAX_SPEED 車輛最大速率(m)

PLATOON_TOTAL_TIME 車隊產生間距時間(sec)

D_MAX 最大車間距(m)

D_MIN 最小車間距(m)

D_EXT 車間距極值(m)

DEC_DX 自動車產生所保持之車時間距(sec)

TRANS_ANGLE 變換車道之轉向角(deg)

TRANS_TIME 變換車道所需時間(sec)

BUFFER_TIME 緩衝時間(sec)

SAFE 縱向安全係數

RETURN_TIME 變換回自動車道所需時間(sec) RETURN_ANGLE 變換回自動車道之轉向角(deg)

REFORM_TIME 車隊重組所需時間(sec)

transflag 變換車道顯示

translock 變換車道鎖定

STEPS 系統步驟

platoon_size 自動車隊規模大小

v0 自動車隊初始速率(m/s)

flow 鄰近車道車流量(veh/plph)

headway 產生下一台車輛間隔時間(sec)

表4-2 程式函式說明

trans_return() 變換回自動車道函式

platoon_reform() 車隊重組函式

safe_head( ) 保持安全車間距函式

collision( ) 系統碰撞偵測函式

normal( ) 常態分配函式

drawroad( ) 繪製道路函式

drawlane( ) 繪製車輛函式

output( ) 輸出結果資料函式

下列將說明各個主要函式之詳細內容:

1. Input()

主要負責資料輸入,其設定主要是放入主程式 main()中,參數修改部分包括 車隊大小設定、車隊初始速率設定、以及鄰近車道車流量。參數修改部分主要是 為了整合模擬使用者與程式可讀性之間的關係,將常用的 kph 單位轉換成 mps 單位,以及將每小時每車道之車流量轉換成程式可讀之每分鐘車流。

本研究設定三個重要參數:車隊大小設定為欲瞭解車隊的大小對變換車道的 影響,模擬的大小範圍在每個車隊2 至 10 輛之間;車隊初始速率設定為欲瞭解 車輛在不同的車速下對變換車道決策的影響,尤其事故影響下車行速率可能不 高,以及車輛在高速行駛下遇到事故的影響,故模擬初始速率的大小範圍在時速 130 km/hr 至 160 km/hr;鄰近車道車流量為欲瞭解鄰近車道車流狀況對變換車道 決策的影響,模擬範圍為每小時每車道800 輛至每小時每車道 1800 輛。

2. A_gene()

AC 車輛的產生以鏈串列(link list)來實作,鏈串列中有數個 node (車輛),每 一台車輛之間以指標連接,如果車輛需要改變車道,只要將指標指到的地方稍作 修改就可以達到變換車道的目的,而且每兩輛MC 車輛之間可以插入多輛的 AC 台車。在A_gene( )有個 headway 變數,其功能猶如車時間距(headway),我們藉 由AC 車輛需要保持的初始車隊車間距,除以初始設定的車隊初速,來計算 AC 車輛產生的車時間距,其目的就是要顯示出自動公路系統乃是以車隊的形式接近 事故地點。程式中我們以車輛要保持20 公尺的車間距(不含車長,若計算車長,

則車頭與車尾之車間距約為 16 公尺),故設定 headway 變數為 AC 車輛產生的 headway。

另外,會有個hittime()的副程式,其功能為搜尋系統時間跟 headway 一樣的 話,就會產生一輛AC 車輛,而 AC 車輛的初始設定都完全一樣。接著會對每台 車作出初始設定:如初速、車輛種類、速率、加速度,並計算這台車的三個門檻 值(d, f, b)。

3. M_gene()

MC 車輛的產生方式與 A_gene()的方式雷同,唯車輛產生的方式不是為一秒 產生一台MC 車輛,而是 headway 令它為 normal()函式所回傳之值,normal()函 式為常態分配,以鄰近車道車流產生率以每分鐘平均產生多少車,轉換成產生車 輛所需之秒數平均值,再經由常態分配來作為車時間距(headway)。假設車輛初 始流量符合卜瓦松分配 (若λ 夠大,一般是以λ≥5,則分配可以用 normal 分配 來近似),平均每分鐘釋放λ 台車,因此將 60/ λ 作為 normal 分配的平均值(mean),

變異數為1,即以 Normal(60/λ ,1)來釋放車輛。

4. DrawRoad()、DrawVeh():

此二函式為繪圖函式,並建立副函式DrawRoad( )繪製出三車道之直線,以 斜線當作已知之事故地點,而繪製車輛的部分則由DrawVeh( )副程式來執行。由 於螢幕只能容納640×480 個像數,以一個像數代表一公尺,故若要能夠在現有之 電腦設備下觀看到整個模擬的效果,則模擬之路段只能有640 公尺。但若想要表 達更長的車道長度,只要經過程式碼將比例縮放(rescale),將現有長度 640 個像 數來表示,縮放比例之後,車輛所行進的距離等都不會變,只有在螢幕顯示成圖 檔的時候會有視覺上的大小不同而已。

車輛的部分,為了區別自動車輛與手動車輛,故以顏色來區分,亮藍色為 AC 車輛,黃色則為 MC 車輛。特別一提的是,如果程式中判斷 AC 車輛可以變 換車道,則會顯示成紅色,並且執行加速或減速,在TRANS_TIME 時間到之後 就會變換至鄰近車道,但還是會顯示原來AC 車輛之亮藍色。

5. A_move()

此函式最主要為控制及計算在自動車道上行駛的車輛,自動車道上僅有 AC 車輛,故 AC 車輛在產生後便依照自己的三個門檻值(d,f,b)分別做其區域內該有 之行為,在車輛未進入車隊拆解區,則保持等速;進入車隊拆解區後,進行 safe_head()函式保持車距;進入跟車緩衝區之後,進行減速到與鄰近車道平均車 速接近,並且進行變換車道評估trans_check( )函式;最後,若進入了強制煞車區,

車輛以最大減速度煞車至停止。A_move()函式流程圖如圖 4-2 所示。

圖4-2 A_move()函式流程圖

6. M_move()

此函式最主要為控制及計算在一般車道上行駛的車輛,包括了原本行駛在一 般車道的MC 車輛,以及變換車道成功的 AC 車輛。函式中主要是計算車輛在一 般車道的跟車行為,進行 safe_head()函式,另外車輛位置與速度則由 x_car()及 v_car()兩個副函式計算及設定。為了確保跟車行為及變換車道後的安全。

7. trans_check()

此函式為控制欲變換車道之AC 車輛或 MC 車輛之變換車道前的決策。函式 中先考慮本車是否為靜止車輛,來決定本車速率;接著再計算本車最大轉向角,

若最大轉向角≥ 兩車夾角,則計算本車變換車道後位置與速率,以及期望車道後 車下一秒位置與速率;若期望車道後車位置≤ 衝突位置且兩車間距 ≥ 動態安全間 距,則本車允許變換車道。tran_check()函式流程圖如 4-3 所示。

圖4-3 trans_check()函式流程圖

8. trans_ctrl()

此函式為控制欲變換車道之AC 車輛或 MC 車輛之變換車道中的運作。控制 變換車道之車輛轉向角≥ 動態最小轉向角,且調整本車加速度至合理的加減速範 圍,以利車輛順利變換車道。trans_ctrl()函式流程圖如 4-4 所示。

圖4-4 trans_ctrl()函式流程圖 9. trans_return()

此函式控制通過事故點之AC 車輛欲變換回自動車道時之加速度,使之在變 換回自動車道的過程中,能將車速調整為預設之車隊初速。

10. platoon_reform()

此函式控制已回到自動車道之AC 車輛之加速度,使之與前車保持預設之安 全間距,進而完成車隊重組之步驟。

11. Output()

以 fprintf()將所想要之輸出資料鍵入,並於執行程式時將模擬結果輸出,輸 出方式為建立一個 excel 檔,檔案設定為唯寫方式。建立為 excel 檔主要是輸出 結果整理方便,亦可由Microsoft Office Excel 內建之繪圖功能,繪製所需之結果 關係圖。

詳細的資料型態請參照附錄A。

相關文件