試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

GNU/Linux上のジョイパッドデバイスにおける軸とボタンの割り当て変更について(2009/7/16現在)

  1. アプリケーション側でボタン割り当てができないことがある
  2. コマンドによる方法
    1. ログイン時に自動で設定する
  3. GUIツールによる方法
  4. 関連:キャリブレーション
    1. jscalコマンドによる方法
    2. jstest-gtkによる方法

アプリケーション側でボタン割り当てができないことがある

ジョイパッドを用いるアプリケーションの多くはボタン割り当て機能を持っていて、機能に対して割り当てたいボタンを直接押す形で設定することができる。
しかし、アプリケーションによっては割り当て設定ができず、設定でボタン番号の割り当てを変更することができない。
例えば、「PLANEX USBゲームパッドコンバータ(PS/PS2対応・2ポート) PSX-CV02」というコンバータを接続したPlayStation 2のコントローラに(コントローラI使用時)おいてWine上のRPGツクール2000/2003作品*1を動かすと

  • ○(まる/circle)ボタン:キャンセル
  • ×(ばつ/cross)ボタン:決定

のような割り当てとなり、配置を変更することもできないため、キーボードよりも操作しづらくなる。
そういったときには、デバイス上の(実際の)ボタンとそのボタン番号との関連付けを変更し、割り当てを変えるのがよい。コマンドを用いる方法とGUIツールによる方法の両方があり、ともにここで扱う。また、軸についてもボタンと同様に割り当てを変更することができる。

コマンドによる方法

軸とボタンの再割り当て機能はもともとのjscalコマンドにはなかったのだが、Debian/Ubuntuの「joystick」パッケージでは標準でこの機能を提供するパッチ(button-axis-remapping.patch)が当たっている(再割り当て可能)。*2
Mandriva Linuxの「input-utils」にあるjscalにはパッチは当たっていないが、今回パッチ済みのパッケージを作成し、別館の配布ページに公開した。
(2014/10/12)配布ページは削除済み。
再割り当て対応版には-q-uというオプションが追加されている。
システムにインストールされているjscalにパッチが当たっているかどうかはヘルプを表示すると分かる。

(非対応版)
$ jscal -h  

Usage: jscal <device>

  -c             --calibrate         Calibrate the joystick
  -h             --help              Display this help
  -s <x,y,z...>  --set-correction    Sets correction to specified values
  -t             --test-center       Tests if joystick is corectly calibrated
                                       returns 0 on success, see the jscal
                                       manpage for error values
  -V             --version           Prints the version numbers
  -p             --print-correction  Prints the current settings as a jscal
                                       command line
(対応版)
$ jscal -h

Usage: jscal <device>

  -c             --calibrate         Calibrate the joystick
  -h             --help              Display this help
  -s <x,y,z...>  --set-correction    Sets correction to specified values
  -t             --test-center       Tests if joystick is corectly calibrated
                                       returns 0 on success, see the jscal
                                       manpage for error values
  -V             --version           Prints the version numbers
  -p             --print-correction  Prints the current settings as a jscal
                                       command line
  -q             --print-mappings    Print the current axis and button
                                       mappings as a jscal command line
  -u <n_of_axes,axmap1,axmap2,...,
      n_of_buttons,btnmap1,btnmap2,
      ...>       --set-mappings      Sets axis and button mappings to the
                                        specified values

まずは初期設定のボタン割り当て状況を確認する。jscal-qオプションを付けてジョイパッドのデバイスを指定する。1つしかなければ「/dev/input/js0」でもOK(本記事中の以下のデバイス名指定でも同様)。

(注意:例なのでデバイスや設定によって出力は異なる)
$ jscal -q /dev/input/by-id/usb-HuiJia_USB_GamePad-joystick
jscal -u 12,0,1,2,3,4,5,6,7,16,17,18,19,24,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311 /dev/input/by-id/usb-HuiJia_USB_GamePad-joystick

これは

  • 12の軸があり、それぞれ0,1,2,3,4,5,6,7,16,17,18,19という番号が振られている
  • 24のボタンがあり、それぞれ288,289,290,(中略),310,311という番号が振られている

ということを示す。上の出力における「12」「24」という値とその後ろの数字の数の対応に注意。
ここで、「GNU/Linux上でPlayStation 2のコントローラを使用する」に書いたように、手元のPLANEX USBゲームパッドコンバータ(PS/PS2対応・2ポート) PSX-CV02上のPlayStation 2のコントローラ(コントローラI使用時)では○(まる/circle)ボタンが1番(289)、×(ばつ/cross)ボタンが2番(290)となっている。Wine上のRPGツクール2000/2003作品ではこの2つを逆にしたいので、上のコマンドの出力結果をもとに

(注意:例なのでデバイスや設定によって出力は異なる)
$ jscal -u 12,0,1,2,3,4,5,6,7,16,17,18,19,24,288,290,289,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311 /dev/input/by-id/usb-HuiJia_USB_GamePad-joystick 

のように「289」と「290」を入れ替えたものをコマンドとして実行する。これで○(まる/circle)ボタンと×(ばつ/cross)ボタンが入れ替わり、次に再起動*3するまでの間有効となる。
軸を入れ替えるのも同じ要領で、軸5を軸3(Rx)、軸2を軸4(Ry)として使用したい場合は

