加速度センサーとこれまでのボタンの違い

SIXAXISについている加速度センサーは傾きセンサではありません。
ですので、これまでのボタンやアナログ入力などから得られた値と同じように、取得値をそのまま扱ってはいけません。

これまで付いていたボタンやアナログスティックからの取得した値は、何も考えずに そのまま使って何も問題はありませんでした。
しかし、加速度センサーの場合は取得した値をそのまま使おうとしても使い物になりません。
手振れなどのノイズが多いだけでなく、単なる加速度値でしかないためです。

プログラムする際には取得した値の意味を理解し、値から入力の内容を推測する必要があります。
手間がかかるようですが、生の加速度情報を扱えるため様々な入力に対応する可能性を秘めています。

このようにこのセンサーは後処理がとても重要です。
SIXAXIS対応化モジュールがもし完成したならば、一般ユーザーが簡単に加速度センサーを 利用するために、取得した加速度値を使いやすいように処理するモジュールの開発が必要でしょう。 でなければ、一般ユーザーに物理の知識を強要しなければならなくなります。
(メーカーではこのセンサーを「6軸検出システム」というくらいなのでソフトメーカー向けにはそれらを簡単に変換取得できるコマンドが用意されているんでしょうね。)

これからのコントローラは加速度センサー標準装備が当たり前になるんでしょうか…?
そうなるかどうかはユーザーにかかってるわけか。

加速度とは?

加速度センサーからの取得値を処理するには、加速度とは何かを理解する必要があります。
しかしここでは加速度についての解説は省略させていただきます。
これについては、ネットで検索するか、高校物理の教科書を開いてみてください。(物理を専攻していない方には申し訳ないですが。)
ここで解説するよりも正確で分かりやすい情報が得られると思います。

加速度センサーの補正計算

パソコンにつなげただけの状態では加速度センサーは誤差を含んでいます。
そのまま使っても特に大きな問題はありませんが、必要があればセンサーの校正(補正計算)をすることも出来ます。

加速度センサーの校正(補正)については、センサーメーカーに資料がありました。ありがたいことです。
北陸電気工業株式会社 - HOKURIKU
http://www.hdk.co.jp/japanese/prduct_j/prd902_j.htm

補正計算に必要な値を取得するためには、SIXAXISを水平や垂直状態にして 静かな状態で値を取得する必要があるのですが、これをやるのは現実的に難しいため 現在は補正計算を行っていません。
充電スタンドを使えば、水平もしくは垂直で固定できそうですが他の姿勢が出来ません。
いい方法があればよいのですが…。

と言うことですので、多少のズレは考慮した計算処理を行ったほうがいいかもしれません。
(例:重力加速度を3方向の検出値の合計ベクトルとするなど。)


ちなみに、先ほどのメーカーサイト(HOKURIKU)のこのページには、 他にもなかなか有益なことが書いてあるようです。
まだ読んでいないのですが、加速度センサーから取得した値の後処理の参考になるのではないでしょうか。

傾き角度を求める

傾きの算出
加速度センサーから取得した加速度値から傾きを計算してみます。
計算条件として、コントローラーは傾けた状態で静止しているものとします。
説明ではZ軸についてのみ解説してみます。他の軸でも考え方はだいたい同じです。

図のようにZ軸をθだけ傾けた場合を考えてみます。
Bは重力加速度です。この値は9.81m/s2(=1G)の固定値ではなく、XYZ3方向の検出ベクトル値の合計を使うといいようです。
このとき加速度センサーで検出される値はAになります。
図から傾きθは、

cos(θ) = A / B
θ = acos(A / B)
として求めることが出来ます。
Z軸を中心に回転しても同じ値になるという点に注意してください。
つまり、Y軸方向に傾けたのか、X軸方向に傾けたのか、あるいは斜めに傾けたのかは1軸の値だけでは分からないと言うことです。

変換マトリクスを求める

X,Y,Z軸それぞれの傾きを比較すればおおよそどの方向に傾いているか分かると思います。
サンプルでは単純な比較ではなく算術的に傾き、変換マトリクスを求めています。

この計算方法はこちらのサイトで詳しく解説されていますので詳しくはこちらをご覧ください。
http://www.rugbysensor.com/rugbySystem3.html

このサイトではX,Y,Z軸とXY平面のなす角度をそれぞれθx、θy、θz。 X軸の動作範囲は、Z-X平面の+X内のみ。
として計算しているようです。このときの変換マトリクスRは、

    |cos(θx), -tan(θx)*sin(θy), -tan(θx)*sin(θz)|
R = |0.0     , sin(θz)/cos(θx) , -sin(θy)/cos(θx)|
    |sin(θx), sin(θy)          , sin(θz)          |
となると紹介されています。
私は確認計算していないんですが、そのまま搭載しても何の問題もないので多分間違ってないんでしょうね。

サンプルではこの変換マトリクスを使っているため、時折Z軸を中心に回転してしまうかと思います。
これは角速度センサの値を利用していないためと考えていいでしょう。

紹介したサイトではさらにこの後に、角速度を含めた計算行っています。
Z軸方向の角速度値を含めれば、もっと正確な姿勢検出が出来るようになると思います。

加速度→速度→距離

計算上では、
距離の時間変化を微分すると、速度が求まります。
速度の時間変化を微分すると、加速度が求まります。
また逆に、
加速度を積分すると、速度。
速度を積分すると、距離を求めることが出来ます。
(初期値の情報が不足しますが…。)

しかし実際に加速度センサーからの取得値を使って積分すると、 検出誤差まで積分され実際の値とはかけ離れた値になってしまいます。
また、常に重力加速度がかかっているのでこれも問題になります。
SIXAXISはWiiリモコンと違って、これを補正するセンサーを持っていないため、速度や距離を求めるのはとても困難です。
方法はあるのかもしれませんが、今の私では考え付きません。

平行移動の検出

速度や距離を求めることをあきらめた場合、平行移動を検出する方法を考える必要があります。
これは予想なのですが、加速度値があるしきい値を超えたら、その反対方向に移動した、と考える方法なるのではないでしょうか。
まだ実践していないので上手くいくのかはわかりません。
問題はしきい値の設定でしょうか。これは重力加速度を考慮する必要がありそうですし…傾けたときにどうなるのかも問題です。
難しそうですね。