SSブログ

車両位置計算スクリプト [JMRI]

ずいぶん間が空いてしまいましたが...以前測定したスピード値−速度の対応リストを使って、現在の車両位置を計算するスクリプトを作りました。

このスクリプトの概略は
(1)getThrottleで得たアドレスに対して
(2)1/10秒毎にスピード値と進行方向を得て
(3)それを元に対応リストから速度を計算してこの間に進んだ距離を算出し
(4)それを積算して車両の位置を変数locationに入れる
といった感じです。

locationCalc.py

 1: import jarray
 2: import jmri
 3: import speedList
 4: class locationCal(jmri.jmrit.automat.AbstractAutomaton):
 5:     def init(self):
 6:         self.throttle = self.getThrottle(1234,True)
 7:         self.location = 0
 8:         return
 9:     def handle(self):
10:         self.location += self.calcDistance()
11:         self.waitMsec(100)
12:         return 1
13:     def getLocoStatus(self):
14:         self.sp = round(self.throttle.getSpeedSetting(),2)
15:         self.is = self.throttle.getIsForward()
16:         return self.sp,self.is
17:     def calcDistance(self):
18:         distance = speedList.splist[self.getLocoStatus()] * .1
19:         return distance
20: c = locationCal()
21: c.setName("Location calculate script")
22: c.start()

3行目: 後述するspeedList.pyをインポートして、このスクリプト内で使えるようにします。
5〜8行目: initはスクリプト実行時の最初に一度だけ実行されるメソッドです。throttleという変数にアドレス1234番を割り当てて、locationという変数に0を代入します。
9〜12行目: このスクリプトのメインルーティン。0.1秒ごとにメソッドcalcDisance(17〜19行目)を呼び出し、返ってきた値を車両位置を表す変数locationに加えます。return 1とすることでメソッドhandleはループします。
13〜16行目: メソッドinitで取得したthrottle(アドレス1234のデコーダ)の状態を得るメソッド。14行目でスピード値を1/100まで丸めたものを、15行目で進行方向を取得して返します。
17〜19行目: 車両の走行距離を計算するメソッド。18行目でgetLocoStatusを呼び出して、戻ってきた車両の状態(sp、is)に対応するspListの値を1/10(リストの速度が秒速なので)にして戻します。
20〜22行目: お決まりのインスタンス化〜Script Nameのセット〜実行です。

次にスピード値−速度の対応リストspeedList.pyをつくります。
今回はスピード値と進行方向という2つの値に対応する速度を取り出すため「辞書」とよばれるものを使いました。(speedList.py

それでは、実行してみます。

まず、以前作ったスクリプトを起動して車両を走らせた状態で今回のスクリプトを実行してみました。


"Script Entry"に左の文を入れて"Execute"をクリックして、車両位置(location)の状態を出力してみます。


きちんと計算されているようです。

これで一応車両の位置が把握できるようになりました。ここまでくれば位置情報を利用して自動制御してみたり、他の車両情報を読み込んで続行運転に挑戦したりと色々な可能性が現実的になってきました。


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。