SIXAXISについて ~データ編~
SIXAXIS Driver から送られてくるデータ
SIXAXISから送られてくるデータ内容については、SIXAXIS Driverを使った場合とLibUsbを使ってリクエスト送信で使えるようにした場合とでは、
取得できるデータの内容や順番に違いがあります。
どちらの方法もすでに報告があがっています。
SIXAXIS Driver:
おなかすいた族! SixAxis on Windows:http://onakasuita.org/ps3/
LibUsb:
お試しセット:http://flagdrug.cocolog-nifty.com/
しかし、今回確認のために調査してみたのですが、公開されているものは若干データが不足しているようでしたので ここで改めてまとめてみました。
以下の表はSIXAがSIXAXIS Driver経由で送ってくるデータの内容を示したものです。
サンプルに書かれたコメントと私が行った動作チェックで調査したものです。
環境によってdummy欄などの値が違ったり、私のミスや勘違いで内容が違う
可能性もあります。その点はあらかじめご了承ください。
Byte | bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
---|---|---|---|---|---|---|---|---|
0 | ReportID(0x01) HID報告のためのレポートID | |||||||
1 | LAnalogX(0x00 ~ 0xFF) | |||||||
2 | LAnalogY(0x00 ~ 0xFF) | |||||||
3 | RAnalogX(0x00 ~ 0xFF) | |||||||
4 | RAnalogY(0x00 ~ 0xFF) | |||||||
5 | dummy = X Axis Acceleration Value(0x00~) | |||||||
6 | dummy = Z Axis Acceleration Value(0x00~) | |||||||
7 | R1 Button Flag |
L1 Button Flag |
R2 Button Flag |
L2 Button Flag |
□ Square Button Flag |
× Cross Button Flag |
○ Circle Button Flag |
△ Triangle Button Flag |
8 | UP/RIGHT/DOWN/LEFT Button(0x10~0x80) | START Button Flag |
Ranalog Button Flag |
Lanalog Button Flag |
SELECT Button Flag | |||
9 | dummy(0x86) | |||||||
10 | dummy(0x00) | |||||||
11 | dummy(0x00) | |||||||
12 | dummy(0x00) | |||||||
13 | dummy(0x00) | |||||||
14 | UP Button Level (0x00 ~ 0xFF) | |||||||
15 | RIGHT Button Level (0x00 ~ 0xFF) | |||||||
16 | DOWN Button Level (0x00 ~ 0xFF) | |||||||
17 | LEFT Button Level (0x00 ~ 0xFF) | |||||||
18 | L2 Button Level (0x00 ~ 0xFF) | |||||||
19 | R2 Button Level (0x00 ~ 0xFF) | |||||||
20 | L1 Button Level (0x00 ~ 0xFF) | |||||||
21 | R1 Button Level (0x00 ~ 0xFF) | |||||||
22 | △ Triangle Button Level (0x00 ~ 0xFF) | |||||||
23 | ○ Circle Button Level (0x00 ~ 0xFF) | |||||||
24 | × Cross Button Level (0x00 ~ 0xFF) | |||||||
25 | □ Square Button Level (0x00 ~ 0xFF) | |||||||
26 | dummy(0x00) | |||||||
27 | dummy(0x00) | |||||||
28 | dummy(0x00) | |||||||
29 | dummy(0x03) | |||||||
30 | dummy(0xEF) | |||||||
31 | dummy(0x14) | |||||||
32 | dummy(0x00) | |||||||
33 | dummy(0x00) | |||||||
34 | dummy(0x00) | |||||||
35 | dummy(0x00) | |||||||
36 | dummy(0x23) | |||||||
37 | dummy(0xF4) | |||||||
38 | dummy(0x77) | |||||||
39 | dummy(0x01) | |||||||
40 | dummy(0x81) | |||||||
41 | 0 | 0 | 0 | 0 | 0 | 0 | +X Axis Flag (Left Side) |
-X Axis Flag (Right Side) |
42 | X Axis Acceleration Value(0x00~0xFF) | |||||||
43 | 0 | 0 | 0 | 0 | 0 | 0 | +Y Axis Flag (Back Side) |
-Y Axis Flag (Top Side) |
44 | Y Axis Acceleration Value(0x00~0xFF) | |||||||
45 | 0 | 0 | 0 | 0 | 0 | 0 | +Z Axis Flag (Front Side) |
-Z Axis Flag (Far Side) |
46 | Z Axis Acceleration Value(0x00~0xFF) | |||||||
47 | dummy(0x00) | |||||||
48 | Angular Velocity Direction (0x00 ~ 0x03) |
【注意事項】
- SIXAXIS Driverを使用した場合、PSボタンの情報が取得できません。
- UP/RIGHT/DOWN/LEFT Buttonをハットキーに割り当てるためか、並びがやや特殊ですので取り扱いには注意してください。
- SIXAXIS Driverを使った場合とLibUsbを使った場合とでは加速度データの場所は一見同じに見えますが、 SIXAXIS DriverはXYZ、LibUsbはXZYとなっていますので注意してください。
8 Byte目のUP/RIGHT/DOWN/LEFT Buttonの出力は次のようになっています。
8 Byte | - | ↑ | ↑→ | → | ↓→ | ↓ | ↓← | ← | ←↑ |
10進 | 16 | 32 | 48 | 64 | 80 | 96 | 112 | 128 | |
16進 | 0x10 | 0x20 | 0x30 | 0x40 | 0x50 | 0x60 | 0x70 | 0x80 |
確認用のサンプルプログラム
上の表を確認するために作ったプログラムを公開します。
これとほぼ同じものは前に近況報告でスクリプトはUPしています。
←これが実行画面です。クリックすると大きい画像で見ることが出来ます。
こんな感じで値が取得できています。
検出した傾きはグラフと3Dモデルでも表示するようにしています。
3Dの方は振り回している間はまともな値が取れませんのでご了承ください。
マウス操作+クリックorホイールで3Dモデルの視点を変更できます。
Ctrlキーを押すと3Dモデルは傾き表示から加速度表示に変わります。
見やすいようにして確認してみてください。
---
sixaxis_test.zip(91 KB)
毎度のことですが一応明記しておきます。
このプログラムを実行することで何らかの不具合が発生したとしても、
プログラム作者は責任を負いません。自己責任でチャレンジしてください。
座標軸
座標軸は以前書いたセンサーの記事の座標軸と結果的には同じ向きでした。
左のような感じになります。
±を考えるときは加速度の向きに注意してください。
反応が遅れますね
入力から値の検出まで、コンマ数秒程度反応が遅れます。
これの原因については現在調査保留中です。
サンプルを見てみると、マルチスレッドを利用しているらしいので
同じようにやれば問題が解決するのかもしれません。
となるとHSP3.2の導入が必要になってきます。
解決はまだ先になる見込みです。
微妙にずれますね
合力は3軸方向加速度の合計値を示しています。
本来なら静かな場所においておけばどんな姿勢でも同じ値(重力加速度1G)をとるはずですが、
姿勢によって値が変わっているかと思います。
また、3DモデルとSIXAXISの姿勢が微妙にズレているかもしれません。
これは加速度センサーの校正をやっていないためです。
調べれば校正方法も分かるのですが、個体差もあると思うので今回はそのままの校正していない値を使っています。
しかし、この辺は手に持ってしまえば気にならない程度の値ではないかと思います。
人間の手で持ってしまえば、自然と手の中でズレを補正出来てしまうのではないでしょうか。
その辺は手で持って確認してみてください。
ちなみにちゃんとした校正をするためにはSIXAXIS本体を水平垂直にする必要があります。
あの形では現実的に難しいですね。X,Yのゼロ点はともかくZは特に難しいものがあります。
校正値算出プログラムを作るにはちょっとした工夫が必要そうです。
時々あらぬ方向を向くね
コントローラをひっくり返したりすると、3D表示があらぬ方向を向くことがあります。
これには姿勢の計算時の条件が関係しています。
姿勢の計算をするために次の条件をつけています。
・ローカルX軸はZ-X平面内でしか移動できない。
・ローカルX軸は+X以上の値しかとらない。(-X方向を向かない。)
・座標は右手系である。
よく見るとこの条件で動いているのが分かると思います。
また、3Dモデルを見る位置を変えてみるとコントローラと同じ姿勢をしている向きがあるはずです。
すみません
すみません。
とりあえず取れた値の確認だけのプログラムなので細かい点はご容赦ください。