翻訳作業場トップページ このドキュメントは $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 line | STDIN | see examples | そのセッションのみ |
.fgfsrc | ~/ | コマンドラインオプション | 現在のユーザーのみ |
system.fgfsrc | $FG_ROOT | コマンドラインオプション | システム全体 |
joystick.xml | $FG_ROOT | XMLプロパティリスト | システム全体 |
keyboard.xml | $FG_ROOT | XMLプロパティリスト | システム全体 |
訳者注:以降、joystick.xmlとkeyboard.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進数での表現 | 押したボタン |
0001 | 000000000000001 | button 0 |
0002 | 000000000000010 | button 1 |
0004 | 000000000000100 | button 2 |
0008 | 000000000001000 | button 3 |
0010 | 000000000010000 | button 4 |
0020 | 000000000100000 | button 5 |
0040 | 000000001000000 | button 6 |
0080 | 000000010000000 | button 7 |
000a | 000000000001010 | button 1 とbutton 3 の同時押し |
・・・といった要領で8000(button 15)まで続きます。 (訳注:16進数で表示されることを強調するため、0014から000aに変更)
先ほど集めたUSBジョイスティック(orジョイスティックポート)からの出力が何であるか分かったので、あなたは多分FGInputを今すぐ使いたいと思っているでしょう。もしこれ以前のFGFSのバージョンでジョイスティックを設定するのに慣れているなら、あなたは「コマンドマネージャ」をセクションまでスキップできます。 もし、新しいFGFSユーザーなら、いくつかの概念がわかるので、あなたは次の項を読んでください。それはまた、コマンドマネージャでまだ実装されていない、古いジョイスティックオプションをカバーします。
これらのコンセプトは、ジョイスティックバインディングに理由付けする事です。 生の値をそのままジョイスティックの軸として使う事が適切でない場合があります。また、ベストパフォーマンスを得るために実験を重ねる場合、基本概念があなたを救うことを理解してください。また、全てのジョイスティックが同じ状態で作られるとは限りません。(訳注:必ず製造時に誤差を含んでいます)
軸のプロパティに対する修正順序はこのようになっています。
別の表現をすれば、下記のようになります。 cooked_value = (( raw_value > dead-band ) + offset) * factor
軸のプロパティは以下の通りです。
-1 0 1 ............... -1 | | 1 ^ dead-band
このエリア内の信号は無視されます。どんな信号も無視される範囲を作成することによってノイズや、品質の悪い電圧計/可変抵抗を補います。 dead-bandは0位置に依存します。 デフォルトの、エレベーターとエルロンのための0.1の設定はガク引きに対して寛容です。数値を小さくすると、よりきつい感じをもたらします。 スロットル等、いくつかの場合では、あなたはdead-bandを設定したがっていないかもしれません。 この場合0.0の値を使用してください。
-1 0 1 ............. -1 ^ 1 offset
軸の操作範囲を広げたい場合に使用します。スロットル等、0が最小値になる場合で、ラダー等とは違ってセンターが無い場合に使用します。標準的には-1.0を使用します。
ジョイスティックのジッターの補償に使われて、toleranceの本質は「gate」です。 それに満たないジョイスティックの動きは無視されます。dead-bandとは異なり、toleranceは軸がいったいどこで落ち着いているか、で決まります。
軸の操作量に対する「倍数」です。この値が小さいと、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-toggle | property | 指定したプロパティの値のオン/オフ(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タグが他のタグに先行しなければならないことを意味します。もしコマンドラインを使用するなら、'binding'を省略し、同様に下記のようにしてください。
--prop:/input/joysticks/js[0]/axis[2]/dead-band=0.005
ボタンは本来ブーリアン型(true,falseの2つの値だけで表すデータ形式で、少しの事に使うことができます。これによって、瞬間的な動作、繰り替えし動作、普通の切り替え操作に使うことが出来ます。簡単にそれらができるように、ボタンの機能を変更するいくつかのタグがあります。
このサンプルは、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
翻訳開始 2009/0/22 sambar