Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
鉄道シミュレーターで自動運転を実装した話
Search
WATANABE Yuki
September 15, 2021
Technology
0
230
鉄道シミュレーターで自動運転を実装した話
WATANABE Yuki
September 15, 2021
Tweet
Share
More Decks by WATANABE Yuki
See All by WATANABE Yuki
速いクイックソート: Pattern-defeating quicksort
magicant
0
240
C++ はなぜあんなにも複雑なのか
magicant
0
71
ドキュメント、書けてますか?
magicant
0
110
Other Decks in Technology
See All in Technology
新機能Amazon GuardDuty Extended Threat Detectionはネ申って話
cmusudakeisuke
0
400
Splunk Enterpriseで S3のデータを直接検索してみた!
recruitengineers
PRO
2
120
振る舞い駆動開発(BDD)における、テスト自動化の前に大切にしていること #stac2024 / BDD formulation
nihonbuson
4
1.4k
Kubeshark で Kubernetes の Traffic を眺めてみよう/Let's Look at k8s Traffic with Kubeshark
kota2and3kan
3
340
KubeCon NA 2024 Recap / Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads
z63d
1
210
まだチケットを手動で書いてるの?!GitHub Actionsと生成AIでチケットの作成を自動化してみた話 / 20241207 Yoshinori Katayama
shift_evolve
1
870
ネットワークの Microsoft MVP だけど、SASE が万能すぎてもう俺いらなくね?
skmkzyk
0
270
フロントエンド設計にモブ設計を導入してみた / 20241212_cloudsign_TechFrontMeetup
bengo4com
0
1.9k
Turing × atmaCup #18 - 1st Place Solution
hakubishin3
0
390
KubeCon NA 2024 Recap: How to Move from Ingress to Gateway API with Minimal Hassle
ysakotch
0
170
Classmethod_regrowth_2024_tokyo_security_identity_governance_summary
hiashisan
0
930
実務につなげる数理最適化
recruitengineers
PRO
6
560
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Making the Leap to Tech Lead
cromwellryan
133
9k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
Done Done
chrislema
181
16k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
500
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
430
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Making Projects Easy
brettharned
116
5.9k
Practical Orchestrator
shlominoach
186
10k
Transcript
鉄道シミュレーターで 自動運転を実装した話 渡邊裕貴 / 2021-09-15
自己紹介 渡邊裕貴 趣味で作ってるもの: • magicant/bve-autopilot ◦ Bve trainsim 用自動運転車両プラグイン •
magicant/yash ◦ コマンドラインシェル (もう C 言語メンテしたくない ……) • magicant/yash-rs ◦ yash の Rust 版 (開発中) アイコン (カービィではない) 今日の話題
BVE という鉄道運転シミュレーターがあります mackoy という人が作った Windows 用フリーウェア 市販のゲームよりも忠実に 車両の運動を再現する bvets.net
BVE を動作させる構成要素 BVE プログラム本体 路線データ 線路の形状 駅名とダイヤ (予定時刻) 線路や周りの建物とかの見た目 etc.
車両データ 車両の質量や長さ モーターやブレーキの性能 運転席の窓枠や計器の見た目 車両プラグイン
車両プラグインとは • 車両の挙動の一部を動的リンクライブラリーとして実装したもの • プラグインができること: ◦ プレーヤーが操作した加速やブレーキを上書きする ◦ 計器等の表示を変化させる ◦
効果音を鳴らす
車両プラグインの基本動作 1. BVE 本体から現在状態を受け取る ◦ 車両の位置や速度 ◦ プレーヤーが操作した加速レバー・ブレーキレバーの位置 ◦ プレーヤーが操作したその他のボタン
2. 必要な計算を行う 3. BVE 本体に状態を返す ◦ 実際に行う加速・ブレーキの強さ ◦ 計器に表示する値 ◦ 効果音の選択・音量 以上、1/60 秒ごとに繰り返し……
自動運転を実現するには • 目標: 人間の代わりに列車の加速とブレーキを全て操作する ◦ 駅を出発し次の駅に停まるまで、人間は座って見てるだけで良い • 車両プラグイン内で加速とブレーキの強さを計算して出力 ◦ ただし手動での介入も許す
▪ 手動と自動とで強い方のブレーキを優先
走り出し • 出発準備ができたら、ブレーキを解除し加速を始める ◦ プレーヤーが手動で発進ボタンを押したら自動運転開始 ◦ または、ドアが閉まったら自動で発車する設定も可 • 加速の強さは基本的に常に全速力を指令する ◦
普通の電車は 4~5 段階くらいで加速力を調節できるが ◦ 細かいことはモーター側で調節してくれるので気にしなくて良い
適当に加速を止める • ブレーキを始める n 秒前に加速を止める ◦ n は速度が高いほど大きめにする ◦ n
秒後の位置と速度を予測し、その状態でブレーキが必要なら、いま加速を止める • 制限速度に達した時も加速を止める ◦ 実際に加速が止まるまでにラグがあるのでちょっと早めに止める • 速度が落ちてきたら再加速
ブレーキの掛け方 目標: • 駅の停止位置にできるだけ正確に止める ◦ 誤差 30 センチ以下くらいで • 減速中の加速度をできるだけ一定にする
停止位置を車両プラグインに教える BVE のビーコン機能を使う 路線データに所定の命令を書いておくことで • 特定の地点を列車が通過するときに • 特定の 32 bit
整数二つを車両プラグインに渡す (= 関数を呼び出す) ことができる → 駅が近付いてきたらビーコンで残り距離を伝える
減速パターン 等加速度運動の放物線 (に沿って減速したい ) 距離 速度 停止位置 0
ブレーキ開始のタイミング? 列車が放物線に達した瞬間にブレーキを始めたのでは遅い 距離 速度 0 停止位置
ブレーキアルゴリズムの前提条件 1. 普通の電車は 5~8 段階くらいでブレーキ力を調節できる ◦ あまり細かい調節はできない 2. ブレーキ指令を変化させてから実際に加速度が変化するまでラグがある ◦
加速度は連続的に変化するので正確な予測は困難 3. どのみちいろんな要因でいろんな誤差が発生する ◦ ブレーキをかけている途中でも常に微調節が必要
ブレーキアルゴリズムの方針 • 常に列車の状態を減速パターンに近付け続ける ◦ 大きくずれているときは大きく近付ける ◦ 少しずれているときは少し近付ける
ブレーキの強さの計算 ブレーキ指令 = −目標加速度 + (実際の速度 − その位置での目標速度) / 係数
距離 速度 停止位置 0 一定時間後に減速パターンに乗るような 加速度を常に計算し続ける
いつから線路が平坦だと 錯覚していた?
勾配があると列車が自然に加減速する 1% の勾配 = 0.3 km/h/s 位の加減速 2% の勾配 =
0.5 km/h/s 位の加減速 3% の勾配 = 0.8 km/h/s 位の加減速 4% の勾配 = 1.0 km/h/s 位の加減速 ちなみに、減速パターンの加速度は -2.5 ~ -3.5 km/h/s くらい
上り勾配でのブレーキング • 自然に減速する分だけブレーキを弱くする ブレーキ指令 = −目標加速度 + (実際の速度 − その位置での目標速度)
/ 係数 + 勾配による加速度
下り勾配でのブレーキング • 🔺 自然に加速する分だけブレーキを強くする ◦ 必要なブレーキ力が限界を超えるとアウト • ✅ 減速パターンをより緩やかな加速度で計算する ◦
必要なブレーキ力は平坦時と同じ 距離 速度 停止位置 0
勾配が常に一定だなんて 言ってないが?
減速中に勾配の傾きが変化する場合は? 🤔 • 🔺 平均の傾きで計算する ◦ 正確ではない ◦ 極端な条件ではオーバーランする •
✅ まじめに計算する ◦ (理論上は) 正確 ◦ オーバーランしない ◦ 必要なブレーキ力は平坦時と同じ
考え方 • 前提 ◦ ブレーキ力の強さは平坦時と同じにしたい (なるべく一定の強さに保つ ) ◦ 勾配が列車に与える加速度は位置によって異なる •
定理 ◦ 列車の実際の加速度は位置によって異なる ▪ もう等加速度運動ではない
グラフを描こう 傾き 位置 0 平坦 ゆるい傾き きつい傾き 平坦 停止位置 列車の先頭部分の
グラフを描こう 2 勾配による加速度 位置 0 平坦 ゆるい傾き きつい傾き 平坦 停止位置
列車の長さ 列車の長さ 列車の長さ 列車の先頭部分の 列車が勾配に入っていくにつれて 段々と加速度が変化する
グラフの面積を測ろう 加速度 位置 平坦 ゆるい傾き きつい傾き 平坦 停止位置 列車の先頭部分の 加速度
× 距離 = エネルギー / 質量 ブレーキが 消費する エネルギー 勾配が加える エネルギー ブレーキの加速度 現在地
目標速度の求め方 今後ブレーキが消費する運動エネルギー = 今後勾配が加える運動エネルギー + 現在地の運動エネルギー 1. グラフの面積の差から現在地の運動エネルギーを求める 2. 現在地の運動エネルギーから現在地の速度を求める
2 × 速度2 = エネルギー / 質量
おまけ
プラグインの中身 • github.com/magicant/bve-autopilot • LGPL 2.1 • C++ で 7500
行くらい • ほとんどのクラス名や変数名が日本語 • 自動テストはほとんどない😥 • もっと詳しいアルゴリズム解説 ◦ 鉄道用語・BVE 用語が分かる人用
動画 • 東京メトロ副都心線 小竹向原→渋谷 • 阪和線・関西空港線 関空快速 天王寺→関西空港 • 東急東横線・みなとみらい線
渋谷→元町・中華街 (この動画の時点では勾配が途中で変化する場合のブレーキ計算が甘い )
制限速度 減速パターンに沿って減速するという基本は同じ。途中で減速をやめる 距離 速度 0 ここからカーブ
信号 • 信号が示す速度(の番号)を BVE 本体からもらう • 列車の制御方法は制限速度の場合と同じ • 走行中に信号が変わることもあるので随時再計算する •
こういう見た目の信号は自動運転では使わない → ◦ これはあくまでも人間用 写真: https://commons.wikimedia.org/wiki/File:Railway_signal_ja_oer_sk_zero.JPG
ブレーキ開始時の初速が低い場合 距離 速度 停止位置 0 手前に止まってしまう
停止位置を行き過ぎたら? 距離 速度 停止位置 0 ブレーキ指令 = −目標加速度 + (実際の速度
− 目標速度) / 係数 停止位置より先の位置では 目標速度は定義されない ?
現実の鉄道での自動運転 • 関東での採用例: ◦ ゆりかもめ (←運転士も車掌もいない ) ◦ 東京メトロ副都心線や千代田線 (←運転士が乗っていて発車ボタンを押す
) ◦ JR 山手線 (←ほとんど手動だが駅に停まる時のブレーキだけ自動 ) • 自動運転時だけブレーキ力を 30 段階位の細かさで調節できるように してあることがある ◦ 手動運転のブレーキ力調節は普通は 8 段階位まで • シミュレーターでは起きない誤差との戦い