(注意:例なのでデバイスや設定によって出力は異なる)
$ jscal -u 12,0,1,3,5,2,4,6,7,16,17,18,19,24,288,290,289,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311 /dev/input/by-id/usb-HuiJia_USB_GamePad-joystick

のようにする。
コントローラII使用時に再割り当てしたいキーや軸の設定も要領は同じで、どの番号をいじればよいのかを調べてその番号を変更する。

ログイン時に自動で設定する
コマンドを使用する方法のメリットとして自動化ができることがある。このコマンドをログイン時に自動実行されるファイルに記述しておけばよい。ログインにGDMを使用している場合は[ホームディレクトリ]/.xprofile
ファイル名: ~/.xprofile

jscal -u () /dev/input/by-id/[名前]

実行するコマンド行を含めておく。
これで毎回ログイン後に軸とボタンの割り当てがカスタム設定になるが、幾つかの割り当て設定を切り替えたりすることはできない。
後述のGUIツールではプロファイルとして幾つかの設定を管理できるようになっている。

GUIツールによる方法

pingus.seul.org/~grumbel/jstest-gtk/
jstest-gtkというツールが開発されている。

このツールはゲームパッドのテストも行えるが、軸とボタンの割り当て変更機能も搭載している。
2009年から開発が開始されているため、ディストリのパッケージになっていないことが多い。
バージョン0.1.0のビルドにはboostとgtkglextmmの開発パッケージが必要となっていたが、開発版では不要となった。代わりにexpatの開発パッケージが必要。
バージョン0.1.0では「Mapping」のボタンを押すと落ちてしまったが、開発版では改善されたのを確認。
左に軸、右にボタンの名前が順番通りに並んでいるので、これをドラッグ・アンド・ドロップで並び替えるだけで割り当てが変わり、すぐにテストすることができる。

今回Mandriva Linux向けのパッケージを作成し別館の配布ページに公開した。バージョン0.1.0には不具合があるので開発版をパッケージ化した。
(2014/10/12)配布ページは削除済み。

関連:キャリブレーション

アナログスティックを動かしたときに認識(入力)される値がスティックの位置とずれる場合や、動かしても値がうまく変動しない(急に飛んだりする)場合などには「キャリブレーション」という調整作業を行う。

jscalコマンドによる方法
jscalでは-cオプションで調整を行う。

$ jscal -c /dev/input/by-id/usb-HuiJia_USB_GamePad-joystick
(中略)
Move axis 0 to minimum position and push any button.
Axis 0:      [現在の位置に応じた値]

このように入力待ちの状態になるので、軸0(X軸)をいじって値が最小になるところ(一番左、9時の方向)に倒した状態で好きなボタンを押す。

Hold ... OK.                                                                  
Move axis 0 to center position and push any button.
Axis 0:      [現在の位置に応じた値]

次に今度は中央に戻した状態でボタンを押す。

Hold ... OK.                                                                  
Move axis 0 to maximum position and push any button.
Axis 0:      [現在の位置に応じた値]

今度は最大になるところ(一番右、3時の方向)に倒してボタンを押す。
これで軸0が調整され、以後同様に軸1から軸の数だけ同じ作業を繰り返す。軸1はY軸なので一番上(12時の方向)と中央、一番下(6時の方向)に対して同様に作業する。
スティック上に実際に存在しない(どこを操作しても値が変わらない)軸がある場合、その設定はそのままボタンを押して進めていく。
最後まで終わるとプログラムは終了し、調整後の設定で使えるようになる。その設定は一時的なものとなるが、-pオプションを用いると再設定を行うためのコマンド行が得られるので、自動的に設定したいときに役に立つ。

(注意:例なのでデバイスや設定によって出力は異なる)
$ jscal -p /dev/input/by-id/usb-HuiJia_USB_GamePad-joystick 
jscal -s 12,1,12,128,128,4194176,4227201,1,35,123,123,4364671,4067080,1,0,128,128,-2147483648,-2147483648,1,26,130,130,4129650,4294836,1,40,124,124,4329472,4098126,1,0,128,128,-2147483648,-2147483648,1,0,128,128,-2147483648,-2147483648,1,0,128,128,-2147483648,-2147483648,1,0,0,0,-2147483648,-2147483648,1,0,0,0,-2147483648,-2147483648,1,0,0,0,-2147483648,-2147483648,1,0,0,0,-2147483648,-2147483648 /dev/input/by-id/usb-HuiJia_USB_GamePad-joystick

jstest-gtkによる方法
バイスごとのダイアログから「Calibration」ボタンを押し、更にダイアログから「Start Calibration」を押すと「CalibrationWizard」という小さなダイアログが出るので、指示通り

  1. 各スティックに対して最小値と最大値になる位置に少なくとも1回は動かしておく(端っこのどこかに倒してから一周させてもOK)
  2. 動かしたそれぞれのスティックを全て中央に戻す
  3. 「OK」を押す

と作業することで調整が完了する。

使用したバージョン:

  • Linux 2.6.27.24
  • input-utils 20061008 + Debianのパッチ群
  • jstest-gtk 20090618(git版)

*1:XPやVXの作品ではF1キーで出るダイアログから割り当て変更ができる

*2:パッケージの変更履歴によると20051019-3というバージョンからとなっている

*3:uswsuspやTuxOnIceなどで「休止」をした場合は変更が保持される