Comments (15)
今は、進路勾配加速度(が正ならばそれ)を差し引いて計算した目標減速度の減速パターンに対し、自車の範囲に対する勾配影響を足した出力減速度でブレーキをかけている。これだと、進路勾配加速度より現在勾配影響が大きいときに (つまり強い下り勾配からほぼ平坦に変わるような線形で) 平坦時の目安減速度よりも強いブレーキになってしまう。
しかし、出力減速度を現在勾配影響ではなく進路勾配加速度のみで調整するようにすると、目標地点までの進路前半が上りで後半が下りとなるような場合に、上り勾配を上ってゆく間に進路勾配加速度がどんどん上昇してゆくことになるので、出力減速度があまりにも高くなり過ぎである。
結局のところ、上りでは実減速度が目安減速度と一致するように出力減速度を弱めるのに対し、下りでは出力減速度が目安減速度と一致するように目標減速度を下げるというように、減速度の調整方法が異なっているので、単純に上りと下りの影響を平均化した進路勾配加速度を使用することはうまくいかない。
from bve-autopilot.
となると、減速目標地点までの勾配が変化する区間ごとにそれぞれの勾配影響を算出し、その正負に応じて減速パターンの減速度を調整するということが必要そうである。要するに、現行よりも本格的で精密な減速パターンの計算が必要。これをやるなら、
- 勾配の反映結果を毎フレームごとに再計算したくはないので、減速パターンは予め計算して溜めておくことになる。
- 「減速パターン」クラスを「減速目標」に改名。減速目標に対して各勾配を反映した計算結果を改めて「減速パターン」クラスと定義するとよさそう。
- 減速パターンに 3 次関数と 2 次関数が混ざっているのは複雑さの原因なので、2 次関数に統一したい。
- 減速目標において初期減速度と最終減速度を統合し目標減速度とすることになりそう。
- 目標に到達する瞬間のブレーキの緩め方をどうするか考える必要がある。(これまでは 3 次関数で緩やかにブレーキを緩めていた)
- 目標速度が 0 でなければ、「(現在速度 - 目標速度) / 定数」との最小値を取ることで、最後の速度変化を指数関数につなぐことができる。
- 目標速度が 0 の場合は純粋に 2 次関数で減速する。(TASC 停車はこれまでもそうなっている)
- 🤔 現行の動作において「素早い速度超過回復」をしていなかったケースでは出力減速度の計算方法はもっと複雑である。どこまで反映できるか?
from bve-autopilot.
いろいろ考えるより先に
目標地点までの進路前半が上りで後半が下りとなるような場合
や前半が下りで後半が上りとなるような場合の試験を作った方がいいかな
from bve-autopilot.
勾配が変化する地点を列車が通過してゆくにつれて勾配影響が段々と変化してゆくとき、出力減速度が一定だとすると実減速度の変化は
- x´´ = p x + q
と表せるはずで、これを解くと
- x(t) = r exp(sqrt(p) t) + s exp(- sqrt(p) t) - q / p
- x´(t) = r sqrt(p) exp(sqrt(p) t) - s sqrt(p) exp(- sqrt(p) t)
- x´´(t) = p r exp(sqrt(p) t) + p s exp(- sqrt(p) t)
となる。(これ一次関数とかで近似できないのかな)
from bve-autopilot.
時間を変数とする式で変位や加速度を表すとめんどくさいことになるので、時間を介しない比エネルギーの式を使った方が良い気がしてきた。加速度を変位で積分したものが比エネルギーの差に一致するわけなので、加速度が変わる区間ごとに個別に積分計算してゆけば現行の進路勾配加速度の計算と大して変わらない手間で計算できそう。
from bve-autopilot.
いっそ、現在位置から目標位置までの高低差を速度差に変換して平坦時の期待速度に足したら勾配を考慮した期待速度になるのではという気がするが、現在位置から目標位置までの間に上りと下りの両方がある場合にはうまくいかなそう。 高低差が同じでも初速度が異なると速度差も異なるのでこれはダメ
from bve-autopilot.
減速パターンの新しいアルゴリズムをまとめるとこんな感じ?
- 目安減速度を求める
- 目標減速度設定地上子があればその設定値
- 車両の環境設定で指定した常用最大減速度の 8 割
- 現在フレームの状態に基づいて目標減速度を補正する
- 目標速度が 0 ならば、目安減速度と (現在速度 / 5 秒) の最小値
- 目標速度が正ならば、目安減速度のまま
- ↑あるいは、目標速度によらず ((現在速度 - 目標速度) / 5 秒) で良いか?
- 現在位置での期待速度と期待減速度を求める
- ここで現在位置から目標位置までの勾配の影響を計算に入れる
- 出力減速度を求める
- ここで列車に対する現時点での勾配の影響を計算に入れる
- 出力減速度を自動制動実数ノッチにする
- 自動制動実数ノッチを自動制動自然数ノッチに丸める
- ノッチの頻繁な上下を避けるためにここで多少のバイアスを入れる
- 自動制動自然数ノッチを自動制御指令にする
- 制動を弱めてもまたすぐ強くすることになるなら弱めない
- 停止直前はノッチを緩めて衝撃を抑える
- 力行の強さを計算する
出力減速度の計算を細かくすると
- 列車に対する現時点での勾配の影響を計算に入れる前の出力減速度 = 以下の最小値
- パターンに近付くための減速度、すなわち (現在速度 - 期待速度) / 2 秒
- ただし、目標速度が 0 かつ現在速度が期待速度以上ならば、無限大
- 余裕があるときに強すぎる減速を避けるための減速度、すなわち
- 現在位置が目標位置を超えているか「素早い速度超過回復」をするならば、無限大
- 現在位置が目標位置より手前で「素早い速度超過回復」をしない場合、
- 現在速度が期待速度を超えているならば、現在位置と目標位置の中点で速度が期待速度まで下がるような減速度
- 現在速度が期待速度以下ならば、
- 目標速度が正ならば、無限大
- 目標速度が 0 ならば、目標位置までの等加速度**の減速度
- 目標に達したら減速をやめるための減速度下限値、すなわち
- 目標速度が 0 ならば、無限大
- 目標速度が正ならば、(現在速度 - 目標速度) / 2 秒
- パターンに近付くための減速度、すなわち (現在速度 - 期待速度) / 2 秒
未検討課題:
- 「現在位置と目標位置の中点で速度が期待速度まで下がるような減速度」は本当に「現在位置と目標位置の中点」で良いのか? 「期待速度が目標速度と現在の期待速度の中点になる位置」とかの方が良いのでは? ↠ どちらでも大して変わらなそうな雰囲気はある
目標速度が 0 の場合に (あるいは正の場合でも?) 現在速度が目標速度より少しだけ速い状態で目標位置に近付く場合に急な出力減速度変化を避ける方法- 「目標に達したら減速をやめるための減速度下限値」が自動制動自然数ノッチに丸められるときは天井関数を使った方が良い。丸め方の違いを出力減速度計算箇所から丸め計算箇所までどうやって伝えるか。↠ むしろそれぞれの減速度を別口で計算して、自然数ノッチにしてから合わせた方が良い?
from bve-autopilot.
減速パターンに 3 次関数と 2 次関数が混ざっているのは複雑さの原因なので、2 次関数に統一したい。
目標速度が 0 でなければ、「(現在速度 - 目標速度) / 定数」との最小値を取ることで、最後の速度変化を指数関数につなぐことができる。
これに関する別案。
「(現在速度 - 目標速度) / 定数」に従う出力減速度で減速し続けると、列車の**は目標速度に指数関数的に近付いてゆく。そこで、目標地点において目標速度 + 0.5 km/h を通るような指数関数のグラフを引く。そしてこの指数関数が通常の減速パターン (二次関数) のグラフと接するようにする。すると、二次関数から指数関数に滑らかにパターンを変化させることができる。
さらに、現在速度と目標速度が近いときはグラフが接する位置を調整することで、進入速度が目標速度に近い場合でもブレーキのかけ初めの出力減速度変化を緩やかにでき、また速度がパターンより下がり過ぎた場合にブレーキを弱める効果が期待できる。具体的には、二つのグラフの接する位置の速度が列車の現在の速度となるように二次関数の係数 (減速度) を変更する。ただしこの調整は現在速度が目標速度と指数関数パターンの間にあり現在位置が目標位置より手前の時だけ使用できる。また調整後の減速度が元々の目標減速度を上回らないように留意する。
目標速度が 0 の場合はこの手法は使えないので別案が必要である。
from bve-autopilot.
これに関する別案。
とはいえ下り勾配の途中で二次関数から指数関数に遷移する挙動が安定するかどうか (比エネルギー差に基づく新しい勾配の計算と調和するかどうか) をよく吟味する必要がある
from bve-autopilot.
下り勾配では勾配加速度の分だけ実加速度が目標加速度より下がっているので、関数を遷移させる位置を調整しなくてはいけない。(関数の接点の位置がずれる。)
しかし実加速度に合わせて接点の加速度を下げると、それに合わせて接点の位置も後方にずれることになる。ところが勾配加速度を求めるには接点の位置が分かっていないといけないので、堂々巡りである。とりあえず、多少接点の位置が変わったところで勾配加速度に大きな変化はないと踏んで元の接点の位置での勾配加速度を流用するとかするか。
from bve-autopilot.
目標に対して速度差が小さい状態で近付いてゆく場合、ブレーキのかけ方を緩やかにしたい。
しかし主パターンの基準減速度を下げる方式だと、以下の理由でうまくいかない。基準減速度を低くしたパターンは主パターンとは別のパターンにする必要がある。
主パターンの基準減速度を下げると、期待速度も下がるので、パターンを超えているかどうかの判定基準も変わってしまう。パターンを超えていると判定されると停止目標位置より手前に止まるような強いブレーキがかかるので、結果として速度が落ちすぎてしまう。
本来の主パターンを超えていないならばそのような強いブレーキは不要で、たかだか停止目標位置ぴったりに止まる程度の強さのブレーキにすべき。
よって主パターン自体をずらすのは避け、早めに緩やかにブレーキをかけるための副パターンは別途用意すべき。
副パターンの計算方法は、これまで通り (速度差 / 減速時間) で減速度を決めるやり方で問題はない気がする (がまだ検証していない)。ただし、実際にブレーキをかけ始めて速度が下がってくると速度差もつられて小さくなり副パターンの減速度が下がるが、それに合わせて強いブレーキをかけると速度が下がりすぎてしまうので、ここでもたかだか停止目標位置ぴったりに止まる程度の強さのブレーキにすべき。
from bve-autopilot.
たかだか停止目標位置ぴったりに止まる程度の強さのブレーキ
速度が主パターンより低い状態からより主パターンに近付けていくことを念頭に置くと、(速度が主パターンからどれだけ離れているかに応じて?) ブレーキをもっと弱くしても良いかもしれない。
from bve-autopilot.
あるいは、停止目標位置をわざと後方にずらして計算する?
副パターンを少し上に上げる、もしくは「停止目標位置ぴったりに止まる程度」の代わりに「停止目標位置の 1 m 先に止まる程度」とするとか。
from bve-autopilot.
列車速度が主パターンの期待速度より低いとき、列車速度を主パターンに近付けてゆくためにブレーキを弱くしたいが、一方、急激な減速度の変化を避けるために主パターンに近付く前からブレーキをかけ始めたいというジレンマがある。(既に話が勾配に応じたブレーキングと関係なくなっているように思えるが、勾配の反映の仕方を変えたのに伴ってこの部分も再実装する必要が出てきている)
この件のアイディアのまとめ (前のコメントに書いたものも含む):
- 副パターンの停止目標位置をわざと後方にずらして計算する
- 出力減速度を主パターンと副パターンの間で線形補完する (でも現在速度が副パターンより下にあるときより上にあるときの方が減速度が下がってしまうような?)
- 副パターンの接近時間は主パターンより長くする
- 副パターンの減速度をわざと高くして常に副パターンが列車状態より上にあるようにする
また、副パターンの減速度の決め方のアイディア:
- 現在速度を定数で割ってパターン減速度とする ↠ 初速が非常に遅いときにブレーキをかけ始めるのが速すぎる傾向あり
- 初速の速さに応じて減速度も高くなるように調整する。初速の自乗に対して減速度と減速時間の積が比例するようにする。
停止直前に急にブレーキを強くせざるを得なくなってしまう問題はいくつかの要因が複合して発生すると考えられる。
- ブレーキの応答が遅い (車両特性としてどうしようもない)
- B1 と B2 で減速度に約 2 倍もの差があるので、細かい減速度の調整がしにくい。(B5 と B6 なら減速度の比は 1.2 倍程度であり、より細かい減速度調整が利く)
- 低速進入時は目標位置に近付く直前に「現在の速度・位置から等減速度で減速するパターン」の減速度が急激に上昇するので、これをブレーキ力の上限としているとブレーキも急に強くなる
from bve-autopilot.
初速の速さに応じて減速度も高くなるように調整する。初速の自乗に対して減速度と減速時間の積が比例するようにする。
試したところ、これで大体うまくいく感じ
from bve-autopilot.
Related Issues (20)
- より正確な目標時間調整
- 拡張ブレーキ指令の割合最大値が 1 未満の場合に不正動作することがある HOT 2
- TASC/ATOブレーキ段数桁表示について HOT 1
- ATO/TASC の切り替え方を柔軟にする HOT 1
- 力行の多段制御 (全速力でない力行) HOT 2
- 最大目標減速度の計算方法 HOT 1
- The limit speed cannot be read correctly in a D-ATC route HOT 3
- 急な上り勾配で低速で駅に近付くとき手前に止まってしまう HOT 4
- 自動発進が有効だと信号待ちでも転動防止ブレーキが効かない HOT 2
- 路線の途中で ATS↔ATC が切り替わるときの動作 HOT 1
- 下り勾配試験で停止位置直前に止まった状態から発進できない HOT 3
- 力行の急動作抑制 HOT 1
- ボタン操作応答遅延 HOT 1
- Feature request: Coasting HOT 2
- ノッチ戻し HOT 1
- ハンドル位置を取得したい HOT 7
- 範囲ベースの指令 HOT 1
- TASCのみ使用時のORPの挙動について HOT 1
- ATOはsnp形式のデータでは正常に動作しません HOT 2
- ATO/TASC使用時と手動時で異なるハンドル位置を出力したい HOT 8
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from bve-autopilot.