デバイスの姿勢検出(姿勢を表す回転行列)の検証

デバイスで自分の姿勢(方位,傾き×2)を取得し,OpenGLを用いてVR表示するとき,
物理的には磁気3軸センサ,加速度3軸センサを用いればよいが,そのまま生の値を取得すると,ノイズが多くて使えない。
よりスムーズな姿勢を得るにはジャイロ3軸センサも用いるとよい。

姿勢取得では姿勢を表す回転行列を得ることができればその後の活用が出来る。
姿勢を表す回転行列を取得する方法は2つあり,
(1)回転ベクトルセンサ(Rotation Vector)を利用すると直接回転行列が得られる。
  これは磁気3軸センサ,加速度3軸センサに加え,ジャイロス3軸センサも使ってノイズを減少させ,
  安定した回転行列を与える複合センサである。
  ジャイロスコープを持たないデバイスでは使用できない
(2)磁気センサ(MAGNETIC FIELD)と加速度センサ(ACCELEROMETER)の値を取得し,
  回転行列を得る方法もある。
  回転行列を得るメソッド(getRotationMatrix)が用意されている。

しかしデバイスの中にはこのような方法で得られた姿勢を表す回転行列が正しくない場合がある。
得られた回転行列の正当性を検証してみよう。

回転行列は直交行列であることを利用すると,検証ができる。
直交行列MではMT=M-1の関係があるので,(M MT)が単位行列になれば良い。

    private float checkOrthogonalMatrix(float[] mat) {
        float[] tmat = new float[16];
        float[] mult = new float[16];
        Matrix.transposeM(tmat,0,mat,0);
        Matrix.multiplyMM(mult,0,mat,0,tmat,0);
        float[] im= new float[16];
        Matrix.setIdentityM(im,0);
        float ret=0f;
        for (int i=0; i<16; i++) {
            float elm=mult[i]-im[i];
            ret += elm*elm;
        }
        return ret;
    }

このメソッドの返す値が0に近ければ,正当な回転行列が得られたことになる。
実際の例では,通常10-4程度の値になるので,判定値は0.01位を用いれば良い。