[[翻訳作業場トップページ]] このドキュメントは $FG_ROOT/Docs/Readme.Joysticks.htmlの日本語訳です。 ---- #contents #br *ジョイスティック・キーボードの設定方法 [#d239370e] 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.(ここは未翻訳 ) #br *いくつかの歴史 [#ye2ba402] 初期のFGFSのジョイスティックの軸(Axis)/ボタン(button)と、キーバインディングはハードコードされていました。もしデフォルトのジョイスティックの設定を使用しない、もしくは違うキーバインディングを使いたい場合、ソースコードを修正して再コンパイルする必要がありました。 幸運な事に、v0.7.5.aの頃に"プロパティマネージャ"が与えられ、ジョイスティックで簡単にパラメータをセットできるようになりました。 バージョン0.7.7ではプロパティマネージャの役割が拡張され、イベントとコマンドを束ねることが出来るようになりました。 このコードは、FGInputとして知られていて、ジョイスティックと同様にキーボードのコマンドバインディングを構成するのに使用されます。 バージョン0.7.9では条件付けが許容され、編集された決定ツリーを加えました。(修正希望) #br *最も重要な事: [#a1f4d364] 私は、ジョイスティックとキーボードについては後で書くつもりです。 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についての解説が主体となります。 #br *XMLについて [#w26b48de] あなたがこれを疑問に思っている時のために、XMLは「eXtensible Markup Language」と書いておきます。 これは、HTMLに非常に似ていますが、(訳者追記:XML文書に使う場合に限って言えば)あなた自身で定義したタグを使用できます。 さて、FGFSの場合では、私たちはあなたがジョイスティック/キーボードを構成するために必要とするタグを定義しました。XMLは階層的に組織化された構造を記述するのに適しています。FGFSで使用しているプロパティツリーのような、外部のアプリケーションへの内容です。あなたは、FGFSのためにXMLファイルを設定するには、以下の開始タグと終了タグをペアで記述しなければなりません。 <PropertyList> <!-- HTMLと同じように、<!-- -->で囲った部分はコメントです。 --> </PropertyList> #br *ジョイスティックの出力を、どのプロパティに割り当てるか決める [#c43303c1] 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に変更) #br *デフォルトでのジョイスティックのプロパティ [#f5c9d9eb] -Axis 0 = エルロン -Axis 1 = エレベータ -Axis 2 = ラダー -Axis 3 = スロットル -Button 0 = 両車輪のブレーキ -Button 1 = エレベータトリム (up) -Button 2 = エレベータトリム (down) #br *じゃあ、今度は何をするか [#x0b59a46] 先ほど集めたUSBジョイスティック(orジョイスティックポート)からの出力が何であるか分かったので、あなたは多分FGInputを今すぐ使いたいと思っているでしょう。もしこれ以前のFGFSのバージョンでジョイスティックを設定するのに慣れているなら、あなたは「コマンドマネージャ」をセクションまでスキップできます。 もし、新しいFGFSユーザーなら、いくつかの概念がわかるので、あなたは次の項を読んでください。それはまた、コマンドマネージャでまだ実装されていない、古いジョイスティックオプションをカバーします。 #br *「生」のジョイスティックの値を修正する [#cbc006b8] これらのコンセプトは、ジョイスティックバインディングに理由付けする事です。 生の値をそのままジョイスティックの軸として使う事が適切でない場合があります。また、ベストパフォーマンスを得るために実験を重ねる場合、基本概念があなたを救うことを理解してください。また、全てのジョイスティックが同じ状態で作られるとは限りません。(訳注:必ず製造時に誤差を含んでいます) 軸のプロパティに対する修正順序はこのようになっています。 +生のジョイスティックの値 +デッドゾーン(dead-band,入力を無視する範囲)をフィルタリングします。(deadbandは、コマンドマネージャの外で実行されます。) +オフセット(offset,中心からのズレ)を修正します。 +3までの値に、factorを乗算します。 +この結果が得られた値を、FlightGearのプロパティのコントロールに使用します。 別の表現をすれば、下記のようになります。 cooked_value = (( raw_value > dead-band ) + offset) * factor 軸のプロパティは以下の通りです。 #br **dead-band [#sb679174] -1 0 1 ............... -1 | | 1 ^ dead-band このエリア内の信号は無視されます。どんな信号も無視される範囲を作成することによってノイズや、品質の悪い電圧計/可変抵抗を補います。 dead-bandは0位置に依存します。 デフォルトの、エレベーターとエルロンのための0.1の設定はガク引きに対して寛容です。数値を小さくすると、よりきつい感じをもたらします。 スロットル等、いくつかの場合では、あなたはdead-bandを設定したがっていないかもしれません。 この場合0.0の値を使用してください。 #br **offset [#y0ee6b80] -1 0 1 ............. -1 ^ 1 offset 軸の操作範囲を広げたい場合に使用します。スロットル等、0が最小値になる場合で、ラダー等とは違ってセンターが無い場合に使用します。標準的には-1.0を使用します。 #br **tolerance [#n6d52d91] ジョイスティックのジッターの補償に使われて、toleranceの本質は「gate」です。 それに満たないジョイスティックの動きは無視されます。dead-bandとは異なり、toleranceは軸がいったいどこで落ち着いているか、で決まります。 #br **factor [#l2b4f852] 軸の操作量に対する「倍数」です。この値が小さいと、FGFS上での操作限界に達しないコントロールしかできなくなります。 負の数を設定すると、軸の操作とFGFS上での動きが反対になります。デフォルト値は1.0です。 筆者のケースでは、スロットルを逆向き(手前に引くとスロットルを開く設定)にしたかったため、-1.0を設定しました。 (訳注:第二次世界大戦の頃まではフランス機のように「スロットルレバーを手前に引いて開き、奥に押して閉じる」機種もあったので、それを再現するためだと思われる。ちなみに、旧日本軍は陸海軍でそれぞれ違ったそうな。) #br *コマンドマネージャ: [#ba642863] 以前のFGFSはジョイスティックの出力で直接プロパティマネージャーを操作していました。FGFS v0.7.7以降は、操作した時にイベントを発生させてコマンドを実行するように変更されました。バインディングは効果があるようなコマンドを「指定しなければなりません」。都合が良いことに、コマンドのリストは2種類に分けられます。 #br **描画・ファイル関連 [#p0bf74c9] ,コマンド,オプション,用途 ,null,なし,前のバインディングをクリアします。(翻訳自身なし・・・まあ使う機会もあまり無いか) ,exit,なし,FGFSを終了します。 ,load,ファイル名(注1),フライトのロード ,save,ファイル名(注1),フライトのセーブ ,load-panel,パス(注2),パネルの変更/再読み込み ,load-preferences,パス(注2),設定のロード (注3) ,screen-capture,なし,./fgfs-screen.ppmにスクリーンショットの保存 ,view-cycle,なし,パイロットの視点の方向を変える -(注1)セーブ/ロードは現在の作業ディレクトリに依存します。 -(注2)パスはあなたがロードしたいファイルを含んでいて、$FG_ROOTを基準にしています。そして、それはベースパッケージの位置でもあります。デフォルト値は、/sim/panel/path (preferences.xmlより) か、preferences.xmlにセットしていないならPanel/Default/default.xmlです。デフォルト値はpreferences.xmlで設定したものになります。 -(注3)これは、何もバインディングされていないので、初めに実験するには良いかもしれません。設定を再ロードすることで、FGFSのリスタートをすることなく、色々な設定をテストすることができます。あなたは、後でそれを移動/削除することができます。 #br **飛行機の制御 [#z3a44764] ,コマンド,オプション,効果 ,property-toggle,property,指定したプロパティの値のオン/オフ(true/false)の切り替え ,property-assign,"" "", value, 指定したプロパティの値を指定したものに変える ,property-adjust,"" "", step,一度操作する毎にstepだけ増やす ,property-swap,"" ""[0], "" ""[1],2つのプロパティの値を入れ替える ,property-scale,"" "", offset, factor, 生のジョイスティックの値を先述通り処理してプロパティに与える #br *バインディング [#x3338d51] 一つのコマンドを<binding> </binding>で束ねることで、1つのボタン/軸に複数のコマンドを割り当てる事ができます。 バインディングがXMLで指定されていると、インデックスがなぜか自動的に作成されます。もしXMLを避けたいならば、複数のバインディングをコマンドラインオプションで指定しなければいけません。 #br *ジョイスティックの軸 [#qd615b25] これは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の設定は簡単で、(訳注:何かを作ってくれる事が)ユーザー全員のためにもなります。 #br 本題に戻りましょう。"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についての重要事項 [#sef7dec7] あなたは、先述の「ジョイスティックの値を修正する」セクションに書かれていた通り、dead-bandがコマンドマネージャの外で実行されることを思い出してください。 これは、デッドバンドを適用したいなら、dead-bandタグが他のタグに先行しなければならないことを意味します。もしコマンドラインを使用するなら、'binding'を省略し、同様に下記のようにしてください。 --prop:/input/joysticks/js[0]/axis[2]/dead-band=0.005 #br *ジョイスティックのボタンのプロパティ [#r52cc4a0] ボタンは本来ブーリアン型(true,falseの2つの値だけで表すデータ形式で、少しの事に使うことができます。これによって、瞬間的な動作、繰り替えし動作、普通の切り替え操作に使うことが出来ます。簡単にそれらができるように、ボタンの機能を変更するいくつかのタグがあります。 **<repeatable> [#udf46e42] -trueかfalseを指定します。trueだった場合、ボタン(orキー)を押している間、繰り返しイベントが発生します。下記の例では、押している間中イベントが発生し続け、その結果、押している間中トリムが変化します。falseだった場合、押し続けても、1度だけイベントが発生します。デフォルトではfalseです。 **<step> [#qc7c8989] -proparty-adjustコマンドに、一度ボタンを押すごとに変化する量を指定します。下記の例ではイベントが1度発生するごとにエレベータトリムを0.1%動かします。(リピートしなければ、指がかなり痛くなるでしょう。) **<value> [#w73e617d] -繰り返しイベントでない場合、押した結果プロパティに与えられる値を指定します。 **<mod-up> [#xd6179bd] -これは、"modifier 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 #br *デジタルHATスイッチ [#u268fad3] 多くのジョイスティックには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の間の位置を使うことができます(フルブレーキ) *キーボードの設定 [#k1d54a0b] キーボードのキーバインディングは、以下の例のようにジョイスティックのボタンのバインディングとほとんど同じです(コンテキストは/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'''">);で、あなたがバインディングする主要なコードを指定します。この例では、'''1'''は<name>で指定しているように、Ctrl+Aに相当します。 一般的にキーコードは255まであり、256より上はファンクションキー(F'''n''')や矢印キー等の特別なキーを意味します。 下記に、同じ働きのコマンドラインオプションを書きます。 --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