ROSでPS4のコントローラ(DualShock4)を使う方法
はじめに
ROSでPS4コントローラの入力を取得する方法およびキーアサインについて説明します。
最近になって私もROS勉強会やROSハッカソンに参加しはじめましたが、多くの人がいまだにPS3のDualShock3コントローラ(DS3)を使っているのを見かけます。
しかしPS4のDualShock4(DS4)のほうがスティックとL2R2トリガーの操作性がだんぜん良いのでオススメです。特にドローンのスラスト制御(プロペラの回転速度制御)等をR2トリガー等で行う場合、トリガーのリニアリティ(直線性)がDS4だととても良く、精密なマニュアル操作がしやすいです。
PCにBluetooth機能がついていれば、ワイヤレスで使うこともできます。
環境
- Ubuntu 16.04
- ROS Kinetic
- PS4 ワイヤレスコントローラー(DUALSHOCK®4)
本記事と同様の手法で、Jade/Indigoでも動作確認済みです。ただし無線接続の場合、Bluetoothデバイスの相性によってはds4drvがうまく動かない場合があります。
DualShock4を有線で使う
有線の場合、DS3と似たような感じで簡単です。
- PCとDS4をMicroUSBケーブルで接続
- ROSのjoyパッケージをインストール
sudo apt-get install ros-<DISTRO>-joy
- 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をペアリングします。
- 「システム設定」等からPCのBluetooth機能をONにします。
- ds4drvを起動します。
sudo ds4drv
- "[info][bluetooth] Scanning for devices" と表示されます。
- DS4の「PSボタン」と「SHARE」ボタンを同時に10秒くらい押し続けます。するとコントローラ背後のライトバーがチカチカッ、チカチカッという感じで白く点滅します。こうなったらもうボタンから手を話してOKです。
- 下記のような表示が出て、ライトバーが青く点灯すればペアリング完了です。
これで、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ではじめるロボットプログラミング