翻訳作業場トップページ このドキュメントは $FG_ROOT/Docs/Readme.Joysticks.htmlの日本語訳です。


 

ジョイスティック・キーボードの設定方法

version 0.9.8.1 13/10/2005 Author John Check (FlightGear1.9.1添付バージョン)

この文書はFlightGear0.7.7以降を対象として書かれています。 ジョイスティックがあなたのOS上で正常に認識され、動作しているという前提で書いています。この文書はLinuxユーザーの視点で書かれていますが、しかしこの情報は他のプラットフォームでも有効です。 (訳注:訳者はWindowsVistaユーザーです。)

Thanks to David Megginson, who aside from actually implementing FGFS XML features, lets me rip off his descriptions of how stuff works so I can look smart.(ここは未翻訳 )

 

いくつかの歴史

初期のFGFSのジョイスティックの軸(Axis)/ボタン(button)と、キーバインディングはハードコードされていました。もしデフォルトのジョイスティックの設定を使用しない、もしくは違うキーバインディングを使いたい場合、ソースコードを修正して再コンパイルする必要がありました。

幸運な事に、v0.7.5.aの頃に"プロパティマネージャ"が与えられ、ジョイスティックで簡単にパラメータをセットできるようになりました。 バージョン0.7.7ではプロパティマネージャの役割が拡張され、イベントとコマンドを束ねることが出来るようになりました。 このコードは、FGInputとして知られていて、ジョイスティックと同様にキーボードのコマンドバインディングを構成するのに使用されます。 バージョン0.7.9では条件付けが許容され、編集された決定ツリーを加えました。(修正希望)

 

最も重要な事:

私は、ジョイスティックとキーボードについては後で書くつもりです。 FGInputは一般的なものを十分に扱えます。それは、ジョイスティックのボタンとキーボードのイベントを同様に扱います。 さまざまな方法でキーボードまたはジョイスティックのバインディングを記憶できます。使える方法は以下のとおりです:

 ソース  場所  書式   有効範囲
command lineSTDINsee examplesそのセッションのみ
.fgfsrc~/コマンドラインオプション現在のユーザーのみ
system.fgfsrc$FG_ROOTコマンドラインオプションシステム全体
joystick.xml$FG_ROOTXMLプロパティリストシステム全体
keyboard.xml$FG_ROOTXMLプロパティリストシステム全体

訳者注:以降、joystick.xmlとkeyboard.xmlについての解説が主体となります。

 

XMLについて

あなたがこれを疑問に思っている時のために、XMLは「eXtensible Markup Language」と書いておきます。 これは、HTMLに非常に似ていますが、(訳者追記:XML文書に使う場合に限って言えば)あなた自身で定義したタグを使用できます。

さて、FGFSの場合では、私たちはあなたがジョイスティック/キーボードを構成するために必要とするタグを定義しました。XMLは階層的に組織化された構造を記述するのに適しています。FGFSで使用しているプロパティツリーのような、外部のアプリケーションへの内容です。あなたは、FGFSのためにXMLファイルを設定するには、以下の開始タグと終了タグをペアで記述しなければなりません。

<PropertyList>
 <!-- HTMLと同じように、<!-- -->で囲った部分はコメントです。 -->
</PropertyList>
 

ジョイスティックの出力を、どのプロパティに割り当てるか決める

FlightGearには、js_demoユーティリティが同梱されています。(訳注:1.9.0以降は同梱されていません…) これは、ジョイスティックの数と能力について報告するでしょう。 ジョイスティックを操作しながらjs_demoの出力を監視すれば、軸/ボタンに対して割り当てる操作を決める事ができます。一般的に、*NIX環境では付番がゼロから始まることに注意してください。 以下の例では、システムで、1個のジョイスティック(js0)を接続します。この出力は、4ボタンとスロットル付きのアナログGravis BlackHawkジョイスティックの物です。

js_demoの典型的な出力

