最近、F1を見ててふと思ったんだよね。もしドライバーのミスが一切なくて、マシンが常に物理的な限界ギリギリで走れたら、一体どれくらいのタイムが出るんだろうって。なんていうか、「理論上の最速ラップ」みたいなもの?
まあ、そんなことを考えてたら、Pythonでそれに近いことができる面白いプロジェクトを見つけたんだ。現実のF1のテレメトリデータを使って、物理モデルに基づいて「完璧なゴーストラップ」をシミュレーションして、アニメーションまで作っちゃうっていう…。正直、すごく興味をそそられたから、自分なりに噛み砕いてみようと思う。
TL;DR
要するに、PythonのFastF1っていうライブラリで本物のF1の走行データを引っこ抜いてきて、そこに簡略化した車の物理モデルを当てはめて計算すると、理論上可能な最速ラップタイムが導き出せる、って話。そして、その結果と現実のラップを並べてアニメーションにすると、色々見えてきて面白いんだ。
まず、本物のデータがないと始まらないよね
シミュレーションって言っても、完全にゼロから世界を作るわけじゃない。大事なのは、現実のデータという「土台」。
このプロジェクトで使ってるのは、`FastF1`っていう便利なPythonライブラリ。これを使うと、F1の公式アーカイブにアクセスして、好きなレースの好きなセッションのデータをかなり詳細に取得できる。すごい時代だよね…。
コードの中では、`CircuitData`っていうクラスがその役目を担ってる。やってることは、だいたいこんな感じ。
- セッションデータの読み込み: 例えば「2025年のスペインGP、決勝」みたいに指定すると、そのレース全体のデータをがさっと持ってくる。
- 最速ラップの特定: データの中から、一番速かったラップを見つけ出す。誰が、何分何秒で走ったか、とかね。
- テレメトリデータの抽出: そして、ここが肝心。その最速ラップ中のマシンの状態を、コンマ数秒単位で記録したデータを抜き出す。具体的には、速度、スロットル開度、ブレーキ、ギア、そしてコース上のX,Y座標(つまり、どこを走っていたか)とか。これがシミュレーションの基礎になる。
正直、このデータを眺めてるだけでも結構楽しい。ドライバーがどのコーナーでどれくらいアクセルを抜いて、どこで全開にしてるか、全部丸見えだから。
次に、主役の「F1マシン」をデジタルで再現する
データが手に入ったら、次はシミュレーションの主役であるF1マシンを、コード上で「モデル化」する必要がある。まあ、本物のF1マシンみたいに何百万もの部品を再現するのは無理だから、大事な物理特性だけを抜き出した簡略版を作るんだ。
`VehicleModel`っていうクラスがそれ。中身はこんなパラメータで構成されてる。
- 質量: 798kg(ドライバー込み)
- 最大パワー: 約1000馬力
- ダウンフォースと空気抵抗の係数: 車が速くなるほど地面に押し付けられる力と、空気の壁。
- タイヤの摩擦係数: タイヤが路面を掴む力。これがグリップの源。
- 最大ブレーキ力: どれだけ強く止まれるか。
これらの数字を使えば、「この半径のコーナーを曲がれる最高速度」とか、「この速度からどれくらいの加速度で加速できるか」みたいな、マシンの性能限界を計算できるようになる。うーん、物理って感じだね。
コースを細切れにして、最強の走り方を計算する
データとマシンの準備ができたら、いよいよ最適化。つまり、「どう走れば一番速いか」を計算する段階に入る。
やり方が面白いんだ。まず、サーキット全体を、例えば10メートルごととかの短いセグメントに分割する(これを「離散化」って言うらしい)。そして、各セグメントが直線なのかコーナーなのかを判定していく。
で、ここからが本番の`LapTimeOptimizer`の仕事。古典的だけど強力な「2パス積分」っていう手法を使う。
- フォワードパス(順方向計算): スタートラインから始めて、各コーナーの限界速度を守りつつ、直線でひたすら最大加速した場合の速度を計算していく。
- バックワードパス(逆方向計算): 今度はゴールラインから逆向きに計算する。各コーナーに限界速度で進入するために、「遅くとも、どこからブレーキを始めなきゃいけないか」を割り出していく。
最終的に、ある地点での「最適な速度」っていうのは、この順方向計算で出た速度と、逆方向計算で出た速度の、どっちか「低い方」になる。これで、F1のテレメトリでよく見る、ギザギザのスピードグラフが出来上がるわけだ。長い直線で加速して、コーナー手前で急減速する、あのパターン。
この最適化された速度で各セグメントを走る時間を全部足し合わせれば、理論上の最速ラップタイムが算出できるってわけ。
ケーススタディ:2025年スペインGPでやってみたら…
元の記事では、このシミュレーターを2025年のスペインGPのデータで走らせてた。ちなみに、これは未来のデータじゃなくて、`fastf1`ライブラリが将来のイベントも仮定して使えるようになってるからだと思う。面白いね。
で、結果が興味深かった。
- 現実の最速ラップ(O. ピアストリ選手): 75.743秒
- シミュレーション上の最適ラップ: 69.563秒
…なんと、シミュレーションの方が現実より約6.2秒も速い。マジか。精度91.8%って言ってるけど、この差はどこから来るんだろう?
この「差」こそが、このシミュレーションの一番面白いところだと思う。これを比較するために、ちょっと表にまとめてみた。
現実のラップ vs. シミュレーションのラップ 比較表
| 比較項目 | 現実のラップ (Real Lap) | シミュレーションのラップ (Simulated Lap) |
|---|---|---|
| ドライバー | 一人の人間、ピアストリ選手。もちろん超一流だけど、コンマ数秒の判断のブレや癖はあるはず。 | 完璧で冷徹なAI。ミス?なにそれ?って感じ。常に100%の最適解を実行する。 |
| タイヤの状態 | 1周走るだけでも、タイヤは確実に摩耗してグリップが落ちていく。特にスペインはタイヤに厳しいし…。 | まるでゲーム。タイヤは全く劣化しない。常に最高のグリップを発揮する新品タイヤが無限に続く世界線。 |
| 走行ライン | 他のマシンとの駆け引きもあるし、路面の汚れや風の影響も受ける。必ずしも理想のラインだけを走れるわけじゃない。 | コースは完全貸し切り状態。計算で導き出されたレコードラインを、1ミリも違わずトレースできる。 |
| 燃料 | レースが進むにつれて燃料が減って車は軽くなる。でも、この1周ではまだ重い状態だったかも。 | 燃料の重さの変化は、このシンプルなモデルでは多分考慮されてない。常に一番軽い状態で走ってるようなもの。 |
| 環境要因 | その日の気温、路面温度、風向き…。全部がラップタイムに影響する。 | 無風、快晴、気温20度みたいな、シミュレーションにとっての「完璧な一日」。外部からの邪魔は一切なし。 |
この「完璧なラップ」から何がわかるのか?
こうして見ると、シミュレーションが現実より6秒も速いのは、当然だよね。シミュレーションは「もし全ての条件が完璧で、物理法則の限界だけで走ったら」という理想郷を描いているから。
でも、これってすごく意味があると思う。エンジニアは、この「理論上の最速」と「現実のラップ」の差を分析することで、「マシンのポテンシャルのうち、どれだけ引き出せていないか」を評価できる。
例えば、あるコーナーでシミュレーションと現実の速度差が特に大きい場合、それは「マシンの空力が不安定でドライバーが踏み切れていない」のかもしれないし、「そのコーナーだけタイヤの摩耗が激しい」のかもしれない。そういう仮説を立てるための、強力な基準になるんだ。
あと、スペインのバルセロナ・カタルーニャ・サーキットはまだ素直な方だけど、これを日本の鈴鹿サーキットみたいな複雑なコースでやったら、もっと面白い結果になりそう。特にS字区間とか130Rとか…どういう計算結果になるのか見てみたいな。FIAのデータもすごいけど、例えばJAF(日本自動車連盟)が出してる国内レースのデータとかで試してみるのも、また違った発見があるかもしれない。
結局、これは「完璧」への探求なんだと思う
まあ、色々見てきたけど、このプロジェクトは単に「F1のカッコいいアニメーションを作る」ってだけじゃない。現実のデータと物理モデルを組み合わせて、「マシンの真の限界」を探るっていう、モータースポーツ工学の核心に触れる試みなんだな、と。
ドライバーの腕前はもちろんだけど、現代のF1は、こういうデータ分析とアルゴリズムの戦いでもあるんだなって、改めて感じた。うん、なかなか奥が深い。
こういうの見てると、自分でも色々試したくなるよね。
あなたなら、どうする?
もしこのシミュレーションに、もう一つだけ現実の要素を付け加えられるとしたら、何を追加しますか? 例えば「タイヤの摩耗」「天候の変化」「燃料の重さ」とか…。あなたが一番重要だと思う要素と、その理由をぜひコメントで教えてください。
