F1 Race Replay:用 Python 把 F1 遙測重播成互動賽道動畫的開源桌面工具

F1 Race Replay 是開發者 Tom Shaw 用 Python 寫的開源桌面工具,把 F1 比賽遙測重播成可暫停、倒轉與倍速的互動賽道動畫。本文從 GitHub 倉庫實際查證它的功能、九個依賴、執行指令與授權狀態,並提醒一個容易被忽略的疑點:README 宣稱 MIT 授權,倉庫裡卻沒有 LICENSE 檔案。

用 AI 摘要這篇文章:

F1 Race Replay 是英國開發者 Tom Shaw(GitHub 帳號 IAmTomShaw)用 Python 寫的開源專案,把一場 F1 比賽的遙測資料重播成可暫停、可倒轉、可倍速的互動賽道動畫。我從 GitHub 倉庫與 API 實際核實了它的功能、依賴與授權狀態。這個專案 2025 年 11 月才建立,到 2026 年 8 月已累積超過六千二百個 star、八百多個 fork,並且有三十多個未關閉的 issue,以及一百多個來自社群、等待審核的 pull request,對一個不到一年歷史的個人專案來說算是相當活躍。結論是成品相當完整、社群關注度也夠,但如果你想 fork 或拿來做商業應用,有兩個授權層面的疑點要先釐清,本文後半會把證據攤開來講。

先講它的定位:這是一個要安裝在自己電腦上跑的桌面程式,需要 Python 3.11 以上與 OpenGL 3.3 以上的顯示環境,不是打開瀏覽器就能用的網頁服務。它給你的也不是轉播畫面,而是把官方計時與遙測資料重新畫成俯視的賽道動畫,讓你從資料角度看一場比賽怎麼發展,這跟看電視重播是兩種不同的體驗。對只想看比賽畫面的車迷來說門檻偏高,對會一點指令列、想自己重播某一年某一站並研究車手資料的人來說剛好。

這套工具實際做得到什麼

根據專案 README 與我讀過的原始碼結構,F1 Race Replay 把一場比賽的遙測資料渲染成俯視的賽道畫面,每台車是一個會移動的點,並同步顯示排行榜、當前圈數與總時間。README 列出的能力包含:

F1 Race Replay 比賽重播視覺化預覽,俯視賽道上各車手位置與排行榜Pin
F1 Race Replay 把整場比賽的遙測渲染成俯視賽道動畫,並同步顯示排行榜與單圈資訊(圖源:IAmTomShaw/f1-race-replay)。
  • 賽道重播視覺化:車手位置即時呈現在渲染的賽道上,能看到超車與退賽的過程。
  • 排行榜與輪胎資訊:顯示當前名次與輪胎配方,退賽車手會標記為 OUT。
  • 單車手遙測:在排行榜上點選某位車手後,可看他的時速、檔位、DRS(減阻系統)狀態與當前圈數。
  • 完整播放控制:用鍵盤或螢幕按鈕暫停、倒轉、快轉,倍速可在 0.5x 到 4x 之間切換,也能按 R 重新開始。

播放控制比表面看到的細。README 的 Controls 段列了一份完整快捷鍵:空白鍵暫停或繼續,左右方向鍵倒轉與快轉,上下方向鍵循環切換倍速,數字鍵 1 到 4 直接指定倍速,D 切換 DRS 區域顯示,B 切換進度列,L 切換賽道上的車手名稱。想同時追蹤多位車手時,可以點選加上 Shift 加選,把幾台車擺在一起比對遙測,這對事後研究某段攻防為什麼成立還滿實用。

其中一個值得一提的是安全車(Safety Car)視覺化。當 F1 資料顯示比賽進入安全車部署狀態時,畫面上會出現一台橘色光暈的車從維修區開出來、繞行、再回去。不過 README 明白寫著,因為 F1 官方 API 不提供安全車本身的 GPS 位置,所以這台車的位置是模擬出來的,做法是把它放在領先者前方約 500 公尺處來近似。整段動畫分成三個階段:從維修區開出來的 deploying、繞行中的 on_track、以及回到維修區的 returning,每一階段的光暈與透明度變化都對應 README 裡那個 safety_car 資料結構的 phasealpha 欄位。換句話說,這部份是工具作者自己估算的視覺,不是原始資料,這點我認為是誠實的標示。

