開発ブログ

TTC(衝突余裕時間)と AEB 介入しきい値

「あと何秒で接触するか」——これが TTC(Time To Collision, 衝突余裕時間)という指標の本質です。シンプルな数式でありながら、AEB(自動緊急ブレーキ)の介入タイミング設計を考えるとき、TTC は最も基本的な判断軸の一つになります。本記事では TTC の定義と算出を本サイトの実装と照らし合わせながら整理し、「いつ介入するか」という設計上のトレードオフを掘り下げます。


1. TTC の定義:車間を接近速度で割る

TTC の定義はシンプルです。

TTC = gap / v_rel
  • gap:現在の車間距離 [m](自車前端〜前方物体後端)
  • v_rel:相対速度(接近速度)[m/s]

相対速度が一定のまま変化しないと仮定したとき、「あと TTC 秒で接触する」という予測値です。

停止対象と移動対象で v_rel が変わる

停止している前方物体(CCRs シナリオ相当)に対しては、接近速度は自車速度そのものです。

v_rel = v_s     (ターゲット停止時)
TTC  = gap / v_s

前方車両が同方向に走行している場合(CCRm シナリオ等)は、相対速度が支配します。

v_rel = max(v_s − v_t, 0)     (v_t: ターゲット速度)
TTC  = gap / v_rel

v_t ≥ v_s なら自車は追いつかないため v_rel = 0、つまり TTC = ∞(衝突しない)となります。

kinematics.ts での実装

本サイトの src/sim/core/kinematics.ts では、この TTC を rearEndStateAt 関数が返す RearEndStatettc フィールドとして管理しています。

// TTC = 残車間 / 相対速度。相対速度 0 なら衝突しない(∞)。
const ttc = vRel > 0 ? gap / vRel : Infinity;

また collisionTimeS 関数は、初期状態(t=0)から接触までの時間を直接計算します。

export const collisionTimeS = (
  speedKmph: number,
  gap0M: number,
  targetSpeedKmph = 0,
): number => {
  const vRel = relativeSpeedMps(kmphToMps(speedKmph), kmphToMps(targetSpeedKmph));
  return vRel > 0 ? gap0M / vRel : Infinity;
};

rearEndStateAt().ttc は時刻 t における残車間 gap を使うため「現時点からの TTC」、collisionTimeS は初期車間 gap0M を使うため「シナリオ開始からの接触時刻」という位置づけの違いがあります。


2. TTC と「最終制動点までの時間」の違い

TTC を理解するうえで混同しやすいのが、timeToLastChanceS 関数が返す「最終制動点までの時間」です。両者は全く異なる概念です。

意味参照距離実装
TTC接触が起きるまでの時間現在の車間 gaprearEndStateAt().ttc
最終制動点までの時間回避できる残り時間gap − 必要制動距離timeToLastChanceS

TTC は「何も対応しなかったら何秒後に接触するか」という純粋な物理予測です。

一方、最終制動点までの時間は「今すぐフルブレーキを踏んでも回避できる残り時間」です。これが 0 になった瞬間、想定ブレーキ能力では物理的に回避不能になります。

// timeToLastChanceS の計算核:
// 車間が必要制動距離 lc まで縮まるのにかかる時間 = (gap0 − lc) / v_rel
return (inp.gap0M - lc) / vRel;

詳細は「最終制動点と必要制動距離」で解説しています。

両者の関係を数値で確認する

たとえば自車速 60 km/h(≈ 16.7 m/s)、停止対象、車間 30 m、ブレーキ能力 0.9 g(≈ 8.83 m/s²)の場合:

TTC               = 30 / 16.7  ≈ 1.80 秒
必要制動距離      = 16.7² / (2 × 8.83) ≈ 15.8 m
最終制動点まで    = (30 − 15.8) / 16.7 ≈ 0.85 秒

TTC は 1.80 秒ですが、最終制動点までの時間は 0.85 秒です。AEB が 0.85 秒を過ぎてから介入しても、もう回避は間に合いません。TTC だけを見て「まだ 1.8 秒ある」と判断することの危険が、ここに現れています。


3. 速度・相対速度で TTC の意味が変わる

TTC は数値が同じでも、速度域によってその背後の状況が全く異なります。

速度が高いほど同じ TTC でも車間は大きい

TTC = 1.5 秒のとき、自車速度ごとの車間(停止対象)を計算すると:

自車速度 (km/h)速度 (m/s)TTC 1.5 秒時の車間 (m)
308.312.5
5013.920.8
8022.233.3
12033.350.0

