ROSでPS4のコントローラ(DualShock4)を使う方法

はじめに

ROSでPS4コントローラの入力を取得する方法およびキーアサインについて説明します。

最近になって私もROS勉強会ROSハッカソンに参加しはじめましたが、多くの人がいまだにPS3のDualShock3コントローラ(DS3)を使っているのを見かけます。
しかしPS4のDualShock4(DS4)のほうがスティックとL2R2トリガーの操作性がだんぜん良いのでオススメです。特にドローンのスラスト制御(プロペラの回転速度制御)等をR2トリガー等で行う場合、トリガーのリニアリティ(直線性)がDS4だととても良く、精密なマニュアル操作がしやすいです。 PCにBluetooth機能がついていれば、ワイヤレスで使うこともできます。

環境

本記事と同様の手法で、Jade/Indigoでも動作確認済みです。ただし無線接続の場合、Bluetoothバイスの相性によってはds4drvがうまく動かない場合があります。

DualShock4を有線で使う

有線の場合、DS3と似たような感じで簡単です。

  1. PCとDS4をMicroUSBケーブルで接続
  2. ROSのjoyパッケージをインストール
    • sudo apt-get install ros-<DISTRO>-joy
  3. joy_nodeを起動
    • rosrun joy joy_node

これだけです。
rostopic listをすると/joyというトピックが見つかり、これをrostopic echoすると、sensor_msgs::Joy型のメッセージが見えます。 あとはこのmessageをsubscribeして、ボタンやスティックの値に応じた処理を書けばOKです。

PCにDS4を接続すると、通常は/dev/input/js0に認識されます。しかし何らかの理由でjs1などjs0以外に認識される場合があります。この場合、下記コマンドでdevというrosparamをセットすると、joy_nodeで使うdeviceを指定することができます。

  • rosrun joy joy_node _dev:=/dev/input/js1 (js1に認識された場合の例)

DualShock4を無線で使う

ds4drvのインストール/起動

DS4とUbuntuPCをペアリングするためのPythonドライバds4drvをpipからインストールします。 (pip自体が未インストールの方は、こちらなどを参考に先にpipをインストールしてください)

  • sudo pip install ds4drv

Ubuntu16.04 + ROS Kineticでは、"Successfully installed ds4drv-0.5.1 evdev-0.6.1 pyudev-0.21.0"みたいな表示が出ればOKです。

次に、DS4とPCをペアリングします。

  1. 「システム設定」等からPCのBluetooth機能をONにします。
  2. ds4drvを起動します。
    • sudo ds4drv
    • "[info][bluetooth] Scanning for devices" と表示されます。
  3. DS4の「PSボタン」と「SHARE」ボタンを同時に10秒くらい押し続けます。するとコントローラ背後のライトバーがチカチカッ、チカチカッという感じで白く点滅します。こうなったらもうボタンから手を話してOKです。
  4. 下記のような表示が出て、ライトバーが青く点灯すればペアリング完了です。
    • [info][bluetooth] Found device xx:xx:xx:xx:xx:xx
    • [info][controller 1] Connected to Bluetooth Controller (xx:xx:xx:xx:xx:xx)

これで、DS4をPCに有線で接続したのと同じ状態になりました。 あとは有線の時と同様に、joy_nodeを起動するだけです。

なおペアリング後にds4drvを終了すると、DS4のライトバーが青点灯のまま残ってしまいますが、PSボタンを10秒くらい長押しすると消えます。

DS4におけるsensor_msgs/Joyのaxes,buttonsアサイン

自力で調べたので載せておきます。

axes

  • axes[0]: L stick horizontal (left=+1, right=-1)
  • axes[1]: L stick vertical (up=+1, down=-1)
  • axes[2]: R stick horizontal (left=+1, right=-1)
  • axes[3]: L2 (neutral=+1, full accel=-1)
  • axes[4]: R2 (neutral=+1, full accel=-1)
  • axes[5]: R stick vertical (up=+1, down=-1)
  • axes[6]: Accelerometer Left(コントローラ左方向が正方向)
  • axes[7]: Accelerometer Front(コントローラ手前方向が正方向)
  • axes[8]: Accelerometer Up(コントローラ上方向が正方向)
  • axes[9]: Axis button(十字キー) LR(L=+1, R=−1)
  • axes[10]:Axis button(十字キー) Up/Down(Up=+1, Down=−1)
  • axes[11]: Jyrometer Roll (手前から見て右回り:+、左回り:ー)
  • axes[12]: Jyrometer Yaw (上から見て左回り:ー、右回り:+)
  • axes[13]: Jyrometer Pitch (ライトバー側を上げる:ー, 下げる:+)
Accelerometer&Jyrometer

なぜか無線で接続しないと加速度・角速度の値はとれませんでした。
また、どうも加速度と角速度で軸が合っていない(加速度の正方向を右手親指の向きとした場合の右ねじの法則に、Gyroの回転方向が従っていない)ので注意が必要です。

buttons

  • buttons[0]: □Square
  • buttons[1]: ×Cross
  • buttons[2]: ○Circle
  • buttons[3]: △Triangle
  • buttons[4]: L1
  • buttons[5]: R1
  • buttons[6]: L2 digital(1/3くらい引くと1になる)
  • buttons[7]: R2 digital(1/3くらい引くと1になる)
  • buttons[8]: Share
  • buttons[9]: Options
  • buttons[10]: L3
  • buttons[11]: R3
  • buttons[12]: PS button
  • buttons[13]: Touchpad button

Touchpadのタッチ座標は、今のところ取得できないようです。

おわりに

今回はROSでPS4コントローラ(DualShock4)を使う方法について解説しました。
まぁDS3を持っている人が、わざわざロボット操作のためだけにDS4を買うかと聞かれたらそんなこと誰もしないとは思いますが、もし持ってたら使ってみてください。

参考書籍: ROSではじめるロボットプログラミング