Joystick test program.
~~~~~~~~~~~~~~~~~~~~~~
Joystick 1 not detected    <!-- ジョイスティック番号は0から始まります -->
Joystick 2 not detected
+--------------JS.0--------------+
| Btns    Ax:0   Ax:1    Ax:2    |                    
+--------------------------------+
| 0000    +0.0   +0.0    -1.0    |

js_demoの内部では、button0は2進数で1の位、button1は2の位、button2は4の位・・・と扱われますが、画面上では16進数で表されます。

画面表示(16進数)2進数での表現押したボタン
0001000000000000001button 0
0002000000000000010button 1
0004000000000000100button 2
0008000000000001000button 3
0010000000000010000button 4
0020000000000100000button 5
0040000000001000000button 6
0080000000010000000button 7
000a000000000001010button 1 とbutton 3 の同時押し

・・・といった要領で8000(button 15)まで続きます。 (訳注:16進数で表示されることを強調するため、0014から000aに変更)

 

デフォルトでのジョイスティックのプロパティ

 

じゃあ、今度は何をするか

先ほど集めたUSBジョイスティック(orジョイスティックポート)からの出力が何であるか分かったので、あなたは多分FGInputを今すぐ使いたいと思っているでしょう。もしこれ以前のFGFSのバージョンでジョイスティックを設定するのに慣れているなら、あなたは「コマンドマネージャ」をセクションまでスキップできます。 もし、新しいFGFSユーザーなら、いくつかの概念がわかるので、あなたは次の項を読んでください。それはまた、コマンドマネージャでまだ実装されていない、古いジョイスティックオプションをカバーします。

 

「生」のジョイスティックの値を修正する

これらのコンセプトは、ジョイスティックバインディングに理由付けする事です。 生の値をそのままジョイスティックの軸として使う事が適切でない場合があります。また、ベストパフォーマンスを得るために実験を重ねる場合、基本概念があなたを救うことを理解してください。また、全てのジョイスティックが同じ状態で作られるとは限りません。(訳注:必ず製造時に誤差を含んでいます)

軸のプロパティに対する修正順序はこのようになっています。

  1. 生のジョイスティックの値
  2. デッドゾーン(dead-band,入力を無視する範囲)をフィルタリングします。(deadbandは、コマンドマネージャの外で実行されます。)
  3. オフセット(offset,中心からのズレ)を修正します。
  4. 3までの値に、factorを乗算します。
  5. この結果が得られた値を、FlightGearのプロパティのコントロールに使用します。

別の表現をすれば、下記のようになります。 cooked_value = (( raw_value > dead-band ) + offset) * factor

軸のプロパティは以下の通りです。

 

dead-band

-1      0      1
 ...............
-1     | |     1
        ^
    dead-band

このエリア内の信号は無視されます。どんな信号も無視される範囲を作成することによってノイズや、品質の悪い電圧計/可変抵抗を補います。 dead-bandは0位置に依存します。 デフォルトの、エレベーターとエルロンのための0.1の設定はガク引きに対して寛容です。数値を小さくすると、よりきつい感じをもたらします。 スロットル等、いくつかの場合では、あなたはdead-bandを設定したがっていないかもしれません。 この場合0.0の値を使用してください。

 

offset

-1 0         1
 .............
-1 ^         1
 offset

軸の操作範囲を広げたい場合に使用します。スロットル等、0が最小値になる場合で、ラダー等とは違ってセンターが無い場合に使用します。標準的には-1.0を使用します。

 

tolerance

ジョイスティックのジッターの補償に使われて、toleranceの本質は「gate」です。 それに満たないジョイスティックの動きは無視されます。dead-bandとは異なり、toleranceは軸がいったいどこで落ち着いているか、で決まります。

 

factor

