Sujet du capteur (3) – Capteur d'accélération/gyroscope


Introduction à cette section :

Cette section continue de discuter des capteurs dans Android. Cette section apporte le capteur d'accélération (capteur accéléromètre) et. Le capteur gyroscope, comme le capteur de direction de la section précédente, possède trois axes : x, y et z. Encore une chose à dire : les coordonnées des axes x et y doivent être distinguées des axes x et y du dessin ! Le capteur est dans le coin inférieur gauche Pour l'origine ! x va à droite, y monte ! D'accord, apprenons les capteurs de cette section avec notre routine !

De plus, je tiens à dire que nous ne faisons pas ça spécifiquement, nous écrivons juste des choses pour nous amuser et acquérir de l'expérience, il y a beaucoup de choses Ne soyez pas trop sérieux ! 1.jpg

PS : Le capteur de direction utilise en fait un capteur d'accélération et un capteur de champ magnétique pour obtenir l'orientation. Il est abandonné depuis la 2.2~


<🎜. > 1. Capteur accéléromètre

1) Concept nominal :

  • unité de capteur d'accélération : Accélération ( m/s^2)
  • L'accélération obtenue par le capteur de direction est :
  • L'accélération combinée de l'accélération du téléphone portable et de l'accélération de la gravité (9,81 m/s^2)
  • De plus, l'accélération de la gravité est
  • verticalement vers le bas !
Le calcul de l'accélération totale dans différentes directions semble assez compliqué, nous ne nous en soucierons donc pas ici ! Jetons d'abord un coup d'œil aux valeurs des trois nombres dans le tableau des valeurs d'accélération~ C'est toujours le code de la section précédente, changez simplement le capteur~

Placez-le horizontalement : 2.png Placé verticalement  : 3.png Placé verticalement horizontalement  : 4.png

De ce qui précède, nous savons que les trois valeurs du tableau de valeurs correspondent aux axes X, Y et Z respectivement L'accélération ! Bon, maintenant que nous avons une idée générale, écrivons un podomètre simple pour nous familiariser avec son utilisation !

2). Mise en place d'un podomètre simple

Rendu d'opération :

5.gif

Implémentation du code:

Code de mise en page:

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp"
        android:text="简易计步器"
        android:textSize="25sp" />

    <TextView
        android:id="@+id/tv_step"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dp"
        android:text="0"
        android:textColor="#DE5347"
        android:textSize="100sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_start"
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:text="开始"
        android:textSize="25sp" /></LinearLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener, SensorEventListener {

    private SensorManager sManager;
    private Sensor mSensorAccelerometer;
    private TextView tv_step;
    private Button btn_start;
    private int step = 0;   //步数
    private double oriValue = 0;  //原始值
    private double lstValue = 0;  //上次的值
    private double curValue = 0;  //当前值
    private boolean motiveState = true;   //是否处于运动状态
    private boolean processState = false;   //标记当前是否已经在计步


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mSensorAccelerometer = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sManager.registerListener(this, mSensorAccelerometer, SensorManager.SENSOR_DELAY_UI);
        bindViews();
    }

    private void bindViews() {

        tv_step = (TextView) findViewById(R.id.tv_step);
        btn_start = (Button) findViewById(R.id.btn_start);
        btn_start.setOnClickListener(this);
    }


    @Override
    public void onSensorChanged(SensorEvent event) {
        double range = 1;   //设定一个精度范围
        float[] value = event.values;
        curValue = magnitude(value[0], value[1], value[2]);   //计算当前的模
        //向上加速的状态
        if (motiveState == true) {
            if (curValue >= lstValue) lstValue = curValue;
            else {
                //检测到一次峰值
                if (Math.abs(curValue - lstValue) > range) {
                    oriValue = curValue;
                    motiveState = false;
                }
            }
        }
        //向下加速的状态
        if (motiveState == false) {
            if (curValue  range) {
                    //检测到一次峰值
                    oriValue = curValue;
                    if (processState == true) {
                        step++;  //步数 + 1
                        if (processState == true) {
                            tv_step.setText(step + "");    //读数更新
                        }
                    }
                    motiveState = true;
                }
            }
        }
    }

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

    @Override
    public void onClick(View v) {
        step = 0;
        tv_step.setText("0");
        if (processState == true) {
            btn_start.setText("开始");
            processState = false;
        } else {
            btn_start.setText("停止");
            processState = true;
        }
    }

    //向量求模
    public double magnitude(float x, float y, float z) {
        double magnitude = 0;
        magnitude = Math.sqrt(x * x + y * y + z * z);
        return magnitude;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        sManager.unregisterListener(this);
    }
}

D'accord, c'est vraiment un podomètre très simple... Le nombre de pas ci-dessus a été fait par moi en étant assis...

, après tout, c'est juste pour m'amuser~6.gif


2. Capteur gyroscope

1) Concept nominal :

Le gyroscope est également appelé capteur de vitesse angulaire, qui est généralement utilisé pour détecter les téléphones portables. . Attitude, il parait que les capteurs gyroscopes des téléphones portables sont généralement à trois axes ! Les jeux de détection de mouvement sont les plus couramment utilisés, tels que la stabilisation du bougé de l'appareil photo du téléphone portable, la navigation inertielle GPS et l'ajout d'une détection de mouvement à l'APP (comme secouer doucement le téléphone). Désactivez la sonnerie des appels entrants), etc. Pour plus de détails, vous pouvez vous rendre sur Baidu vous-même ~

  • Unité du capteur gyroscope :Vitesse angulaire (radians/seconde) radians /seconde
  • Le capteur est obtenu en utilisant : Sensor.TYPE_GYROSCOPE

Ses trois valeurs sont tournées le long de l'axe X, Y- axe et vitesse angulaire, lorsque le téléphone mobile tourne dans le sens inverse des aiguilles d'une montre, la valeur de la vitesse angulaire est positive, tandis que dans le sens des aiguilles d'une montre, elle est négative ! Souvent utilisé pour calculer l’angle de rotation du téléphone ! Ceci est un morceau de code sur Internet~

private static final float NS2S = 1.0f / 1000000000.0f;
private float timestamp;

public void onSensorChanged(SensorEvent event)
{
    if (timestamp != 0)
    {
        // event.timesamp表示当前的时间,单位是纳秒(1百万分之一毫秒)
        final float dT = (event.timestamp - timestamp) * NS2S;
        angle[0] += event.values[0] * dT;
        angle[1] += event.values[1] * dT;
        angle[2] += event.values[2] * dT;
    }
    timestamp = event.timestamp;
}

En utilisant la différence de temps (dT) entre deux acquisitions de données adjacentes par le capteur gyroscope, l'angle de rotation du téléphone mobile le long des axes X, Y et Z les axes pendant cette période de temps sont calculés et accumulent respectivement les valeurs sur différents éléments du tableau d'angles


3 Téléchargez l'exemple de code pour cette section :

SensorDemo4.zip.


Résumé de cette section :

D'accord, cette section vous présente brièvement le capteur d'accélération et le gyroscope, et écrit un simple podomètre. J'ai l'impression de n'avoir pas beaucoup joué avec les capteurs, donc il n'y a rien à écrire. Oubliez ça, je présenterai brièvement les capteurs restants dans la section suivante. Oubliez ça, traitez-le simplement comme de la science populaire et étudiez-le en profondeur si vous avez besoin de l'utiliser à l'avenir ~7.jpg