操縦系統基礎

Last-modified: 2021-04-17 (土) 13:06:21

操作の簡易化

https://steamcommunity.com/sharedfiles/filedetails/?id=2238612323
クリエイティブモードに行こう!を参考に必要最低限の部品で船を作ってみました。
しかし、この船は操作のほとんどをマウスクリックで行うため操作性に難があります。

https://steamcommunity.com/sharedfiles/filedetails/?id=2239211437
 そこでマイコンを使い、キーボード主体で操作できるように改造をしました。
各マイコンの設計思想や制御の流れをまとめたのでリバースエンジニアリングの参考にしてください。

スイッチ式クラッチ(マイコン名:Clutch)

 Clutchは数値で操作するパーツですが、スロットルのように中途の位置で止めるというよりは徐々に数値を動かして1もしくは0の状態にしておくことが多いパーツです。
そこで、スイッチがONのときは1に、OFFのときは0になるようにして操作の手間を減らします。
 主に使うロジックはUp/Down Counterで、信号を入力することで徐々に数値を増減させるものです。
スイッチをONにするときはそのままUPに、スイッチがOFFのときにDOWN入力するときはNOT回路を使います。
マイコンから出力した数値はClutch本体だけでなくDialにもつなげることでプレイヤーが数値を確認できるようになります。

WSキーによるレバー操作(マイコン名:SW Lever)

 前進速度を直感的に操作するためにWSキーを使いたいところですが、レバー操作はON/OFF信号に対してこちらは数値。うまく変換する必要があります。
まず準備としてシートの設定を開き、Axis 2[W]/[S]のSensitivityを100%にします。
こうすることでキー入力をしていないときは数値が0、Wキーを押すと一瞬で1、Sキーを押すと一瞬で-1になり、マイコン内で押しているキーを特定するための足がかりになります。
 マイコン回路で入力数値が1のときはレバーのUP入力用ON信号を、-1のときはレバーのDOWN入力用ON信号をそれぞれ出力するようにします。

セルモーター自動消灯(マイコン名:Auto deactivator)

 セルモーターは電気を消費してしまうため、エンジンがかかったらOFFにしておく必要があります。この動作を自動化します。
一定時間ON信号を受信し続けたらON信号を出力するTimer(TON)ロジックを使い、Key buttonに出力すれば自動でOFFにできます。
Key buttonのON信号をエンジンのStarterとこのマイコンにつなげることで押すたびに一定時間セルモーターを回して自動で止めることができます。

エンジンアイドリング(マイコン名:Min. throttle)

 エンジンのThrottleが0になるといずれ止まってしまい、再び動かすためにはまたセルモーターを回す必要があります。
そこで、シートに座っている間であればレバーを0にしていてもエンジンを止めないようにわずかにThrottleを入力しておくためのマイコンをつくります。
ON時とOFF時とで二種類の数値を選んで出力できるNumerical Switchboxを使います。
シートからの信号がOFFの時は0、ONの時(人が座っている時)は0.08を出力し、レバーからの数値と合計したものをエンジンに出力します。
こうすることで、座っている間はレバーが0でも0.08だけ数値を出力するためエンジンの回転を維持できます。
 座っている状態でレバーを1にすると最終的に1.08になってしまいますが、今回は1以上の数値を入力しても1として扱われるので問題ありません。
(これが不具合を起こす場合はClampロジックを使います)

カウンター式ギアチェンジ(マイコン名:Gear system)

 ギアチェンジをする際に個々のGear boxを直接操作するのではなく、逆転←→等速←→増速の状態を切り替え、それに対応するGear boxをマイコンに制御させます。
まず準備としてシートのHotkeyの4と5のModeをPushにし、押している間だけON信号を出力するようにします。
 今回もUp/Down Counterを使いますが、ON信号がある間だけ数値が増減してしまうため、任意の数値で止めるのは至難の業です。
そこでPulse (Toggle to Push)ロジックを使い、OFFからONに切り替わった瞬間だけ(つまりボタンを押した瞬間だけ)ONを出力するようにすれば
ボタンを押した回数だけカウンターを動かすことができるようになります。
 あとはカウンターの数値に応じてGear boxを操作するための各ON信号を出力します。
等速状態ではGear boxを操作する必要はありませんが、サンプルでは計器に表示するために個別のON出力を用意しています。

 このマイコンはあくまで一例で、工夫次第で自由にビークルの操作をすることができるようになります。
どのキーでどの装置を動かすかも自由ですし、アイドリングひとつとっても今回のようにThrottleに最低値を用意する他にエンジンRPSをPID制御する方法もあります。

操作の自動化

先に紹介したものはあくまでも手動操作をやりやすくするものであり、エンジンスロットルだけでなくクラッチも操作も……と各パーツを操作することにはかわりありません。
これをさらに発展させ、プレイヤーの入力だけでなくパーツのステータスを元に自動制御をしてみます。
https://steamcommunity.com/sharedfiles/filedetails/?id=2270905528

絶対値によるスロットル指定

今回はW/Sキーの操作だけでギアやクラッチを自動制御し、前後に動くようにします。
前に進む場合も、後ろに進む場合もエンジンのスロットルを上げる必要がありますが、後ろに進みたいときは入力数値がマイナスになってしまい、うまくいきません。
そこで、ABSロジックを使い、数値を絶対値に変換しておきます。これでプラスの数値はそのままに、マイナスの数値もプラスに変換されます。
ついでにレバーからの入力も追加して手放しでスロットル入力できるようにする他、キー入力中は最低値を設けて勝手に止まらないようにするロジックも足しておきます。

24.png16.png
話は逸れますが、このような複数の計算をさせるときはFUNCTIONロジックを使うのがおすすめです。
プログラミングのようで最初は戸惑うかもしれませんが、計算式を入力してまとめて計算することでロジックの数を減らし、画面を整頓することができます。

スターターの自動点火

いよいよパーツのステータスを元にした制御をします。
エンジンRPSが2未満かつ、キーがONの場合はスターターを点火するロジックです。
auto_starter.png
先に紹介した自動消灯とくらべるとエンストした場合も自動で点火しなおしてくれる他、キーをONにしている間だけ作動するので実際の車のキーに近い挙動になります。
自動で点火してしまうので、エンジンに無理な負担がかかって動けない場合でも点火しつづけてしまうことには注意してください。

クラッチの自動制御

船を止めておく場合にスロットルを0にしてしまうとエンジンが止まってしまうので、それを防ぐためにスロットルではなくクラッチを0にして動力伝達を止めるのが一般的です。
このクラッチ操作を自動化します。
具体的な動作のしくみは「エンジンRPSが3未満の時はクラッチを0に、3以上なら徐々に数値を増やし6以上であれば1」というものです。
これを実現する計算式は以下のものになります

エンジンRPS-3 ÷ 3 (計算結果を0から1の範囲でクランプ)
auto_clutch.png

具体的な数値をあてはめて挙動を確認してみましょう。
・エンジンRPSが3未満の場合はマイナスの数値を割り算するので、結果はマイナスになり、クランプで0になります。これでRPSが3未満ならクラッチは繋がりません。
・エンジンRPSが3から6の場合は3を引かれて0~3のいずれかを3で割ります。小さい数値から大きい数値を割ることになるので、計算結果は1÷3=0.333……、2÷3=0.666……3÷3=1と徐々にクラッチがつながっています。
・エンジンRPSがさらに増えた場合は4÷3=1.333……5÷3=1.666……と1以上になりますが、クランプの効果で全て1になります。
計算に使う数字でクラッチを0にするRPSの範囲やクラッチを繋げるスピードを変えられるので、ビークルの性能にあわせていろいろ試してみましょう。

リバースギアの自動切り替え

リバースギアに入れ替える際のプレイヤーの入力を自動化させます。
まずは具体的な操作の流れを把握しましょう。
・クラッチを0にする
・リバースギアをONにする
・クラッチを徐々に1に近づける
この流れを自動化させます。

今回の作例ではUP/DOWNカウンターを使います。
auto_reversegear.png
最小値を-1、最大値を1にしたカウンターの数値に絶対値をつかうとまずは徐々に0に近づき、0になったら次は1に近づく数値変化ができ、クラッチの動きになります。
また、カウンターの数値(絶対値を使う前)が0未満の時はリバースギアをONにするようにすれば、クラッチを0→リバースギアをON→クラッチを1にする流れができます。
カウンターの数値を動かす条件はW/S入力です。

各種制御をまとめる

キーのON/OFF信号など、インプットする側は複数のロジックに配線することができるのでそれぞれの制御に配線しておきましょう。
しかし、アウトプットに関してはRPSに基づいた自動クラッチとギアチェンジ用の自動クラッチの二種類の制御がありますが、1種類しか配線できません。
そこで、2つの数値を掛け算でひとつにまとめます。足し算でもまとめることはできますが、その場合は0から2までの数値になってしまい、予想外のタイミングでクラッチが繋がってしまいます。
掛け算であれば片方の数値が1でも片方が0であれば出力は1×0=0となり、クラッチは繋がりません。

おわりに

ロジックの組み方は特に設計者の個性がでる所であり、正解はありません。
明確な答えや正しい情報を記載するべきwikiにおいてこの要素を解説するはそもそも矛盾といえます。
あくまでも参考、アイデアのきっかけとして見えもらえればと思います。