軸の操作量に対する「倍数」です。この値が小さいと、FGFS上での操作限界に達しないコントロールしかできなくなります。 負の数を設定すると、軸の操作とFGFS上での動きが反対になります。デフォルト値は1.0です。 筆者のケースでは、スロットルを逆向き(手前に引くとスロットルを開く設定)にしたかったため、-1.0を設定しました。 (訳注:第二次世界大戦の頃まではフランス機のように「スロットルレバーを手前に引いて開き、奥に押して閉じる」機種もあったので、それを再現するためだと思われる。ちなみに、旧日本軍は陸海軍でそれぞれ違ったそうな。)

 

コマンドマネージャ:

以前のFGFSはジョイスティックの出力で直接プロパティマネージャーを操作していました。FGFS v0.7.7以降は、操作した時にイベントを発生させてコマンドを実行するように変更されました。バインディングは効果があるようなコマンドを「指定しなければなりません」。都合が良いことに、コマンドのリストは2種類に分けられます。

 

描画・ファイル関連

コマンドオプション用途
nullなし前のバインディングをクリアします。(翻訳自身なし・・・まあ使う機会もあまり無いか)
exitなしFGFSを終了します。
loadファイル名(注1)フライトのロード
saveファイル名(注1)フライトのセーブ
load-panelパス(注2)パネルの変更/再読み込み
load-preferencesパス(注2)設定のロード (注3)
screen-captureなし./fgfs-screen.ppmにスクリーンショットの保存
view-cycleなしパイロットの視点の方向を変える

飛行機の制御

コマンドオプション効果
property-toggleproperty指定したプロパティの値のオン/オフ(true/false)の切り替え
property-assign"" "", value指定したプロパティの値を指定したものに変える
property-adjust"" "", step一度操作する毎にstepだけ増やす
property-swap"" ""[0], "" ""[1]2つのプロパティの値を入れ替える
property-scale"" "", offset, factor生のジョイスティックの値を先述通り処理してプロパティに与える
 

バインディング

一つのコマンドを<binding> </binding>で束ねることで、1つのボタン/軸に複数のコマンドを割り当てる事ができます。 バインディングがXMLで指定されていると、インデックスがなぜか自動的に作成されます。もしXMLを避けたいならば、複数のバインディングをコマンドラインオプションで指定しなければいけません。

 

ジョイスティックの軸

これはXMLでのジョイスティックの軸の設定サンプルです:

<axis n="0">                   <!-- 設定したい軸の番号を指定します -->
 <desc>Aileron</desc>          <!-- 軸の概要について (無くても可) -->
 <binding>                     <!-- バインディングを開始します。 -->
  <command>property-scale</command>    <!-- コマンドを指定します -->
  <property>/controls/flight/aileron</property>   <!-- 割り当てたいプロパティを指定します -->
 </binding>                    <!-- バインディングタグを閉じます -->
</axis>                        <!-- axisタグを閉じます -->

先ほど、プロパティツリーが階層構造であると書いたことを覚えていますか? 注意深い人なら、構造を保つにはタグを入れ子にする必要がある事に気付くでしょう。 このバインディングが/input/joysticks/js/ のコンテキストに現れるので、同等のコマンドラインのオプションでは以下のようになり、省略可能な'desc'以外が現れると言う点で同じです。

 --prop:/input/joysticks/js[0]/axis[0]/binding/command=property-scale
 --prop:/input/joysticks/js[0]/axis[0]/binding/property=/controls/flight/aileron

コマンドラインオプションで階層構造を表現するためにどのようにパスを使用しているか見てみましょう。 すばらしいと思ったら、次はREADME.xmlpanelを読んでください。FGFSのXMLの設定は簡単で、(訳注:何かを作ってくれる事が)ユーザー全員のためにもなります。

 

本題に戻りましょう。"property-scale"コマンドは"offset"、"factor"の値を認識します。以下の例では"type"の値で、double形(倍精度浮動小数)を指定しています。 double形の方がよりステップがはっきり区別されていて、単なるfloat形よりも滑らかな動作をさせます。

<axis n="2">
 <desc>Throttle</desc>
 <!-- 下記の「dead-bandについての重要事項」も見てください -->
 <binding>
  <command>property-scale</command>
  <property>/controls/engines/engine[0]/throttle</property>
  <offset type="double">-1.0</offset>
  <factor type="double">-0.5</factor>
 </binding>
</axis>

もしくは

--prop:/input/joysticks/js[0]/axis[2]/binding/command=property-scale
--prop:/input/joysticks/js[0]/axis[2]/binding/property=/controls/engines/engine[0]/throttle
--prop:/input/joysticks/js[0]/axis[2]/binding/offset=-1.0
--prop:/input/joysticks/js[0]/axis[2]/binding/factor=-0.5

dead-bandについての重要事項

あなたは、先述の「ジョイスティックの値を修正する」セクションに書かれていた通り、dead-bandがコマンドマネージャの外で実行されることを思い出してください。 これは、デッドバンドを適用したいなら、dead-bandタグが他のタグに先行しなければならないことを意味します。もしコマンドラインを使用するなら、'binding'を省略し、同様に下記のようにしてください。

--prop:/input/joysticks/js[0]/axis[2]/dead-band=0.005
 

ジョイスティックのボタンのプロパティ

ボタンは本来ブーリアン型(true,falseの2つの値だけで表すデータ形式で、少しの事に使うことができます。これによって、瞬間的な動作、繰り替えし動作、普通の切り替え操作に使うことが出来ます。簡単にそれらができるように、ボタンの機能を変更するいくつかのタグがあります。

<repeatable>

<step>

<value>

<mod-up>

このサンプルは、XMLでのジョイスティックのボタンの宣言です。

<button n="1">                        <!-- どのボタンかを指定します -->
 <desc>Elevator trim up</desc>  <!-- ボタンの概要(必須ではありません) -->
 <repeatable>true</repeatable>  <!-- Ok, repeatableの指定はコマンドマネージャの外でも可能です -->
  <binding>                           <!-- バインディングを開始します-->
   <command>property-adjust</command>           <!-- コマンドを指定します。-->
   <property>/controls/flight/elevator-trim</property> <!-- 操作するプロパティを指定します-->
   <step type="double">0.001</step>
  </binding>
</button>

コマンドラインでは、以下のようになります。

 --prop:/input/joysticks/js[0]/button[1]/repeatable=true     <-- 見ての通り'binding'はありません -->
 --prop:/input/joysticks/js[0]/button[1]/binding/command=property-adjust
 --prop:/input/joysticks/js[0]/button[1]/binding/property=/controls/flight/elevator-trim
 --prop:/input/joysticks/js[0]/button[1]/binding/step=0.001

これは多少高度な設定例で、ボタン4を押した時に左車輪だけブレーキをかけ、ボタンを離すと自動的にブレーキが解除されます。

<button n="4">
 <desc>Left brake</desc>
 <binding>
  <command>property-assign</command>
  <property>/controls/gear/brake-left</property>
  <value type="double">1.0</value>    <!-- ブレーキは1.0に設定されます -->
  </binding>
   <mod-up>                    <!-- パーキングブレーキではないので、ボタンを離したら解除される必要があります -->
    <binding>
    <command>property-assign</command>
    <property>/controls/gear/brake-left</property>
    <value type="double">0.0</value>       <!-- 1.0 がONで、0.0 がオフです -->
   </binding>
  </mod-up>
</button>

初めのバインディングは簡単です:ボタンを押したら、property-assignコマンドが左ブレーキのプロパティ(この例では、/controls/gear/brake-left)の持つ値を1.0(この場合、フルブレーキ)に設定します。 しかし、次のバインディングは"mod-up"要素の入れ子の中にあり、ボタンを離したときに'property-assign'コマンドが実行され、左ブレーキの値を0.0(この場合、解除)に設定します。 同じ値を何度も割り当てないように、"repeatable"はデフォルトでオフになっています。

コマンドラインのオプションで同じことをするなら:

 --prop:/input/joysticks/js[0]/button[4]/binding/command=property-assign
 --prop:/input/joysticks/js[0]/button[4]/binding/property=/controls/gear/brake-left
 --prop:/input/joysticks/js[0]/button[4]/binding/value=1.0
 --prop:/input/joysticks/js[0]/button[4]/mod-up/binding/command=property-assign
 --prop:/input/joysticks/js[0]/button[4]/mod-up/binding/property=/controls/gear/brake-left
 --prop:/input/joysticks/js[0]/button[4]/mod-up/binding/value=0.0

各コンテキスト中に複数のバインディングを含むことができることを覚えておいてください。ここに、ボタン0が押された時に左右両方のブレーキを掛け、ボタンを離すと両方のブレーキが解除される、高度な例を挙げます。

 <button n="0">
  <desc>Brakes</desc>
  <binding>
   <command>property-assign</command>
   <property>/controls/gear/brake-left</property>
   <value type="double">1.0</value>
  </binding>
  <binding>
   <command>property-assign</command>
   <property>/controls/gear/brake-right</property>
   <value type="double">1.0</value>
  </binding>
  <mod-up>
   <binding>
    <command>property-assign</command>
    <property>/controls/gear/brake-left</property>
    <value type="double">0.0</value>
   </binding>
   <binding>
    <command>property-assign</command>
    <property>/controls/gear/brake-right</property>
    <value type="double">0.0</value>
   </binding>
  </mod-up>
</button>

これをXMLを使わず、同じことをコマンドラインオプションでやろうとするとこうなります。(

(複数のバインディングを区別するための添え字に注意してください;XMLは、自動的にこれをやってくれます。):
 --prop:/input/joysticks/js[0]/button[0]/binding[0]/command=property-assign
 --prop:/input/joysticks/js[0]/button[0]/binding[0]/property=/controls/gear/brake-left
 --prop:/input/joysticks/js[0]/button[0]/binding[0]/value=1.0
 --prop:/input/joysticks/js[0]/button[0]/binding[1]/command=property-assign
 --prop:/input/joysticks/js[0]/button[0]/binding[1]/property=/controls/gear/brake-right
 --prop:/input/joysticks/js[0]/button[0]/binding[2]/value=1.0
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[0]/command=property-assign
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[0]/property=brakes[0]
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[0]/value=0.0
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[1]/command=property-assign
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[1]/property=brakes[1]
 --prop:/input/joysticks/js[0]/button[0]/mod-up/binding[1]/value=0.0
 

デジタルHATスイッチ

多くのジョイスティックにはHATスイッチが付いています。これは軸というより、単に4つ(or8つ)のボタンですが、FGFSでは各軸の末端にそれぞれ仮想的なボタンを与えていて、これらの仮想ボタンは"low"と"high"の下位のプロパティを通して指定することができるので、一般のボタンのプロパティのどれでも受け入れることができます。

たとえば、あなたがちょうど表示方向をコントロールしたいならば、あなたは/sim/view/axes/long と /sim/view/axes/latのために、2本の軸を割り当てる事ができます。

<axis n="5">
 <binding>
  <command>property-adjust/command>
  <property>/sim/view/axes/lat</property>
  <step>2.0</step>
 </binding>
</axis>
<axis n="6">
 <binding>
  <command>property-adjust</command>
  <property>/sim/view/axes/long</property>
  <step>2.0</step>
 </binding>
</axis>
もしくは
 --prop:/input/joysticks/js/axis[5]/binding/command=property-scale
 --prop:/input/joysticks/js/axis[5]/binding/property=/sim/view/axes/lat
 --prop:/input/joysticks/js/axis[5]/binding/step=2.0
 --prop:/input/joysticks/js/axis[6]/binding/command=property-scale
 --prop:/input/joysticks/js/axis[6]/binding/property=/sim/view/axes/long
 --prop:/input/joysticks/js/axis[5]/binding/step=2.0
(訳注:この記述、特にプロパティ名は古いです。)

他にも、垂直/水平に2Dパネルをスクロールするために、ボタンとしてHATスイッチを使用したいなら、あなたは<high>と<low>を使用できます。

下記の例は、<high>と<low>を使って、軸をエレベータートリムの調整に使用する場合です。

<axis n="1">
 <low>
  <repeatable>true</repeatable>
  <binding>
   <command>property-adjust</command>
   <property>/controls/flight/elevator-trim</property>
   <step type="double">0.001</step>
  </binding>
 </low>
 <high>
  <repeatable>true</repeatable>
  <binding>
   <command>property-adjust</command>
   <property>/controls/flight/elevator-trim</property>
   <step type="double">-0.001</step>
  </binding>
 </high>
</axis>
 --prop:/input/joysticks/js/axis[1]/low/repeatable=true
 --prop:/input/joysticks/js/axis[1]/low/binding/command=property-adjust
 --prop:/input/joysticks/js/axis[1]/low/binding/property=/controls/flight/elevator-trim
 --prop:/input/joysticks/js/axis[1]/low/binding/step=0.001
 --prop:/input/joysticks/js/axis[1]/high/repeatable=true
 --prop:/input/joysticks/js/axis[1]/high/binding/command=property-adjust
 --prop:/input/joysticks/js/axis[1]/high/binding/property=/controls/flight/elevator-trim
 --prop:/input/joysticks/js/axis[1]/high/binding/step=-0.001

下のコマンドラインオプションで、リピート間隔を設定できます。リピート間隔を0.05秒にした場合、1秒間に20回繰り返されます。それには、下のオプションを追加してください。

 --prop:/input/joysticks/js/axis[1]/interval-sec=0.05

あなたは、いくつかの軸をブレーキに割り当てる事ができます。そのためには、0.0(ブレーキ無し)と1.0の間の位置を使うことができます(フルブレーキ)

キーボードの設定

キーボードのキーバインディングは、以下の例のようにジョイスティックのボタンのバインディングとほとんど同じです(コンテキストは/input/keyboardです):

<key n="1">
 <name>Ctrl-A</name>
 <desc>Toggle autopilot altitude lock.</desc>
 <binding>
  <command>property-toggle</command>
  <property>/autopilot/locks/altitude</property>
 </binding>
</key>

あなたはまず、いくつかの事に気が付くでしょう。 最初に、インデックス(<key n="m"&gt);で、あなたがバインディングする主要なコードを指定します。この例では、1は<name>で指定しているように、Ctrl+Aに相当します。 一般的にキーコードは255まであり、256より上はファンクションキー(Fn)や矢印キー等の特別なキーを意味します。 下記に、同じ働きのコマンドラインオプションを書きます。

 --prop:/input/keyboard/key[1]/binding/command=property-toggle
 --prop:/input/keyboard/key[1]/binding/property=/autopilot/locks/altitude

('propaty-toggle'コマンドは、trueとfalseの切り替えを行います。従って、プロパティ値以外の物は要りません。)インデックスを省略しないでください!!!

2つ目は、キーの方がジョイスティックのボタンよりも多くの修飾が出来ます。"mod-up"(キーを離した時に作動)に加えて、キーの場合は"mod-alt", "mod-ctrl", "mod-shift" を使う事ができます。 下に例を示します。

<key n="49">
 <name>1</name>
  <mod-shift>
  <desc>Look back left</desc>
  <binding>
   <command>property-assign</command>
   <property>/sim/view/goal-offset</property>
   <value type="double">135</value>
  </binding>
 </mod-shift>
</key>

翻訳開始 2009/0/22 sambar


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS