2005/7/27

編成を任意の速度で走らせたい  VRMスクリプト禅問答
【怎麼生】
スクリプトを使って列車を走らせようと思うのですが、速度の指定がよくわかりません。0〜1.0の電圧ってどういうことですか。

【説破】 4.0.1.2
とりあえず「電圧」という言葉は忘れましょう。

VRM4スクリプトのSetVoltageおよびSetTimerVoltage命令が要求する0〜1.0の値は、電圧ではなく「希望する速度と最高速度の比」です。たとえば、ある編成に設定されている最高速度が120Km/hであり、これを60Km/hで走らせたいとした場合、この値は0.5になります。つまり、

電圧(?)=希望速度÷最高速度

です。これをスクリプトで書くと、

[編成スクリプト]

//
// この編成の最高速度設定は120km/hです
//

//
// 5秒で60Km/hに達するメソッド
//
BeginFunc Go60km5sec
//変数宣言
Var TmpVoltage
Var TmpTimer
//電圧は60/120=0.5
setf TmpVoltage 0.5
//時間は5秒=5000ms
set TmpTimer 5000
//速度変更実行
SetTimerVoltage TmpVoltage TmpTimer
EndFunc
になります。
ただし、この書き方だと、目的とする速度ごとに専用のメソッドを書かなければなりませんし、最高速度設定を変更するとすべて書き直しになってしまいます。そこで、汎用性のあるメソッドを書いてみましょう。たとえばこんな感じです。
[編成スクリプト]

Var VarMaxSpeed
Var VarTargetSpeed
Var VarTransitionTime
//
// 速度変更メソッド
// 編成速度をVarTransitionTime(ms)後に
// VarTargetSpeed(Km/h)になるよう加減速する
//
BeginFunc MtdChangeSpeed
//一時変数宣言
Var TmpVoltage
Var TmpTimer
//電圧算出
GetTopSpeed VarMaxSpeed
mov TmpVoltage VarTargetSpeed
div TmpVoltage VarMaxSpeed
//速度変更実行
SetTimerVoltage TmpVoltage TmpTimer
EndFinc

[このメソッドを呼ぶ側]

VarTrain ObjTrain
get ObjTrain "{制御対象編成名}"
//センサー通過編成であれば GetSenseTrain ObjTrain でOK
setf ObjTrain VarTargetSpeed {設定速度}
set ObjTrain VarTransitionTime {時間}
call ObjTrain MtdChangeSpeed
とりあえずレイアウト上のすべての編成に、上掲の編成スクリプトを書き込んでしまいましょう。あとは、メソッドを呼ぶ側で編成のグローバル変数(プロパティ)に希望の速度と遷移時間を設定してメソッドMtdChangeSpeedをcallすれば、最高速度設定がどんな数値になっていようと任意の速度を出すことができます(最高速度は超えれないと思いますが未検証につき言及せず)。
たとえば、駅への進入経路にセンサーを設置し、場内制限速度をVarTargetSpeedに指定しておけば、最高速度の大小を問わず一意に進入速度を制御することが可能になりますね。

なお、このサンプルは、現時点での走行速度がどうであるかを問わないので、無茶苦茶な急制動/急加速になったり、不必要な加速/減速になる場合が考えられます。これについては、GetCurrentSpeed命令で現行速度を取得し、VarTargetSpeedとの比較結果で動作を変えたり、TmpTimerの値を調整したりと、いろいろ改善の余地があります。これについては好みの問題もあると思いますので、読者の皆様の課題として残しておきましょう。で、行き詰ったら、具体的な仕様を添えて声をかけてください。解決して差し上げますので。

注)本連載で示すVRM4スクリプトや物の考え方をあなたが採用した結果生じる全ての事象については、その責を負い兼ねます。私の書いたものを読むに際しては、常に「コイツは狂人で、でも一部は役に立つことも言っているかも知れない」という程度の心構えで臨んでください。
1

2006/3/25  0:02

投稿者:ghost
> 少なくとも、私はいま試してますので。^^;

素晴らしい!!
そういう気概のある方をお待ちしておったので御座る。何か疑問点などがあれば、ご遠慮なくどうぞ。

2006/3/24  23:21

投稿者:tengutei
>いや、単に誰も試みてないという説が有力
少なくとも、私はいま試してますので。^^;
この「禅問答」集。

お陰で「Vermilion Wings」の仕組みも、徐々にではありますが理解できてきました。
(現在「目指せ自動運転(5)を解読中)

http://blue.ap.teacup.com/tengutei/

2006/3/24  22:16

投稿者:ghost
修正しました、ご指摘多謝。>tengutei殿

> みんなきちんと自分で書いてたんだな〜

いや、単に誰も試みてないという説が有力(苦笑)。

2006/3/24  21:37

投稿者:tengutei
コード修正依頼:「// 速度変更メソッド」内「//一時変数宣言」で「Var TmpTime」とありますが、「//速度変更実行」では「TmpTimer」になってます。

もしかしてわざとっすか?

…今まで指摘が無かったって事は、みんなきちんと自分で書いてたんだな〜。(すんません、わたしゃコピペしました。m(__)m)

http://blue.ap.teacup.com/tengutei/

2005/7/28  13:35

投稿者:ghost
補足:一部修正。サンプルコード下から3行目、setをsetfに。マニュアルを素直に読むと整数(set)と実数(setf)の変換は自動ということになるが、たとえ整数であってもsetした場合とsetfした場合では割り算(div)した際の精度が異なる模様。自動じゃないじゃん(涙)。

コメントを書く

この記事にはコメントを投稿できません




teacup.ブログ “AutoPage”
AutoPage最新お知らせ