ATP資料分析

報告者:王禮恩

資料分析:加速度分析的初步嘗試

報告內容

.文獻回顧

.程式碼

.分析結果

.待解決之問題

文獻回顧

標題:Analysis of Braking Behavior of Train Drivers to Dectect Unusual Driving


作者:Yoshitaka Marumo, Hitoshi Tsunashima, Takashi Kojima, Yasushi Hasegawa


發表:Journal of Mechanical Systems for Transportation and Logistics

Vol.3 issue1 (2010)

1

關鍵字:

列車駕駛、煞車行為、駕駛監測、心智負荷、安全

減速行為 - 比較方法

利用平均加(減)速度的概念。若平均加速度大於期望加速度,則列車會在指定位置前停下;反之,則會在指定位置後停下

2

a_r(t) = \frac{v(t)^2}{2(x_d-x(t))}

➔ 從加速度為0到加速度與期望加速度相同的過程(垂直線區域)

➔ 在列車減速後逐漸降低加速度的過程(垂直線其後)

➔ 此圖亦可觀察到手閘操作特性

減速行為 - 情境對比

3

➔ 在一般狀況下,駕駛在加速值超過期望加速度後配合期望加速度遞減逐步減速

➔ 在異常狀況下,駕駛在超過期望加速後一段時間才進行調整,反覆增加/減少加速度

減速行為 - 判斷方法

4

正常駕駛行為與異常駕駛行為有明確的不同,故可以在期望加速度-實際加速度圖上規範出「異常區域」。以列車的減速行為有無進入此異常區域來判斷是否為異常狀態。

滑行

減速階段1

固定減速

減速階段2

調整減速

以正常駕駛決定異常區

異常區1

調整異常

異常區2

延遲減速

繪製a-x圖

5

def posi_acce(n, start):
    fig, ax = plt.subplots()
    for a in range(n):
        date = start + a
        if date < 10:
            sheet_name = "2025-06-0" + str(date) + "_0H21工作班4124車次"
        else:
            sheet_name = "2025-06-" + str(date) + "_0H21工作班4124車次"
        worksheet = workbook[sheet_name]
        dt = []
        v = []
        x = []
        end = len(worksheet["A"]) + 1
        for b in range(7, 607):
            if 0 < worksheet['C'][b].value < 5000:
                dt1 = datetime.strptime(worksheet['B'][b].value, "%Y-%m-%d %H:%M:%S")
                dt2 = datetime.strptime(worksheet['B'][b + 1].value, "%Y-%m-%d %H:%M:%S")
                t_diff = int((dt2 - dt1).total_seconds())
                dt.append(t_diff)
                v.append(worksheet['D'][b].value * 1000 / 3600)
                x.append(worksheet['C'][b].value)
        dt.pop()
        dt = np.array(dt)
        v = np.array(v)
        x = np.array(x)
        dv = np.diff(v)
        dx = np.diff(x)
        pos = 0
        X = []
        Y = []
        print(dt)
        for c in range(len(dt)):
            if dt[c] != 0 and dx[c] != 0:
                acce = dv[c] / dt[c]
                X.append(pos)
                X.append(pos + dx[c])
                Y.append(acce)
                Y.append(acce)
                pos += dx[c]
            else:
                continue
        plt.plot(X, Y)
    plt.show()

繪製v-x圖

6

def posi_velo(n, start):
    fig, ax = plt.subplots()
    for a in range(n):
        date = start + a
        if date < 10:
            sheet_name = "2025-06-0" + str(date) + "_0H21工作班4124車次"
        else:
            sheet_name = "2025-06-" + str(date) + "_0H21工作班4124車次"
        worksheet = workbook[sheet_name]
        v = []
        x = []
        end = len(worksheet["A"]) + 1
        for b in range(7, 1000):
            if b % 100 == 7:
                print(b)
            v.append(worksheet['D'][b].value * 1000 / 3600)
            x.append(worksheet['C'][b].value)
        v = np.array(v)
        x = np.array(x)
        plt.plot(x, v)
    plt.show()

繪製ar-x圖

7

def acce_r_pos(n, start):
    fig, ax = plt.subplots()
    for a in range(n):
        date = start + a
        if date < 10:
            sheet_name = "2025-06-0" + str(date) + "_0H21工作班4124車次"
        else:
            sheet_name = "2025-06-" + str(date) + "_0H21工作班4124車次"
        worksheet = workbook[sheet_name]
        x = []
        a_r = []
        end = len(worksheet["A"]) + 1
        for b in range(351, 249, -1):
            if 2350 < worksheet['C'][b].value < 2370 and worksheet['D'][b].value == 0:
                end_pos = worksheet['C'][b].value
                stop_pos = b
                break
        for b in range(150, stop_pos):
            if worksheet['D'][b].value > worksheet['D'][b + 1].value:
                x.append(worksheet['C'][b].value)
                v_r = worksheet['D'][b].value * 1000 / 3600
                x_r = worksheet['C'][b].value
                if end_pos - x_r == 0:
                    a_r.append(0)
                else:
                    a_r.append(v_r * v_r / (2 * (end_pos - x_r)))
        x = np.array(x)
        a_r = np.array(a_r)
        X = []
        Y = []
        for c in range(len(x)):
            X.append(x[c])
            Y.append(a_r[c])
        plt.plot(X, Y)
    plt.show()

繪製a-x、ar-x比較圖

8

