Androidに搭載されているジャイロセンサと加速度センサを使って角度を得るプログラムを作成中なのですが、ジャイロセンサから得た角速度を積分して角度を求めることがうまくできません。角速度を配列にして保持することで1つ前の角速度も参照できるようにし、それを用いて台形法を使い積分しようとしています。しかし、全然まともな角度が出力されません…。配列を制御しているiを共用しているせいだとは思うのですが、共用しないとどんどん角速度の更新に比べて角度の更新が遅延してしまうような気がします…。ちなみに、class Transmission extends Threadは、ボタンが押された時に呼び出されるようにしており、ボタンが押されると一定間隔で積分を始めるようにしています。このようにすればいいよ。や、そもそもこのようなやり方では無理だ。などのアドバイスを貰えると嬉しいです。
以下にソースの一部を添付しておきます。
java
1int deltat = 500; //500ミリ秒間隔で積分 2 3public void onSensorChanged(SensorEvent event) { 4 switch(event.sensor.getType()){ 5 //角速度に変化があったら 6 case Sensor.TYPE_GYROSCOPE : 7 //オフセット 8 if(offset == 0){ 9 gyr_x_off = event.values[0]; 10 gyr_y_off = event.values[1]; 11 gyr_z_off = event.values[2]; 12 13 offset = 1; 14 } 15 16 gyr_x[i] = event.values[0]-gyr_x_off;//オフセットを引いたx軸の角速度 17 gyr_y[i] = event.values[1]-gyr_y_off;//オフセットを引いたy軸の角速度 18 gyr_z = event.values[2]-gyr_z_off;//オフセットを引いたz軸の角速度 19 20 if((0 <= i) && (i < 9)){ 21 i = i+1; 22 }else{ 23 i = 1; 24 } 25 break; 26 } 27} 28 29class Transmission extends Thread { 30 public void run() { 31 try{ 32 while(running){ 33 //角速度を積分で角度に変換 34 if((2 <= i) && (i <= 9)){ 35 ang_gyr_x = ang_gyr_x+((gyr_x[i-1]+gyr_x[i])/2)*(deltat/1000.0); 36 ang_gyr_y = ang_gyr_y+((gyr_y[i-1]+gyr_y[i])/2)*(deltat/1000.0); 37 }else if(i == 1){ 38 ang_gyr_x = ang_gyr_x+((gyr_x[9]+gyr_x[i])/2)*(deltat/1000.0); 39 ang_gyr_y = ang_gyr_y+((gyr_y[9]+gyr_y[i])/2)*(deltat/1000.0); 40 }else if(i == 0){ 41 //初回は静止していると仮定して加速度からの角度を入れる。 42 ang_gyr_x = ang_acc_x; 43 ang_gyr_y = ang_acc_y; 44 } 45 46 Thread.sleep(deltat); //deltatミリ秒遅延する 47 } 48 }catch(InterruptedException e){} 49 } 50}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。