此外專案還有一個 Insights Menu 視窗,會在重播時自動開啟,讓你用 PitWallWindow 基底類別寫自己的遙測分析視窗;排位賽(Qualifying)的重播功能也在開發中。對會寫一點 Python 的人,PitWallWindow 是個實在的擴充點:你只要實作 setup_ui()on_telemetry_data() 兩個方法,連線與清理邏輯都由基底類別處理,等於作者把「接上即時遙測流」這件麻煩事包好了,你只管想呈現什麼指標。

講到這裡得提一下資料層。F1 Race Replay 自己不抓資料,真正去拿 F1 遙測的是 FastF1 這個第三方函式庫,它封裝了 F1 官方的計時與遙測 API,處理座標對齊、圈數切分這類苦差事,F1 Race Replay 再把 FastF1 吐出來的資料渲染成賽道動畫。這樣的分層說明了一件事:這個工具的能力上限,很大程度被 FastF1 能拿到的欄位綁住,例如前面提到的安全車位置缺 GPS,就是 F1 官方 API 本來就沒給,不是 FastF1 或 F1 Race Replay 的問題。

怎麼裝、怎麼跑

環境需求方面,README 明確寫的是 Python 3.11 以上,若你照著網路上一些舊教學裝 Python 3.8 很可能會踩到相容性問題,以官方 README 為準最穩當。完整依賴我從 requirements.txt 抄出來,一共九個,比你想像中多不少:

fastf1
pandas
matplotlib
numpy
arcade
pyglet
pyside6
questionary
rich

這裡面 arcade 是負責賽道渲染的 2D 遊戲與圖形函式庫,pyside6 用來做 GUI 選單,fastf1 則是真正去抓 F1 資料的那層。安裝步驟很標準:

git clone https://github.com/IAmTomShaw/f1-race-replay
cd f1-race-replay
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

執行方式有兩種。預設是圖形選單,直接打開再選年份與站次:

F1 Race Replay 圖形選單介面,可選擇年份與分站Pin
預設的圖形選單可以直接挑選要重播的年份與分站(圖源:IAmTomShaw/f1-race-replay)。
python main.py

如果你已經知道要看哪一年哪一站,可以直接帶參數跳過選單,例如重播 2025 年第 12 站:

python main.py --viewer --year 2025 --round 12

不想用視窗選單的話,加 --cli 改用指令列互動選單,一樣用方向鍵與 Enter 挑選。除了正式比賽,README 也支援排位賽與衝刺賽:加 --qualifying 看排位賽遙測(含時速、檔位、油門與煞車隨單圈距離的變化),加 --sprint 則看該站的衝刺賽或衝刺排位賽。要不要顯示 HUD 可以用 --no-hud 切換,方便你截圖做自己的分析。不過 README 也明說排位賽重播還在持續打磨,細節可能會再調。README 有個新手容易忽略的提醒:第一次跑某個分站時,程式要先把遙測下載、處理並快取到本機的 .fastf1-cache 資料夾,所以會明顯比較慢,之後再跑同一場才會變快。如果想強制重新抓資料,加上 --refresh-data 參數。另外如果你是用 conda 環境,可能會遇到 OpenGL 建立失敗的錯誤,README 給的解法是 conda install -c conda-forge libstdcxx-ng

想看進一步能不能改的人,可以對照 README 列的檔案結構。main.py 是入口,負責載入比賽資料與啟動重播;src/f1_data.py 處理遙測載入、逐格資料生成與安全車位置模擬;src/arcade_replay.py 是視覺與互動邏輯;src/lib/tyres.py 定義輪胎資料型別。想換賽道寬度、配色或版面,作者建議直接動 arcade_replay.py;想調資料處理則動 f1_data.py。也就是說,多數能客製的地方都集中在這兩支檔案,門檻不算高。如果你平常就愛玩這類可自己改的開源桌面工具,我們之前聊過的 Craft 開源 AI 程式設計助手 是另一種以擴充性為主的例子,取向不同但同樣把「留給使用者改的空間」當成一回事。

想要 fork 或商用,先看這兩個授權疑點

這個專案在技術上很完整,但授權狀態有兩個落差,會直接影響你能不能安心改作或拿來做商業用途。

第一個是 LICENSE 檔案根本不存在。README 文末寫了一句「This project is licensed under the MIT License」,但倉庫裡實際找不到 LICENSE 檔案,我用 GitHub API 核對授權欄位,結果也是空的。也就是說,README 宣稱是 MIT 授權,但倉庫裡沒有對應的授權條款檔案。

