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
220
鉄道シミュレーターで自動運転を実装した話
WATANABE Yuki
September 15, 2021
Tweet
Share
More Decks by WATANABE Yuki
See All by WATANABE Yuki
速いクイックソート: Pattern-defeating quicksort
magicant
0
230
C++ はなぜあんなにも複雑なのか
magicant
0
71
ドキュメント、書けてますか?
magicant
0
110
Other Decks in Technology
See All in Technology
福岡新卒エンジニアの会
teba_eleven
1
190
Incident Response Practices: Waroom's Features and Future Challenges
rrreeeyyy
0
140
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
4
380
20241108_CS_LLMMT
shigashiyama
0
260
エンジニアが一生困らない ドキュメント作成の基本
naohiro_nakata
2
150
誰も全体を知らない ~ ロールの垣根を超えて引き上げる開発生産性 / Boosting Development Productivity Across Roles
kakehashi
1
120
ジョブマッチングサービスにおける相互推薦システムの応用事例と課題
hakubishin3
3
640
Terraform Stacks入門 #HashiTalks
msato
0
290
State of Open Source Web Mapping Libraries
dayjournal
0
220
Engineering at LY Corporation
lycorp_recruit_jp
0
450
ドメイン名の終活について - JPAAWG 7th -
mikit
31
18k
dev 補講: プロダクトセキュリティ / Product security overview
wa6sn
0
1.7k
Featured
See All Featured
A Tale of Four Properties
chriscoyier
156
23k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
231
17k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
What's new in Ruby 2.0
geeforr
343
31k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.3k
The Invisible Side of Design
smashingmag
297
50k
Building an army of robots
kneath
302
42k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
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 段階位まで • シミュレーターでは起きない誤差との戦い