加速度センサから重力の影響を取り除く

下に向かって加速している

普通に加速度センサの値を表示すると重力の値が影響されて表示されます
テーブルの上においている状態でも下に向かって加速しています
今回はその重力の影響を取り除いて表示します

ハイパスフィルタ

  1. ローパスフィルタによって重力の分の値をフィルタリングします。
  2. 加速度からローパスを減算することで重力の値を取り除いた値になります。

ごめんなさい

偉そうに言っているけどソースは全部コピペです

ソース

public class MainActivity extends Activity implements SensorEventListener {

	private TextView lblOrientationX;
	private TextView lblOrientationY;
	private TextView lblOrientationZ;
	private SensorManager sensorManager;
	private float[] currentOrientationValues = { 0.0f, 0.0f, 0.0f };
	private float[] currentAccelerationValues = { 0.0f, 0.0f, 0.0f };

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		lblOrientationX = (TextView) findViewById(R.id.lblOrientationX);
		lblOrientationY = (TextView) findViewById(R.id.lblOrientationY);
		lblOrientationZ = (TextView) findViewById(R.id.lblOrientationZ);

		sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
	}

	@Override
	protected void onResume() {
		super.onResume();
		sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
	}

	@Override
	protected void onPause() {
		super.onPause();
		sensorManager.unregisterListener(this);
	}

	@Override
	public void onSensorChanged(SensorEvent event) {
		if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
			currentOrientationValues[0] = event.values[0] * 0.1f + currentOrientationValues[0] * (1.0f - 0.1f);
			currentOrientationValues[1] = event.values[1] * 0.1f + currentOrientationValues[1] * (1.0f - 0.1f);
			currentOrientationValues[2] = event.values[2] * 0.1f + currentOrientationValues[2] * (1.0f - 0.1f);

			currentAccelerationValues[0] = event.values[0] - currentOrientationValues[0];
			currentAccelerationValues[1] = event.values[1] - currentOrientationValues[1];
			currentAccelerationValues[2] = event.values[2] - currentOrientationValues[2];

			lblOrientationX.setText("x:" + String.valueOf(currentAccelerationValues[0]));
			lblOrientationY.setText("y:" + String.valueOf(currentAccelerationValues[1]));
			lblOrientationZ.setText("z:" + String.valueOf(currentAccelerationValues[2]));
		}
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {

	}
}

参考

勉強会/Android SDK WG 第3回 セッション withプチ勉強会 - 日本Androidの会(日本アンドロイドの会)
http://android.siprop.org/index.php?%CA%D9%B6%AF%B2%F1%2FAndroid%20SDK%20WG%20%C2%E83%B2%F3%20%A5%BB%A5%C3%A5%B7%A5%E7%A5%F3%20with%A5%D7%A5%C1%CA%D9%B6%AF%B2%F1#uff292ed
※江川さんの資料を参考にしました。

その他

それにしてもこのテーマじゃソースが見づらいですね。
なにかいいテーマないかなー?