高速域では「TTC 1.5 秒」でも車間が 50 m あります。しかし必要制動距離も速度の二乗で増えるため、余裕の感覚は裏切られます。80 km/h での必要制動距離(0.9 g 想定)は約 27.9 m です。TTC 1.5 秒時の車間 33.3 m と照らし合わせると、回避に使える時間的余裕はさほど多くありません。

相対速度が小さいほど TTC は長くなる

移動対象シナリオでは相対速度が減ることで TTC が伸びます。自車速 80 km/h、車間 30 m の場合:

停止対象(v_rel = 80 km/h ≈ 22.2 m/s):
  TTC = 30 / 22.2 ≈ 1.35 秒

移動対象 60 km/h(v_rel = 20 km/h ≈ 5.6 m/s):
  TTC = 30 / 5.6  ≈ 5.4 秒

TTC が長くなると「余裕がある」と読めますが、最終制動点までの時間は次のようになります(0.9 g 想定):

停止対象: 必要制動距離 ≈ 27.9 m → 車間 30 m はぎりぎり回避可能
移動対象: 必要制動距離 ≈ 1.8 m  → 余裕は十分

この場合は CCRm(移動対象)の方が物理的な余裕が大きく、TTC の伸びとおおむね整合します。ただし TTC だけでは必要制動距離との対比が見えないため、設計判断には両者を組み合わせる必要があります。


4. 介入しきい値の段階設計

AEB は通常、段階的な介入で構成されます。一般的な設計思想として:

  1. 警告(HMI アラート): 比較的早い TTC で、ドライバーに状況を知らせる
  2. 部分制動(partial braking): ドライバーの踏み込みを促す程度の減速
  3. フルブレーキ(emergency braking): 最大制動力を即時投入して衝突被害を低減または回避

各段階でどの TTC しきい値を設定するかが設計の核心です。

早期化と遅延のトレードオフ

しきい値を早くする(TTC が大きいうちに介入する)と:

  • 乗員が介入を「突然」と感じやすくなる(快適性の低下)
  • 渋滞・合流など危険ではない接近でも反応しやすくなる(誤介入)
  • ドライバーが AEB を信頼しなくなるリスク

しきい値を遅くする(TTC が小さくなってから介入する)と:

  • 回避不能になった後に介入するリスクが高まる
  • センサ確証・制御応答の遅れを考慮すると、さらに余裕が削られる

この「早すぎると不快・遅すぎると危険」という二律背反は、AEB 設計の中心課題です。

最終制動点までの時間が設計の下限を決める

いくら調整しても、フルブレーキ介入は timeToLastChanceS が 0 になる前に完了していなければなりません。センサ確証・制御遅延・ブレーキ油圧立ち上がり時間をすべて加算した「総システム遅延」を τ とすると、フルブレーキ介入開始は:

timeToLastChanceS ≥ τ

が成立している時刻でなければ回避は間に合いません。つまり timeToLastChanceS が定める時刻は「物理的に許される最も遅いフルブレーキ介入タイミング」であり、ここから逆算して TTC しきい値の下限が定まります。

警告や部分制動のしきい値はさらに手前(より大きな TTC)に置くことになります。


5. デモで TTC の変化を観察する

トップページのデモ を再生すると、車間が縮まるにつれて TTC が減少し、やがて最終制動点(橙の破線)を通過する様子を確認できます。

  • 再生開始直後は TTC が大きく、最終制動点までの余裕もある
  • 最終制動点を通過した瞬間に avoidablefalse になり、この時点以降はフルブレーキでも回避不能
  • その後も TTC は縮み続け、やがて接触

この時系列を見ると、TTC と最終制動点までの時間が異なるペースで変化することが分かります。両者が一致するのは、必要制動距離がちょうどゼロになる状況(速度がゼロになる直前)だけです。

センサ検知距離やシステム遅延の詳細については、並行作成中の「センサ要件と検知距離」で取り上げる予定です。


まとめ

  • TTC = gap / v_rel。停止対象は v_rel = v_s、移動対象は v_rel = v_s − v_t。本サイトの rearEndStateAt().ttccollisionTimeS がこれを実装している。
  • TTC(接触までの時間)と timeToLastChanceS(回避できる残り時間)は別物。後者が 0 になった瞬間、物理的に回避不能になる。
  • 速度域が変われば同じ TTC でも車間や必要制動距離のスケールが全く異なる。TTC 単体では設計判断に不十分で、最終制動点との対比が必要。
  • 介入しきい値設計は「早すぎると不快・誤介入、遅すぎると回避失敗」のトレードオフ。フルブレーキのしきい値は timeToLastChanceS とシステム遅延の合計から物理的な下限が決まる。

← 開発ブログの一覧へ