def acce_com(start):
    fig, ax = plt.subplots()
    if start < 10:
        sheet_name = "2025-06-0" + str(start) + "_0H21工作班4124車次"
    else:
        sheet_name = "2025-06-" + str(start) + "_0H21工作班4124車次"
    worksheet = workbook[sheet_name]
    dt = []
    v = []
    x = []
    a_r = []
    end = len(worksheet["A"]) + 1
    for b in range(351, 249, -1):
        if 2350 < worksheet['C'][b].value < 2370 and worksheet['D'][b].value == 0:
            end_pos = worksheet['C'][b].value
            stop_pos = b
            break
    pos_indexed = False        
    for b in range(150, stop_pos):
        if worksheet['D'][b].value > worksheet['D'][b + 1].value:
            dt1 = datetime.strptime(worksheet['B'][b].value, "%Y-%m-%d %H:%M:%S")
            dt2 = datetime.strptime(worksheet['B'][b + 1].value, "%Y-%m-%d %H:%M:%S")
            if not pos_indexed:
                pos = worksheet['C'][b].value
                pos_indexed = True
            t_diff = int((dt2 - dt1).total_seconds())
            dt.append(t_diff)
            v.append(worksheet['D'][b].value * 1000 / 3600)
            x.append(worksheet['C'][b].value)
            v_r = worksheet['D'][b].value * 1000 / 3600
            x_r = worksheet['C'][b].value
            if end_pos - x_r == 0:
                a_r.append(0)
            else:
                a_r.append(v_r * v_r / (2 * (end_pos - x_r)))
    dt.pop()
    dt = np.array(dt)
    v = np.array(v)
    x = np.array(x)
    a_r = np.array(a_r)
    dv = np.diff(v)
    dx = np.diff(x)
    X1 = []
    X2 = []
    Y1 = []
    Y2 = []
    print(dt)
    for c in range(len(dt)):
        if dt[c] != 0 and dx[c] != 0:
            acce = - dv[c] / dt[c]
            X1.append(pos)
            X1.append(pos + dx[c])
            Y1.append(acce)
            Y1.append(acce)
            pos += dx[c]
        else:
            continue
        X2.append(x[c])
        Y2.append(a_r[c])
    plt.plot(X1, Y1)
    plt.plot(X2, Y2)
    plt.show()

繪製a-ar圖

9

def acce_fig(n, start):
    fig, ax = plt.subplots()
    for a in range(n):
        date = start + a
        if date < 10:
            sheet_name = "2025-06-0" + str(date) + "_0H21工作班4124車次"
        else:
            sheet_name = "2025-06-" + str(date) + "_0H21工作班4124車次"
        worksheet = workbook[sheet_name]
        dt = []
        v = []
        x = []
        a_r = []
        end = len(worksheet["A"]) + 1
        for b in range(351, 249, -1):
            if 2350 < worksheet['C'][b].value < 2370 and worksheet['D'][b].value == 0:
                end_pos = worksheet['C'][b].value
                stop_pos = b
                break
        for b in range(150, stop_pos):
            if worksheet['D'][b].value > worksheet['D'][b + 1].value:
                dt1 = datetime.strptime(worksheet['B'][b].value, "%Y-%m-%d %H:%M:%S")
                dt2 = datetime.strptime(worksheet['B'][b + 1].value, "%Y-%m-%d %H:%M:%S")
                t_diff = int((dt2 - dt1).total_seconds())
                dt.append(t_diff)
                v.append(worksheet['D'][b].value * 1000 / 3600)
                x.append(worksheet['C'][b].value)
                v_r = worksheet['D'][b].value * 1000 / 3600
                x_r = worksheet['C'][b].value
                if end_pos - x_r == 0:
                    a_r.append(0)
                else:
                    a_r.append(v_r * v_r / (2 * (end_pos - x_r)))
        dt.pop()
        dt = np.array(dt)
        v = np.array(v)
        x = np.array(x)
        a_r = np.array(a_r)
        dv = np.diff(v)
        dx = np.diff(x)
        pos = 0
        X = []
        Y = []
        print(dt)
        for c in range(len(dt)):
            if dt[c] != 0 and dx[c] != 0:
                acce = - (dv[c] / dt[c])
                X.append(a_r[c])
                Y.append(acce)
                pos += dx[c]
            else:
                continue
        plt.plot(X, Y)
    plt.show()

a-x圖成果

10

以6月份0H21工作班4124車次為例進行分析

以6月1日至5日多車次

位置:0~5000

以6月1日單車次

位置:0~10000

v-x圖成果

11

以6月份0H21工作班4124車次為例進行分析

以6月1日至5日多車次

位置:0~10000

ATP數據分析工具之成果

ar-x圖成果

12

以6月份0H21工作班4124車次為例進行分析

以6月1日至5日多車次

第一次停車

a-x、ar-x比較圖成果

13

6月1日

6月2日

6月3日

6月4日

6月5日

a-ar圖成果

14

以6月1至5日0H21工作班4124車次為例,右為1日(上)及4日(下)成果

a-ar圖成果

15

捕捉到與文獻類似之圖樣

將數據處理及程式碼加以修正調整,追求更好成果

待解決之問題

關於ATP封包數據:

儘管資料齊全,但ATP時間資料最小單位為秒,加上時間間隔不連續,導致加速度計算易有誤差。此事可從兩方面著手:(1)詢問台鐵是否能提供加速度相關資料 (2)修正數據分析程式,根本解決問題

 

數據量龐大,產圖速度慢:

目前所撰寫之程式儘管已具備產圖能力,但運作起來十分費時;可能原因有二:(1)數據量龐大所致,需找方法聰明處理 (2)計算量龐大,適當切分封包數據。另外,學長所建之ATP分析程式可以在短時間內處理大量資料,故亦可向他請教作法以增進效率

16

感謝聆聽

10/17 ATP資料分析

By spacezpr

10/17 ATP資料分析

  • 24