简体   繁体   English

Android:同时从加速度计和陀螺仪获取数据

[英]Android: Getting data simultaneously from Accelerometer and Gyroscope

I'm having some issues getting data from the accelerometer and gyroscope simultaneously.我在同时从加速度计和陀螺仪获取数据时遇到了一些问题。 I need to use these sensors to get acceleration and orientation in order to calculate relative position for a project I'm working on.我需要使用这些传感器来获取加速度和方向,以便计算我正在处理的项目的相对位置。 When both sensors are used at the same time it leads to some very weird data output, in which the data only changes once every second.当两个传感器同时使用时,它会导致一些非常奇怪的数据输出,其中数据每秒只更改一次。 When only the accelerometer is run the data is not much better because it is only changing roughly 10 times a second on its fastest setting.当只运行加速度计时,数据并没有好多少,因为它在最快的设置下每秒只改变大约 10 次。 This data is printed out to a file with a time stamp for each sensor reading.该数据打印到一个文件中,每个传感器读数都带有时间戳。

I'm having trouble finding tutorials on the internet, particularly using more than one sensor together at the same time.我在互联网上找不到教程,特别是同时使用多个传感器。 Do I need to put each sensor on a different thread?我是否需要将每个传感器放在不同的线程上? I don't have much experience using threads, how could I do this.我没有太多使用线程的经验,我怎么能做到这一点。

You don't need to put each sensor on a different thread.您不需要将每个传感器放在不同的线程上。 Yo can use the class SensorManager to register and unregister the different sensors that you need您可以使用 SensorManager 类来注册和取消注册您需要的不同传感器

public class SensorActivity extends Activity, implements SensorEventListener {
 private final SensorManager mSensorManager;
 private final Sensor mAccelerometer;
 private final Sensor mGyroscope;

 public SensorActivity() {
     mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
     mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
     mGyroscope = mSensorManager.getDefaultSensor(TYPE_GYROSCOPE);
 }

 protected void onResume() {
     super.onResume();
     mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
     mSensorManager.registerListener(this, mGyroscope, SensorManager.SENSOR_DELAY_NORMAL);
 }

 protected void onPause() {
     super.onPause();
     mSensorManager.unregisterListener(this);
 }

Implements the sensorEventList handler (specially the method onSensorChanged) and check who belongs the received data:实现 sensorEventList 处理程序(特别是 onSensorChanged 方法)并检查谁属于接收到的数据:

 public void onSensorChanged(SensorEvent sensorEvent) {
    sensorName = sensorEvent.sensor.getName();
    Log.d(sensorName + ": X: " + sensorEvent.values[0] + "; Y: " + sensorEvent.values[1] + "; Z: " + sensorEvent.values[2] + ";");

} }

Java code Java代码

import android.content.pm.ActivityInfo;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
    TextView textX, textY, textZ;
    SensorManager sensorManager;
    Sensor sensor;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        textX = findViewById(R.id.textX);
        textY = findViewById(R.id.textY);
        textZ = findViewById(R.id.textZ);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
    public void onResume() {
        super.onResume();
        sensorManager.registerListener(gyroListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
    }
    public void onStop() {
        super.onStop();
        sensorManager.unregisterListener(gyroListener);
    }
    public SensorEventListener gyroListener = new SensorEventListener() {
        public void onAccuracyChanged(Sensor sensor, int acc) {
        }
        public void onSensorChanged(SensorEvent event) {
            float x = event.values[0];
            float y = event.values[1];
            float z = event.values[2];
            textX.setText("X : " + (int) x + " rad/s");
            textY.setText("Y : " + (int) y + " rad/s");
            textZ.setText("Z : " + (int) z + " rad/s");
        }
    };
}

    

XML file code XML文件代码

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/textX"
        android:layout_width="209dp"
        android:layout_height="79dp"
        android:layout_marginStart="91dp"
        android:layout_marginLeft="91dp"
        android:layout_marginEnd="111dp"
        android:layout_marginRight="111dp"
        android:gravity="center"
        android:text=""
        android:textSize="30sp"
        app:layout_constraintBottom_toTopOf="@+id/textY"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="MissingConstraints" />
    <TextView
        android:id="@+id/textY"
        android:layout_width="209dp"
        android:layout_height="79dp"
        android:layout_marginStart="91dp"
        android:layout_marginLeft="91dp"
        android:layout_marginEnd="111dp"
        android:layout_marginRight="111dp"
        android:layout_marginBottom="8dp"
        android:gravity="center"
        android:text=""
        android:textSize="30sp"
        app:layout_constraintBottom_toTopOf="@+id/textZ"
        app:layout_constraintEnd_toEndOf="@+id/textX"
        app:layout_constraintHorizontal_bias="0.445"
        app:layout_constraintStart_toStartOf="@+id/textX"
        app:layout_constraintTop_toBottomOf="@+id/textX"
        tools:ignore="MissingConstraints" />
    <TextView
        android:id="@+id/textZ"
        android:layout_width="209dp"
        android:layout_height="79dp"
        android:layout_marginStart="153dp"
        android:layout_marginLeft="153dp"
        android:layout_marginEnd="49dp"
        android:layout_marginRight="49dp"
        android:layout_marginBottom="241dp"
        android:gravity="center"
        android:text=""
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@+id/textY"
        app:layout_constraintHorizontal_bias="0.757"
        app:layout_constraintStart_toStartOf="@+id/textY"
        app:layout_constraintTop_toBottomOf="@+id/textY"
        tools:ignore="MissingConstraints" />
</android.support.constraint.ConstraintLayout>

This Kotlin solution is derived from Kroka's solution:这个 Kotlin 解决方案源自 Kroka 的解决方案:

class MainActivity : AppCompatActivity(), SensorEventListener {

    private lateinit var mSensorManager:SensorManager
    private lateinit var mAccelerometer :Sensor
    private lateinit var mGyroscope :Sensor

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mSensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
        mGyroscope = mSensorManager.getDefaultSensor(TYPE_GYROSCOPE)
    }

    override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {

    }
    override fun onSensorChanged(event: SensorEvent?) {
        val sensorName: String = event?.sensor!!.getName();
        Log.d("Sensor",sensorName + ": X: " + event.values[0] + "; Y: " + event.values[1] + "; Z: " + event.values[2] + ";")
    }

    override fun onResume() {
        super.onResume()
        mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL)
        mSensorManager.registerListener(this, mGyroscope, SensorManager.SENSOR_DELAY_NORMAL)
    }

    override fun onPause() {
        super.onPause()
        mSensorManager.unregisterListener(this)
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM