前置き
私はほぼ毎日自転車(ママチャリ)に乗って移動する。日頃通う道はそれほど整備されておらず、自転車レーンはないため道路脇を走る。交通量はそれほど多くはないが、一分も走れば何台かの車には追い越される。1 私は割と心配症なので、事故に遭うのを避けるため、道路脇を走行するときは定期的に振り返り、後方確認をする。 これは私が個人的に「車による自転車追い越しのプロトコル」と呼ぶ、以下の手順を踏んで追い越してもらうのが最も安全だと考えているからだ。
車による自転車追い越しのプロトコル
- 自転車側: 後方を確認し車を視認する。
- 車側: 自転車が後方確認したことを視認する。
- 車が追いつくと推測されるタイミングの少し前に、必要があれば自転車が少し脇に寄るか、車が対向車線に少しはみ出す。
- 車が自転車を追い越す。
このように運転手との間で緩やかな相互認証を行うことにより、単に追い越してもらうよりも安全になると考えている。 後方確認の別のメリットとして、車が来ないことが保証された安全な時間が確保できる点がある。 つまり、一度振り向いて車がいなければ、しばらくは振り向かずとも車がすぐそばにいないことがわかる。 この間は道路の中心寄りを走っても安全なので、快適に走行でき、やや危険性の高い路肩 (例えば、ガタガタしていたり、伸びた雑草が道路に飛び出していたりする)から距離を取ることができる。
ただし、後方確認には以下のようなデメリットもある。
- 短時間に後方を向き、前方を向き直す必要があるため、首をある程度勢いよく捻る必要があり、怪我の危険性がある。特に寝違えているときは一層辛い。
- 振り向きの動作は上体の旋回を伴い、自転車の進行方向が旋回方向にずれ、車道の中央側に飛び出してしまう。
- 前方への注意が途切れる。
この二、三点目は特に重要で、後方確認自体が交通事故の可能性を高めてしまう可能性がある。つまり、後方確認は常に有益とは限らない。 大雑把に言って、車が後方から迫ってきたとき、後方確認をする、しないによって、以下のような4つの結果があり得るだろう。
- 後方確認をしない
- 車がうまく回避して追い越す
- 車側が自転車が急に飛び出さないか不安になり、不規則な事態へ
- 後方確認をする
- プロトコルが機能し、車が安全に追い越す
- 車が直後にいるタイミングで後方確認し、自転車が道路中央側に飛び出し不規則な事態へ
どちらの場合にも良い結果と悪い結果があり、どちらが起こるかには不確実性がある。 とはいえ、状況に応じてより適した選択はあるだろう。 すなわち、後方確認をしない方が良い結果が起こる可能性が高い状況、またはその逆もある。
例えば、
- 自転車レーンが整備され、十分なスペースがある場合、後方確認をせず、まっすぐに進むのが安全
- 交通量が多い場合、後方確認に伴う自転車の道路中央側への飛び出しの危険性が高まるので、確認しないのが安全
- 交通量がそれほどでもない場合、後方確認自体の危険性は低く、確認することで上記のプロトコルが機能し、安全性が増す
後方確認が不適切な状況においては私たちができることはなく、単に真っ直ぐに走行し、事故に遭わないことを祈るのみだ。2 よって、この文章では、それほど交通量が多くない道において、どの程度後方確認をするのがいいかを考える。
適切な後方確認頻度とは
まず、後方確認は可能な限り少ない回数にするべきである。なぜなら上記のように、首への負荷や飛び出しの危険性があるからだ。 一方で確認を怠りすぎると、確認をしない場合のデメリットを受ける可能性が高まるし、不適切なタイミングでの確認による飛び出しの危険性がある。よって、安全を保証しつつも可能な限り回数を抑えるのがいい。 それはどれくらいの頻度だろうか?
これは細かいことを無視すれば、で計算するのがいいだろう。ここで、
- : 次に車が自分に追いつきうる最短予想時間
- : 後方の状況に対応するために必要な猶予時間
である。
より詳しくいうと、は、直前の確認で得た後方の情報、その道路を走る車の典型的な速度、自転車の速度などから推測される、 車が次に自分に追いつきうるまでの最短時間である。
例えば、最も単純な場合として、脇道のない一直線の道を走る場合、直前に振り返ったときに見えた車までの距離をとしよう。車がいなかった場合には視認できる最大距離をとする。 そして、その道を走る車の(予想)速度を、自転車の速度をとしたとき、 で求められる。
猶予時間は後方確認し、対応を取るのに必要な時間である。 例えば、
t = (後方確認に要する時間) + (後方から車が接近していた場合、脇に寄るのに必要な時間)。
この猶予時間も一般には車と自転車の速度等に応じて変化するだろうが、それほど大きくは変わらないだろう。 よって今回の考察ではは定数と考える。 私の個人的な体感ではは4秒くらいと考えれば十分だと思う。
この時間以内に確認を繰り返すことで、常に後方の状況を対処可能な状態に保つことができる。 もちろんイレギュラーな事態が起こらない限りではあるが。
猶予時間は定数としたので、 がわかれば、適切な後方確認頻度が求められる。 上では単純な場合のの計算例を与えたが、一般には通る道の特性に応じた考察が必要だろう。
例えば、複数の脇道からの流入がある道路を走る場合、先ほど求めたように直進して追いつく車だけでなく、脇道から入ってきて追いついてくる車の存在も考慮する必要がある。 この場合、先ほどのようにとするのではなく、脇道から車が入ってきた場合に、それが自分に追いつくまでの(予想)時間をとして、と の小さい方をとして採用する必要があるだろう。 また脇道から入ってきた車は減速しているため、加速してに達することを考慮してを求める必要がある。 このため、暗算できるような簡単な公式という形では結論を出すことはできないが、大して精密さを要求される計算でもないから、例えば等加速度運動と考えれば、高校物理で扱うような単純な計算で求めることができるだろう。
他にも状況に応じて、の定め方は多様にあるだろうが、ここでは典型的な場合の一つとして、 今述べたような、直線と脇道から車が追いついてくる場合のみを考える。
具体例における計算
具体例で計算を行う。付録として、この計算を行うコードを文章の末尾に載せた。 実際に私のいつも通っている道をモデル化して考える。
私が通る道はそれほど交通量が多くなく、それほど広くもない。おそらく車の時速は40km/hぐらいで、私の走行速度は15km/hぐらい。 見通しはそれなりによく、200mぐらいは見通せるが、いくつか脇道が合流しているので、そこから車が入ってくる可能性を考えると、一回の振り向きで保証できる安全な距離の最大は大体80mぐらいだろう。 脇道から合流する車は10km/hまで速度が落ちているとし、40km/hに達するまでに達するまでの加速度0.2g (gは重力加速度)とする。3 まず、直進してくる車が追いつく時間を考える。直前に振り向いた際には後方に車がいなかったとするとは200mなので、 ≒ 29秒。
次に脇道から入ってきた車が追いつく時間を考える。 簡単な計算によって、脇道から入ってきた10km/hの車が40km/hに達するまでの時間は大体4秒でそれまでの走行距離は18mとわかる。 時速を秒速に直すと、15km/h ≒ 4m/s. 40km/h ≒ 11m/h。 相対速度は25km/hで秒速に直すと約7m/s。よって、80m 後方の脇道から入ってきた車が追いつくまでの時間は、 ≒ 15秒。
は29と15の小さい方なので15秒。 猶予時間は4秒とすると、結局は11秒。 よって、11秒に一回振り向くというのが良さそうである。 ただしこれは猶予時間ギリギリの振り向きになるので、もう少し余裕を持って9秒に1回ぐらいがちょうどいいかもしれない。
実践と反省
この計算結果を踏まえ、今日実際に、脳内で十秒数えるごとに振り返りながら走行してみた。 感想としては、この振り返り頻度は想像よりもずっと頻繁で煩わしく、やや異常な振る舞いだと感じた。 もし、このようにしきりに振り返る他人を見たら、私は何らかの神経症的な性向を疑う。
というわけで、早々に振り返り頻度を下げ、そのまましばらく走っていると、 後ろからエンジン音が聞こえ、振り返るとそれなりに近く(十メートル程度)まで車が迫っていた。 これは余裕をもって対処はできたのだが、より早く確認していれば一層安全だったわけで、 十秒に一回は多すぎるにしても、秒数を決めての規則的な振り返り自体は真剣に考えるべきかもしれない。
付録: コード
計算に使ったコードを載せておく。「ユーザー入力」の部分の値を変更することで、さまざまな状況下に対応できる。 そう難しい内容でもないが、コーディングはChatGPTに頼った。 一通り目を通して正しい動作をすることは確認したが確実ではない。
このコードを通じて、sympy というのを初めてみた。 これは不定元を代数的に扱う機能を備えたライブラリのようで、 例えば、二次方程式の係数を未知定数にしたままで、解の公式を用いて解の表示を与えることができ、 後から係数に値を代入することができる。便利なものだと感じた。
コードを開く
from sympy import symbols, Eq, solve def kmph_to_mps(speed): return speed * 1000 / 3600 # 定数と変数の定義 t = symbols('t') V_b, v_l, v_e, a, d = symbols('V_b v_l v_e a d') g = 9.8 # ユーザー入力 V_b_input = 15 # 自転車の速度(km/h) v_l_input = 10 # 流入する車の初速度(km/h) v_e_input = 40 # 車の終端速度(km/h) a_input = 0.2 # 車の加速度(G). 重力加速度を単位として用いている d1_input = 80 # 脇道から車の現れうる最短距離(m) d2_input = 200 # 直進してくる車との最短距離, または後方の最大見通し(m) # 単位変換 V_b_val, v_l_val, v_e_val = map(kmph_to_mps, [V_b_input, v_l_input, v_e_input]) a_val = a_input * g print(f"V_b:{V_b_val:.3f} m/s, v_l:{v_l_val:.3f} m/s, v_e:{v_e_val:.3f} m/s, a:{a_val:.3f} m/s^2") # 自転車と自動車の位置関数 x_bike = V_b * t x_car_accel = -d + v_l * t + 0.5 * a * t**2 t_end_accel = (v_e - v_l) / a x_car_const = x_car_accel.subs(t, t_end_accel) + v_e * (t - t_end_accel) # それぞれの追いつく時刻 catch_up_time_accel = solve(Eq(x_bike, x_car_accel), t)[1] catch_up_time_const = solve(Eq(x_bike, x_car_const), t)[0] # 代入して計算 values = {V_b: V_b_val, v_l: v_l_val, v_e: v_e_val, a: a_val, d: d1_input} actual_time_accel = catch_up_time_accel.subs(values) actual_time_const = catch_up_time_const.subs(values) actual_time_straight = d2_input / (v_e_val - V_b_val) # 出力 if actual_time_accel < t_end_accel.subs(values): if actual_time_accel < actual_time_straight: print("脇道からの車が加速中に追いつく.") T = actual_time_accel else: print("直進する車が追いつく.") T = actual_time_straight elif actual_time_accel < actual_time_straight: print("脇道からの車が等速に達してから追いつく.") T = actual_time_const else: print("直進する車が追いつく.") T = actual_time_straight print(f"追いつく時刻は{T:.3f}s.")
V_b:4.167 m/s, v_l:2.778 m/s, v_e:11.111 m/s, a:1.960 m/s^2
脇道からの車が等速に達してから追いつく.
追いつく時刻は14.071s.
- 「車」ではなく「自動車」の方が正確だが、「自転車」と字面が見分けにくいので、この文章では「車」を用いる。↩
- 私はそのような道を自転車で通ることは、日常におけるリスクとしては大きすぎるのではないかと思っている。生活の都合上避けられない場合もあるけれども。↩
- 加速度については次のページを参考にした: 車が静止状態から発進するときの加速度を教えてくださいませんか?現実の状況、レースではありません。 - Quora↩