# 軌跡計算設計架構與方法說明書與效能評估
## 方法說明
### Class
- Point: 用來表示軌跡點的 class,通常是一個 list
```python=
class Point():
def __init__(self, fid=-1, timestamp=-1, visibility=0, x=0, y=0, z=0, event=0, speed=0.0, color='white'):
self.fid = int(fid) # 代表是影片中的第幾個 frame
self.timestamp = float(timestamp) # 紀錄時間戳記
self.visibility = int(visibility) # 紀錄該 frame 是否看得到球
self.x = float(x) # 紀錄點的 x 座標
self.y = float(y) # 紀錄點的 y 座標
self.z = float(z) # 紀錄點的 z 座標
self.event = int(event) # 紀錄羽球事件
self.speed = float(speed) # 紀錄球速
self.color = color # 視覺化呈現時的顏色
```
### function
- denoise: 去雜訊
- 由於羽球軌跡定位容易受環境影響,將閃光點(如球場風扇)視為羽球,因此需要除雜訊方法移除誤判點。
- 由於使用情境是單段羽球軌跡,所以先移除重複出現的位置的球。再根據移除完的新軌跡,對 XY 方向(水平)做 2 次式 polyfit,及對 YZ 方向(垂直)做 8 次式 polyfit,最後將與擬合曲線較遠的點移除。
- 函式的輸入是 list of <Point>,輸出也是 list of <Point>
- 參數 `deg` 可以選擇要用幾次式去擬合,通常是 8 次為佳
```python=
def denoise(points, deg=8):
...
return points
```
- interpolate_points: 補點
- 由於羽球軌跡定位並非 100% 能抓到羽球,因此需要將缺失點補上,以利視覺化呈現。(通常在除雜訊後才使用)
- 先對 XY 方向用單純的直線內插進行補點,得到所有 X 與 Y 值。然後對 YZ 方向(垂直)做 8 次式 polyfit,找出最佳擬合曲線。根據新 Y 值去計算 Z 值為多少。
- 函式的輸入是 list of <Point>,輸出也是 list of <Point>
```python=
def interpolate_points(points):
...
return points
```
- fit_3d: 3D 軌跡平滑化
- 為了避免羽球震動或計算誤差導致軌跡出現鋸齒,需要將軌跡平滑化以利視覺化呈現。
- 針對可視的點,對 XY 方向(水平)做 4 次式 polyfit,及對 YZ 方向(垂直)做 4 次式 polyfit。並對所有點的 Y 值進行位移量的平滑化,藉由平滑化後的 Y 值與擬合曲線去回推平滑化後的 X 與 Z 值。
- 函式的輸入是 list of <Point>,輸出也是 list of <Point>
- 參數 `deg` 可以選擇要用幾次式去擬合,4 次的視覺效果最佳
```python=
def fit_3d(points, deg=4):
...
return points
```
- fit_vertical_2D_plane: 軌跡平面投影
- 根據 3D 軌跡找出垂直於地面的最適平面,並將軌跡投影至該平面。
- 由於將該平面視為垂直地面,因此只討論 XY 方向之投影,Z 值保值不變。利用點之間的距離作為 sample weight,透過線性回歸模型找出最適斜率,即可將點投影至該平面,得到軌跡的平面投影。
- 函式的輸入是 list of <Point>,輸出也是 list of <Point>,輸出的 Point.Z 值都等於 0
```python=
def fit_vertical_2D_plane(points):
...
return points
```
- fit_2d: 2D 軌跡平滑化
- 同 3D 軌跡平滑化,為了避免羽球震動或計算誤差導致軌跡出現鋸齒,需要將軌跡平滑化以利視覺化呈現。
- 藉由 8 次式 polyfit 找出最適曲線。並對 Y 方向進行位移量的平滑化,得到新的 Y 值後,回推出平滑後的 2D 曲線。
- 函式的輸入是 list of <Point>,輸出也是 list of <Point>
- 參數 `deg` 可以選擇要用幾次式去擬合,通常是 8 次為佳
- 參數 `smooth_2d_x_accel` 可以選擇要不要平滑位移量
```python=
def fit_2d(points, deg=8, smooth_2d_x_accel=True):
...
return points
```
## 效能評估
- 測試情境為使用人工增加 noise 的方法,對收集來的資料進行修改,並比較前後之差異
- origin 欄位的值表示: noise 的資料與原資料的平均距離差距
- after smooth 欄位的值表示: 將同筆 noise 資料進行去雜訊、補點平滑化後的結果與原資料的平均距離差異
- 使用三種 error 範圍的測試資料
- noise001: 平均是 0, sigma 是 0.01 的常態分佈
- noise: 平均是 0, sigma 是 0.5 的常態分佈
- noise01: 平均是 0, sigma 是 0.1 的常態分佈
>
| dataset | origin | after smooth |
| ---- | ---- | ---- |
| Model3D_noise001.csv | 0.055 | 0.0057 |
| Model3D_noise.csv | 0.099 | 0.029 |
| Model3D_noise01.csv | 0.171 | 0.0565 |
- 