2012-03-29 15 views
2

現在、アンドロイド携帯電話で傾き補正された直線加速度計を開発中です。私が基本的に到達したいのは、センサーフレームではなく、地球フレームにある加速です。私はまた、私のベクトルの重力を自由にしたい。加速度計のX軸は、陸上車両のx軸とは別個に割り振られます。したがって、ヨー補正(電話のx軸と磁気北の間の角度)は望ましくない。このため回転行列から任意の回転軸を取り除く

我々は2つのセンサ読取値を有する:

1)3×3回転行列R土フレームから(回転センサにフレーム)

2)3×1加速度ベクトル=(Xを

手動から重力を除去するために、センサのフレームから、Y、Z)^ Tは、我々は、CA a_transposed N単にアースフレームに重力ベクトルを定義:

G =(0,0,9.81)^ T

私は今、回転行列Rと重力を乗算し、ベクターからそれをsubstractことができます。結果として、'は、重力フリー加速度ベクトルである。

'= - (Rの* gを) は(この段階で' ここまで

APIのソフトウェアセンサーLINEAR_ACCELERATIONと同じ値を持っている)すべてが正常に動作します。

は、今私は、アカウントにしてZ軸の回転角を取ることなく、私の直線加速度ベクトルに地球フレームを回転したいです。最初そうするために、私はそれのtranposeに等しい回転行列Rの逆行列を計算する:

R ^( - 1)= R^T

そしてiが「を乗算しますR ^( - 1)とし、アースフレームに戻します。

「= R ^( - 1)*」自分の携帯電話は、磁北を向いている場合、私は、チルト補償線形加速度データを持っているこのステップで

、私はまた、Z軸回りに回転しているので、その必要ない。最終的な正しい結果を得るためにはz軸の周りを回転させる必要があります。この目的のために、ヨー行列である回転行列からオイラー角(z軸周りの回転)を計算しました。そしてヨー角を使って逆方向にベクトルを1回転させた。これは最終的な補正ステップですが、オイラー角を使用するコストがあります。

この方法は、ロール角度が90度で、ジンバルロックが発生した場合でも、携帯電話を直接上向きに保持すると機能しません。私の計算したヨー角はであり、これはであり、逆回転に失敗します。

私の質問は、オイラー角を使用せずにz軸を無視してx軸とy軸の周りを回転することができるように回転行列を変更/変更する方法です。

私がチェックしalreadているが、それは私を助けたのdidnt: How do I remove axis from a rotation matrix?

+0

これは不明です。電話が北向きで東を加速している場合、**は**東を指します。あなたはそれをどのように指摘したいですか?電話機が上を向いて東を加速している場合、**は**東を指します。あなたはそれをどのように指摘したいですか? – Beta

+0

携帯電話は車両の中に置かれ、電話のx軸は車の前側である車のx軸(gpsによる別の較正ステップで)に割り当てられます。電話が北に面して東を加速していて、電話のx軸が東を指している場合、それは問題ありません。 – kolpazar

+0

それでは、なぜ「最終的な正しい結果を得るためには、あなたは反復しなければなりませんか? – Beta

答えて

0
a_geo = R^-1*(a_phone - R*g) = R^-1*a_phone - g 

をので、あなたがしたすべては、これまで地元の地理的なフレーム(N、E、Dまたは何か)であなたの公平な加速をプロジェクトです。

a_horiz=a_geo; a_horiz[3]=0; 

または行列で表現、

a_horiz = [1,0,0; 
      0,1,0; 
      0,0,0] * a_geo; 
:何がしたいことは、水平面への投影であるならば、あなたは、単に第三座標を全滅させる、あなたのインデックスが1 MATLABやFORTRANのように、ベースとされていると言うことができます

あなたは、

R*a_horiz; 

をお使いの携帯電話軸にこのバックを投写することができます。しかし、それはあなたが私はあなただけの見出し回転を適用し、時間のいくつかの種類を持っているしたいと思います...欲しい本当に何かどうかは明確ではありません横方向の前方加速度および水平方向の横方向(右舷)加速度である。私はその後、あなたの水平加速度を回転させる

(あなたが唯一の可能述べたように、あなたの携帯電話のx軸が垂直でない場合)だけの見出しを抽出...
psi = atan2(R(1,2) , R(1,1)); 

を任意の簡単なトリックを知らない

a_horiz_car = [ cos(psi) , sin(psi) , 0; 
       -sin(psi) , cos(psi) , 0; 
       0  ,  0 , 1] * a_horiz; 

をのみ最初の2つの座標は面白いので、2x2の行列を使うことができます。

+0

ソリューションをありがとう! – kolpazar

+0

バグが1つあったとしても、行列[1,1,0; 1,1,0; 0,0,0]は[1,0,0; 0,1,0; 0,0,0] –

0

デバイスにジャイロが搭載されていて、2.3(API 9)以上を実行していますか?

もしそうなら、TYPE_GRAVITYおよび/またはTYPE_LINEAR_ACCELERATION仮想センサーを使用して、直接的に必要なものを得ることができます。

関連する問題