這個落差比看起來嚴重。GitHub 自己的官方指引就講得很白:沒有授權條款檔的倉庫,適用的是該國著作權法的預設規則,也就是作者保留一切權利,別人原則上沒有重製、改作或再散佈的法律權限。換句話說,README 寫 MIT 是作者的意思表示,但少了 LICENSE 檔這份正式條款,這個授權在法律上是有縫隙的。對單純自己跑來看的人影響不大,但如果你想 fork 一份來改、甚至包進商業產品,光靠 README 那一句話站不穩。比較保險的做法是先去 issue 區或作者的 個人網站 跟他確認,請他補上 LICENSE 檔。作者自己在 roadmap.md 也提到這是他第一個接受外界貢獻的開源專案,授權流程沒走完整其實不意外,而這也正是值得在 issue 禮貌反映的點。

第二個是資料來源的限制。F1 Race Replay 的遙測是透過前面提到的 FastF1 函式庫去抓 F1 官方計時 API,而 Formula 1 相關商標與賽事資料的權利屬於官方。專案 README 自己就附了一段免責聲明,說資料來自公開 API、僅供教育與非商業用途。這代表即使授權檔的問題解決了,商業用途還會再撞到 F1 的資料與商標條款,這條限制是資料本身帶來的,不是工具作者能解除的。

如果你對「怎麼在茫茫 GitHub 海裡挑到這種高關注度專案」有興趣,可以看看我們整理的 GitHub 專案 AI 推薦工具;想把這類即時資料做成可互動的儀表板,OSINT 即時情勢監控儀表板 是另一種取向的例子。

已知會卡的地方

README 的 Known Issues 老實列了幾個限制,我挑兩個跟使用體驗最相關的:

排行榜在開賽最初幾個彎會不準,某台車進站時也會暫時受到影響,比賽尾聲則可能因為最後位置的座標算得比別人前面而出現誤差。原因是遙測座標本身有誤差,作者說這部份會分階段改善,因為牽涉的計算相當複雜。所以如果你要拿排行榜畫面做事後檢討或截圖佐證,記得這個工具的官方定位本來就點出了這些誤差,不要把它當成百分百精準的官方成績。

另一個是渲染效能與硬體需求。roadmap.md 提到隨著功能增加,UI 元素在某些裝置上開始造成可察覺的延遲,作者正在優化,所以低階顯示環境下的流暢度目前是已知待改善的項目。更重要的是 arcade 這個繪圖函式庫需要 OpenGL 3.3 以上的環境,這代表你想把 F1 Race Replay 丟到一台沒有顯示器的雲端主機或遠端伺服器跑,會直接卡在無法建立 OpenGL context 這一步,它本來就是設計給有桌面環境的本機電腦用的。如果你平常是在 Mac 或 Windows 筆電上做事,這個限制幾乎無感;但若你打算在 Linux 伺服器或容器裡跑,得先確認有沒有對應的 OpenGL 支援,別白花一輪安裝時間。

值不值得裝

回到開頭的結論。如果你是會用指令列、本機有 Python 3.11 與 OpenGL 環境的 F1 車迷或資料愛好者,F1 Race Replay 是目前把「重新看一場比賽怎麼跑」這件事做得最完整的一次開源嘗試。六千多個 star 與八百多個 fork 也說明社群確實在用它,加上作者把 telemetry 串流、Insights Menu 與排位賽重播都排進 roadmap,這個專案還在往前走,值得 clone 下來試一場你印象最深的分站,再用 PitWallWindow 寫一個自己想看的遙測視窗。

如果你的目的是商業改作或重新散佈,那建議先停下來做兩件事:跟作者確認並補齊 LICENSE 檔,同時評估你對 F1 官方資料的使用方式有沒有落在官方條款允許的範圍內。這兩關過了,再談後續應用會穩妥很多。對只是想在賽後重新回味一場精采攻防、或拿來研究某台車為什麼快的一般使用者,這兩個授權疑點幾乎不影響你今天就能裝來玩。

Sliven 褚崇名
Sliven 褚崇名

每日分享科技新知、免費資源以及 WordPress、虛擬主機相關主題,任何問題歡迎在科技月球下方留言,或是發送 Email 至 [email protected] 與我聯繫。

文章: 828

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


Share to...