FrontPage
注意:本文書はFlightGear2.9.0以前のものを対象としていますが、FlightGear 2.10.0以降でも手動で設定する場合に有用と思われるため、名前を変えて残しています。
2.10.0以降で、より簡単にジョイスティックを設定する方法はジョイスティックの設定を参照ください。
手動設定ガイド †
[Joystick Information] の確認 †
- ジョイスティックをつないだ状態でFlightGearを起動し、[Help] > [Joystick Information] をクリック
- グレー表示でクリック出来ない場合:
- システムがジョイスティックを認識していないようです。
ジョイスティックが正しく接続されていることを確認してください。
Driver: 行の確認 †
- Driver: C:/Program Files/FlightGear/data/Input/Joysticks/メーカ名/機種名.xml となっている場合
- 自動認識されているので追加設定は不要です。そのままお使いください。
- Driver: C:/Program Files/FlightGear/data/Input/Joysticks/Default/joystick.xml となっている場合
- 自動認識が正常に機能しなかったため、汎用のジョイスティック定義ファイルをロードしています。
このため、基本的な操作しかできません。ジョイスティックの軸やボタンをフル活用するためには、次の手順に進んでください。
Joystick #0: 行の確認 †
- 文字化けしている場合:
- Vistaでこの現象が発生するようです。
自動認識させることはできませんが、手はまだあります。
ひとまず手順2に進んでください。
- "Saitek X45 Flight Controller"のように正常に表示される場合:
自動認識させることができるかもしれません。
同じく手順2に進んでください。
ジョイスティック定義ファイルの調査 †
- FlightGear をインストールしたフォルダ内のFlightGear/data/Input/Joysticksフォルダをたどり、
使おうとしているジョイスティックの機種に該当しそうなジョイスティック定義ファイル(メーカ名/機種名.xml)が存在するかどうかを探します。
- 存在する場合: もうすぐ設定完了です。手順3に進んでください。
- 存在しない場合:
- 残念ですが、既存のジョイスティック定義ファイルを雛形とし、jsdemo.exe でボタン動作の確認をしながら自分用のジョイスティックファイルを作成しなくてはなりません。
- 作成方法については、以下の「ジョイスティック定義ファイルの作成」をご覧ください。
- 基本的な操作のみでも構わなければ、汎用のジョイスティック定義ファイルのまま使用する、という選択肢もあります。
$FG_ROOT/joysticks.xmlの修正 †
手順1.2でJoystick #0: が文字化けしていた場合: †
- 再び手順1.の [Joystick Information] を確認し、正しく設定ファイルをロードしていれば完了です。
手順1.2でJoystick #0: が"Saitek X45 Flight Controller"のように正常に表示されていた場合: †
- 再び手順1.の [Joystick Information] を確認し、正しく設定ファイルをロードしていれば完了です。
ジョイスティック定義ファイルの作成 †
さて、先ほど「残念ですが」と言いましたが、「FlightGearの内部構造に触れる」チャンスでもあります。
実は、翻訳文書の「訳)特徴」の、「内部プロパティは公開されています」
で出てきた「プロパティツリー」の値を書き換えることで飛行機を操作しています。
少々面倒に感じるかもしれませんが、ここを理解しておくと後々ジョイスティックの設定のカスタマイズをするときが楽です。
設定の前に †
Windows版では、FlightGearのインストール先を"C:\Program Files\FlightGear"に。
MacOSX版では、"/Applications"にインストールしていると仮定します。もし違う場所にインストールしている場合は読み替えてください。
js_demoの入手方法 †
本来ならjs_demoはFlightGearに同梱されている(べき)なのですが、Windows版、MacOSX版のFlightGear 1.9.0以降では省略されています。
Windowsの場合 †
http://flightgear.jpn.org/modules/d3downloads/index.php?page=visit&cid=6&lid=20をダウンロードして、
C:\Program Files\FlightGear\binフォルダに保存してください。
MacOSXの場合 †
http://flightgear.jpn.org/modules/d3downloads/index.php?page=visit&cid=6&lid=23をダウンロードして、
解凍してできた js_demo を
/Applications/FlightGear.app/Contents/Resourcesフォルダに保存してください。
js_demoの起動 †
ここでは、js_demoの起動方法だけを書きます。出力結果の読み方は後で説明します。
Windowsの場合 †
先ほど入手したjs_demoをコマンドプロンプトから起動してください。
c:\
cd "\Program Files\FlightGear\bin"
js_demo.exe
MacOSXの場合 †
先ほど入手したjs_demoをダブルクリックで、またはターミナルから起動してください。
cd /Applications/FlightGear.app/Contents/Resources
./js_demo
js_demoの出力結果の読み方と、操作割り当ての決定手順 †
Joystick test program.
~~~~~~~~~~~~~~~~~~~~~~
Joystick 0 is "Saitek X45 Flight Controller"
Joystick 1 not detected
+---------------JS.0-----------------+---------------JS.1-----------------+
| Btns Ax:0 Ax:1 Ax:2 Ax:3 Ax:4 Ax:5 Ax:6 Ax:7 | ~~~ Not Detected ~~~ |
+------------------------------------+------------------------------------+
| 0000 +0.1 -0.0 +1.0 +1.0 +1.0 -1.0 +0.0 +0.0 | . . . . . . . . . |
| 0000 +0.1 -0.0 +1.0 +1.0 +1.0 -1.0 +0.0 +0.0 | . . . . . . . . . |
| 0000 +0.1 -0.0 +1.0 +1.0 +1.0 -1.0 +0.0 +0.0 | . . . . . . . . . |
| 0000 +0.1 -0.0 +1.0 +1.0 +1.0 -1.0 +0.0 +0.0 | . . . . . . . . . |
最初の何行かの出力はスクロールが早くて画面を通り過ぎてしまうでしょう。その場合はCtrl-Cでプログラムを止めてください。
まず、最初の "Joystick 0 is "Saitek X45 Flight Controller" の行はジョイスティックの名前です。
先ほどの「1.2 Joystick #0: 行の確認」で認識された名前と同じ物になっていると思います。
ただし、日本語版WindowsVistaでは "Microsoft PC ジョイスティック ド"となりますが、この名前はFlightGearで使用できません。もしこの名前を使用した場合、fgfs.exeがnot-well-formedエラーで異常終了します。
次に、出力の読み方の解説をします。
左側の「JS:0」に注目してください。「JS:1」は繋いでいないのでドットが並んでいるだけですが、接続すれば当然ここにも数値が並びます。
一番左の列の値がボタンの状態を示していて、軸0〜軸7の順で各軸の状態を示しています。
- 初めに、何か適当に操作してみてください。ジョイスティックを何か操作して、初めてジョイスティックを何か操作する事で、初めて状態が反映される場合があります。
- モード切り替えスイッチを「ボタン」として検出している場合があります。その場合、ボタンの値はゼロにならない場合があります。
- その場合、モード切替スイッチを操作して、その値を記録してください。
- モード切替スイッチのチェックが終わったら、それ以外のボタンを押して一番左の列の数字を記録してください。
- 他のボタンについてもこのチェックを繰り返してください。
- 次に、スティックを左右に倒して、「どの軸の数値が変化するか」を確認してください。
- その軸の、「中立位置での値」「右一杯に倒した時の値」「左一杯に倒した時の値」を確認して、メモしてください。
- 同様に他の軸についてもチェックしてください。
- HAT(POV)スイッチを操作してください。HATスイッチがボタンとして認識されるか軸として認識されるかは、ジョイスティックによって違うでしょう。
すると、以下のような表ができると思います。
さて、スティックのどの軸/ボタンに何を割り当てるかは人それぞれなので、私がPS2ジョイパッド+変換器 のジョイスティック定義ファイルを書いた時の一例を挙げます。
もし、適切な役割が思い浮かばない場合、取り合えず何も設定せず、必要になった時にその都度追加していけばいいでしょう。
- 軸
軸番号 | 実際の軸 | 方向 | 備考 |
0 | 左スティック左右 | 右に操作して正 | エルロン |
1 | 左スティック上下 | 上に操作して正 | エレベータ |
2 | 右スティック左右 | 右に操作して正 | ラダー |
3 | 右スティック上下 | 上に操作して正 | エレベータトリム |
4 | N/A | N/A | この軸は無い |
5 | N/A | N/A | この軸は無い |
6 | 左右ボタン | 右に操作して正 | POV左右 |
7 | 上下ボタン | 上に操作して正 | POV上下 |
- ボタン
ボタン番号 | 数値 | 実際のボタン | 役割 |
N/A | 0000 | | |
0 | 0001 | △ | ラダートリム(右) |
1 | 0002 | ○ | ミクスチャ リッチ |
2 | 0004 | × | ミクスチャ リーン |
3 | 0008 | □ | ラダートリム(左) |
4 | 0010 | L2 | スロットル閉 |
5 | 0020 | R2 | スロットル開 |
6 | 0040 | L1ボタン | プロペラ回転下げ(高ピッチ) |
7 | 0080 | R1ボタン | プロペラ回転上げ(低ピッチ) |
8 | 0100 | スタート | セルモータを回す |
9 | 0200 | セレクト | 見る方向をリセット |
10 | 0400 | L3 | 車輪ブレーキ |
11 | 0800 | R3 | 使用せず |
実際にXMLファイルを記述する †
これは、ジョイスティックの自動認識の結果を上書きして、使用するジョイスティック定義ファイルを明示的に指定します。
実際のところ、2バイト文字を含まないファイル名なら何でもいいですので、わかり易い名前にしておいてください。
(他のジョイスティック定義ファイル同様、$FGROOT\Input\Joysticks\メーカー名\機種名.xml、としておく事をお勧めします。)
ジョイスティック設定ファイルを実際に書く †
多くの場合、「既存のジョイスティック定義ファイルを元に・・・」と解説されますが、ここでは「イチからファイルを書く」場合を解説します。
もちろん、既存のジョイスティック定義ファイルの中に、あなたが使いたいジョイスティックとボタン/軸の数が同じで、割り当てられた機能が似通っていればそれを流用してもかまいません。
- まず、<axis n="軸番号">に変更して、どの軸か指定します。
- 軸の概要を<desc>タグと</desc>タグの間に書きます。(<desc>Ailone</desc>
- デッドバンドを設定したい場合、<dead-band>と<dead-band>の間の数字を変更します。<dead-band>0.1<dead-band>とか。
- また、動かした方向「だけ」が必要な場合は<high>と<low>の2種類のタグを使う事ができます。
- <command>と</command>の間に、使いたいコマンドを書きます。コマンドは大体以下の通りです。(軸で使うのに適さない、という理由で省略したものもあります)
- property-scale:生のジョイスティックの出力を加工してプロパティの値にします。オプションは以下の通りです。
- 優先順位はdead-band,offset,factorの順です。別の表現をすれば、cooked_value = (( raw_value > dead-band ) + offset) * factor となります
- property-adjust:一度実行される毎に値をstepだけ増やします。
- <property>設定したいプロパティ</property>で設定したいプロパティを選択します。
- <step>一度の動作で増やす量</step>(負の数を指定するとstepだけ減らす事ができます)。先述の<high><low>と同時に利用すると使いやすいです。(さっきも出てきました)
- nasal:nasalスクリプトを実行します。
- <script>タグと</script>タグの間にスクリプトを書いてください。最近はnasal経由で色々なプロパティを操作する事が多いです。詳しくは後述します。
- 全ての軸の設定が終わるまで、これを繰り返します。
- それが終わったら、以下の物をボタンの数だけコピー&ペーストしてください。
<button n="">
<desc></desc>
<repeatable>false</repeatable>
<binding>
<command></command>
</binding>
</button>
- まず、<axis n="ボタン番号">に変更して、どのボタンか指定します。
- ボタンの概要を<desc>タグと</desc>タグの間に書きます。(<desc>gear down/gear up</desc>
- リピート動作させたい場合は、<repeatable>のところを、以下のように変更してください。
<repeatable>true</repeatable>
- <command>と</command>の間に、使いたいコマンドを書きます。コマンドは大体以下の通りです。(ボタンで使うのに適さない、という理由で省略したものもあります)
- property-adjust:一度実行される毎に値をstepだけ増やします。
- 全て終わったら</PropertyList>と書いて、保存してください。
操作すべきプロパティ †
- 操縦翼面
- /controls/flight/aileron
- エルロンです。-1〜+1の範囲のdouble形で、左方向が負、中心がゼロ、右方向が正になります。
- /controls/flight/elevator
- エレベータです。-1〜+1の範囲のdouble形で、機首上げ側が負、中心がゼロ、機首下げ側が正です。
- /controls/flight/rudder
- ラダーです。-1〜+1の範囲のdouble形で、左方向が負、中心がゼロ、右方向が正になります。
- /controls/flight/elevator-trim
- エレベータトリムです。機首上げ側が負、中心がゼロ、機首下げ側が正です。
- /controls/flight/rudder-trim
- ラダートリムです。-1〜+1の範囲のdouble形で、左方向が負、中心がゼロ、右方向が正になります。
- エンジン関係
- /controls/engines/engine[0]/throttle
- 第一エンジンのスロットルです。double形で、0で最小、1でフルスロットルになります。
- /controls/engines/engine[0]/mixture
- 第一エンジンのミクスチャーです。double形で、0で最小、1で燃料が一番濃くなります。
- /controls/engines/engine[0]/propeller-pitch
- 第一エンジンのプロペラピッチです。double形で、0で最小回転数、1で最大回転数になります。
なお、第二エンジンの場合、操作すべきプロパティが/controls/engines/engine[1]/・・・・・・といったようになります。
エンジンの数が変わってもジョイスティックの設定をわざわざ変えなくてもいいように、エンジン関係はnasal経由で操作する事が多いです。
- 車輪関係
- /controls/gear/brake-left
- 左車輪のブレーキです。double形で、0でブレーキ解除、1でフルブレーキになります。
- /controls/gear/brake-right
- 右車輪のブレーキです。double形で、0でブレーキ解除、1でフルブレーキになります。
- /controls/gear/brake-parking
- 駐機用ブレーキです。double形で、0でブレーキ解除、1でブレーキをセットします。
nasalスクリプトの使い方 †
- また、特に引数を与えずに呼び出す場合もあります。
- 以下の例は、スロットル制御をnasalで行う例です。
<axis n="2">
<desc>Throttle</desc>
<binding>
<command>nasal</command>
<script>controls.throttleAxis()</script>
</binding>
</axis>
- 参考資料(controls.nasより)
# Joystick axis handlers (use cmdarg). Shouldn't be called from
# other contexts. A non-null argument reverses the axis direction.
var axisHandler = func(pre, post) {
func(invert = 0) {
var val = cmdarg().getNode("setting").getValue();
if(invert) val = -val;
foreach(var e; engines)
if(e.selected.getValue())
setprop(pre ~ e.index ~ post, (1 - val) / 2);
}
}
var throttleAxis = axisHandler("/controls/engines/engine[", "]/throttle");
var mixtureAxis = axisHandler("/controls/engines/engine[", "]/mixture");
var propellerAxis = axisHandler("/controls/engines/engine[", "]/propeller-pitch");
var carbHeatAxis = axisHandler("/controls/anti-ice/engine[", "]/carb-heat");
- この例では、変数throttleAxisを呼び出した後は以下のように働きます。
- axisHandler()関数が呼び出される
- nasalに組み込まれているcmdarg()関数を通して軸の値を取得する
- その値を(1-val)/2 した物をsetprop()関数でスロットルの値を設定します。
- ↑を機体のエンジン数だけ繰り返し実行します。
多くの場合、「欲しい機能を与えてくれるnasal関数は何か」と、「その関数への引数」さえ知っていれば、実際の関数内部でどう動いているかはブラックボックスでも大丈夫でしょう。
以下でジョイスティックの設定に使える関数と引数を簡単に説明します。
- controls.gearDown(n)
- 車輪の上げ下げをします。
- 引数: n=-1で脚上げ、n=1で脚を下げます。n =0なら何もしません。
- controls.flapsDown(n)
- フラップの上げ下げをします。
- 引数:n=-1でフラップを(最大フラップに対して)33%上げ、n=1でフラップを33%下げます。n=0だと何もしません。
- controls.gearToggle()
- ギアの上げ下げをトグルします。controls.gearDown()と違い、ギアが上がっていれば下げ、下がっていれば上げます
- controls.startEngine()
- controls.selectEngine()又はcontrols.selectAllEngines()で選択したエンジンのセルモーターを回します。
- controls.selectEngine(n)
- 操作したいエンジンを選択します。
- 引数:エンジン番号(n=0で第一エンジン、n=1で第二エンジン・・・)
- controls.selectAllEngines()
- props.setAll(base , child , value)
- view.panViewDir(step)
- 視界を左右に動かします。
- 引数: step度ずつ視界を左右に動かします。正の値で右、負の値で左を見ることが出来ます。
- view.panViewPitch(step)
- 視界を上下に動かします。
- 引数: step度ずつ視界を上下に動かします。正の値で上、負の値で下を見ることが出来ます。
- view.resetView()
- 視点をリセットします。x/Xキーでズームしていた場合、解除されます。
ちょっと凝った設定 †
- 「ボタンを離した時に動作」させたいなら、</binding>の後ろに<mod-up>を付け加え、更に<binding>タグを付け加え、適切なコマンドとオプションを与えてから、</binding></mod-up>で閉じます。
- また、一つの軸やボタンで複数のプロパティの操作を割り当てることも出来ます。
これはスロットルなどに使えました・・・が、前述の通り今はnasalコマンドを使用する場合が多いです。
関連文書 †
さらに細かくカスタマイズしたい、といった場合は訳)ジョイスティック・キーボードの設定方法を参照願います。
- 新規作成 2009/03/29 sambar
- ちょっと整形&js_demoの出力のところを一部修正 2009/03/29 21:09 sambar
- nasalの部分を追加開始 2009/03/29 23:41 sambar
- js_demo導入のMac版を作成 2009/03/30 00:53 MiYABi
- nasalの部分の追加終了 2009/03/31 sambar
- 本メモ欄をリスト化 toshi
- SPAMにより削除された内容を復活 toshi
- 再びSPAMにより書き換えられたため、管理者権限でページ名を「ジョイスティックの設定方法」から「ジョイスティックの設定」に変更 toshi
- 管理者権限で暫定的にページ名を「ジョイスティックの設定(旧版)」に変更。当面は手動設定ガイドとして活用(将来的には訳)ジョイスティック・キーボードの設定方法)との統合も検討 sambar &new{2013-02-02}