https://linen.dev logo
走る列車から前方の信号を取得しよう
# forum
u
ーーーーーーーーーーーーーーーーーーーーーーーー 【1.開発の経緯】 当方、ATCのシステム開発を目論んで色々と情報を集めています。 現在、列車の走行に伴う「軌道回路へ又は軌道回路から送信される、速度信号/開通信号、その他【列車前方の信号現示]に関する扱い」を考察しています。 少し昔にATSを開発したときは、「前方に存在しうる信号の条件を、すべて地上側の装置に施工の上、条件をあぶり出して現示を行う」方式を取りました。 が、これでは非効率であることと、進路条件の数に従い装置が過剰に設置されてしまいます。 たとえば、ATSAのような「Minecraft環境とコマンドラインのインタフェースになりうるMOD」を用いれば、ブロックの数は減らせますが、進路条件等の動作に関する条件は、コードの内部に一次関数的(線形に・条件の数といっしょ)に増加してしまうと思われます。 このような信号システムは、サーバーの負荷がより増加することと、応用的な開発力に欠けるため、望ましくありません。 ーーーーーーーーーーーーーーーーーーーーーーーー 【2.課題の解決と開発の指針】 そこで現在、「列車の前方にある信号」を、何らかの方法で取得し、信号の変化点までの距離と変化する先の指示速度等を取得して、「地上にある信号を車上で探し、車上で信号の挙動を処理する」方式の開発を考えています。 この方式であれば、軌道の改修工事や動作条件の追加などがあったとしても、列車が走行中の前方の現示を取得し、比較し、望ましい速度曲線での運転を実現できると考えます。 ここで、本システムの動作の要素に ①自列車の今保持している/受信している信号 ②信号変化点までの距離 ③信号変化点における新しい現示 を、最初に列挙します。 車上では、これら情報をもとに望ましいパターンを作成し、車両側に信号の現示、必要あらば自動的なブレーキ制御を組み込むつもりです ーーーーーーーーーーーーーーーーーーーーーーーー 【3.開発に向けた情報提供の依頼と考察の提案】 そこで、これら機能を開発するにあたり、特に ②信号変化点までの距離 ③信号変化点における新しい現示 の、二つの値に関して、効率的で計算資源が少なくて良く、円滑な処理を実現する方法を考えています。 現状では、WebCTCのようなMODを活用し、あらかじめ軌道回路の連続を条件から導き出すことができ、前方の軌道回路の信号を取得、保存し、車上で計測処理が可能になるような、信号システムの構築を考えています。 特に躓く可能性があるのは ❶隣り合うレールとその条件から導き出される、進路条件と先の現示の取得 ❷現在の列車の走行位置と、信号変化点(新しい軌道回路)までの比較して精密な距離の導出 と考えています。 これらに関し、何か開発の指針をご存じであったり、追加、搭載すべき機能、望ましい処理の方式等をご存知の方がいらっしゃいましたら、知見をぜひ共有させていただきたく思います。 よろしくお願いします🙇 ーーーーーーーーーーーーーーーーーーーーーーーー
↑ 今の所のK-LXYSの見解 WebCTCを用いて、RailGroupの前後を、軌道回路のポイント転換の向きなどから「連鎖的に、軌道回路を連続的に取得する」ことで逆算し 現示もこれらと一緒に、距離に対しての値として返したいなと考えています
y
私開発の非常に原始的で未熟なシステムでは有るのですが、 私が過去に実験的に開発した保安スクリプトでは、車両には運転士のプレイヤーが乗っていて、プレイヤーの周囲はチャンクがロードされる仕様を利用し、 車両搭載のスクリプトがロード範囲内のATCモデル(信号現示と連動する保安装置用地上子)entityのリストを取得して、自車両との相対的な向きが正面方向(通り過ぎてないもの)のものだけに絞って距離順にソートし、一番近い物を直後の制限と解釈して保安装置を制御するシステムを作ったことは有ります。 この場合、正面でも反対側の線路の地上子を拾ってしまわないよう、列車の進行方向と地上子の角度差が±90°以下の地上子に絞り込んだり、複々線等で隣の線路を認識しないよう、識別記号を設定して自身の進路上の地上子のみをリストに入れるようにしたりして、一応制限開始地点までに必要な減速ができるようにしています。
サーバー側による完全集中処理ではなく、ある程度分散型で必要に応じて現地処理……という方向性はなんとなく弊社システムと近い気がするので、何かしらのヒントになれば幸いです……
信号現示の連動も、論理の破綻が起きないよう単一の制御室で一旦連動を組むのですが、現地の信号機はロードされた時(誰かの画面に描画されている特)のみ制御室へデータを取りに行く仕組みになっていて、読み込み範囲外のチャンクをローダー等で常時読み込ませる必要が無く、チャンク凍結による回路不良も起こりにくい……という発想なんですが、まだ技術的に未完成のままではあります
n
リアルタイム更新ではないのですが信号機のnm前に信号の現示を読み取ってそれから信号機までにその現示速度に減速できるようなパターンを作り成功させたことならあります
u
どれもアリだなあ
Kaiz先生とお話して、望ましい仕様を思いついたのでまとめる ①WebCTCキャッシュ利用型(理想) WebCTCを使ってすばやい動作を目指す方式 WebCTCを利用して、前もって読み込まれた軌道のキャッシュから連続的なデータを取得し、距離を積算して進行可能な距離を割り出し、これをパターン動作の限界距離とする 現実のATACSに近い方式だが、デジタルATCのようにパターン開始位置は固定され、またパターンの動作タイミングは、原則軌道回路の切れ目に準ずる 最もハードウェア依存度の低いソフトウェア設計だが、そのぶんWebCTCのような「在線やレール接続が確実に読み出せるMOD」が無い限り、全くとして開発の見込みがない ②軌道DB構成、条件複合距離算出(現実) 軌道データをDB化して、組み合わせの呼び出し方を各軌道回路に覚えこませる方式 あらかじめ、軌道の状態を取得してデータベース化し、これを読みだして、「疑似的な軌道構成と軌道状態」を作り出す方式 もっとも現実のATCに近いが、応用力にかける上、ハードウェアとソフトウェアの依存度が高く、どちらかの更新時にもう片方の更新を伴い、工事が煩雑になる可能性が高い ③全軌道状態チャンク読み込み、条件複合距離算出 (強引) WebCTCが使えないなら、Worldのデータを常に有効にしておく方式 逆手にとって、あらゆる動作条件をレッドストーンやDataMapとして保存し、制御だけはスポーンチャンク等への集中も可能 ただし、こちらもハードウェアとソフトウェアの依存性が強く、頻繁に進路の変わる路線には適さない 以上3つの中から、最も適切な方式を検討する それまでは、弊開発陣は「列車側のデジタルATCを想定した表示機器類の、開発及び動作安定化と、コードの洗練化」すなわち、機能開発とリファクタリングに徹する予定 なお、「アクティブでワールド状況に合わせた距離取得、軌道状態を常に見ながら、列車の速度基準で計算した任意の距離から、列車の減速パターンを作る」タイプのデジタルATCは 現状でとっっっっっっっても開発が難しいので中止!!! 理由はいくつかある 【主】 ・軌道状態をアクティブなチャンクに絞り、なおかつ前もってリスト化された軌道状態を読むには、MOD開発が必要になる 【副】 ・離れたチャンクの軌道データをキャッシュ化して、取得して列車の制御に生かせるようなMODは、現状でWebCTCしかない ・WebCTCはそのシステムの都合上、レールグループなどの距離や前後のつながりを、JSのスクリプトから取得することは、できない ・MOD開発が必須となると、大幅な時間がかかる事と、現状の知識では開発に届かないこと。デジタルATCを想定した動作を実現するには、WebCTCなどとリンクできる、複雑な処理とMOD開発が必要になること ・内部的には、ATSAのATACSのような動作を期待しており、代替策が複数考えられること 等々 なので、弊開発側では 「ATSAにより強く踏み込んで、あくまで既存MODの仕組みで、前方の信号をエミュレートする」方法で より簡単に確実に動く仕組みを考える
webCTCみたいに、一度読み込まれた事のあるレールをリスト化して、繋がってる隣のレールを判別して、都度距離を算出できれば、あとは距離を足し合わせつつ、間引き処理をするだけで 大分軽い動作で、デジタルATCっぽいやつが作れると思うんだけどなあ でも、都度距離基準にして、リストの更新をチャンクを読んだ瞬間にすると、不慮の進路変更に適切に対応できない気がしなくもない