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

➔ 從加速度為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