Topik Penderia (3)——Penderia Pecutan/Gyro


Pengenalan kepada bahagian ini:

Bahagian ini terus membincangkan penderia dalam Android Bahagian ini membawakan penderia pecutan (Penderia pecutan) dan Penderia giroskop, seperti penderia arah dalam bahagian sebelumnya, mempunyai tiga paksi: x, y dan z. Satu lagi perkara yang perlu diperkatakan: koordinat paksi x dan y mesti dibezakan daripada paksi x dan y lukisan itu! Sensor berada di sudut kiri bawah Untuk asal usul! x pergi ke kanan, y naik! Okey, mari pelajari penderia dalam bahagian ini dengan rutin kami!

Di samping itu, saya ingin mengatakan bahawa kami tidak melakukan ini secara khusus, kami hanya menulis perkara untuk keseronokan dan menimba pengalaman, terdapat banyak perkara Jangan serius sangat! 1.jpg

PS: Penderia arah sebenarnya menggunakan penderia pecutan dan penderia medan magnet untuk mendapatkan orientasi Ia telah ditinggalkan sejak 2.2~


1. Sensor pecutan

1) Konsep kata nama:

  • unit penderia pecutan : Pecutan ( m/s^2)
  • Pecutan yang diperoleh oleh penderia arah ialah: Pecutan gabungan pecutan telefon mudah alih dan pecutan graviti (9.81m/s^2)
  • Selain itu, pecutan graviti adalah menegak ke bawah!

Pengiraan jumlah pecutan dalam arah berbeza nampaknya agak rumit, jadi kami tidak akan bimbang tentangnya di sini! Mari kita lihat nilai-nilai tiga nombor dalam tatasusunan nilai pecutan~ Ia masih kod dari bahagian sebelumnya, cuma tukar penderia~

Letakkannya secara mendatar: 2.png Diletakkan secara menegak : 3.png Diletakkan secara menegak secara mendatar : 4.png

Daripada perkara di atas kita tahu bahawa tiga nilai tatasusunan nilai sepadan kepada paksi X, Y, dan Z masing-masing Pecutan! Okay, sekarang kita mempunyai idea kasar, mari tulis alat pengukur langkah mudah untuk membiasakan diri dengan penggunaannya!

2). Pelaksanaan alat pengukur langkah mudah

Penyampaian operasi:

5.gif

Pelaksanaan kod

:Kod reka letak:

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

:6.gif

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);
    }
}

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;
}
<🎜> >Baiklah, ia benar-benar alat pengukur langkah yang sangat mudah... Bilangan langkah di atas telah saya ambil semasa duduk... <🎜>, lagipun, ia hanya untuk keseronokan~<🎜>

2. Penderia giroskop

1) Konsep kata nama:

Gyro juga dipanggil penderia halaju sudut, yang biasanya digunakan untuk mengesan telefon bimbit . Sikap, nampaknya penderia giroskop dalam telefon mudah alih biasanya tiga paksi! Permainan penderiaan gerakan adalah yang paling biasa digunakan, seperti penstabilan gegaran kamera telefon mudah alih, navigasi inersia GPS dan menambahkan beberapa penderiaan gerakan pada APP (seperti menggoncang telefon perlahan-lahan). Matikan nada dering panggilan masuk), dsb. Untuk butiran, anda boleh pergi ke Baidu sendiri~

  • Unitpenderia giroskop:Radian halaju sudut (radian/saat) /saat
  • Penderia diperoleh menggunakan: Sensor.TYPE_GYROSCOPE

Tiga nilainya diputar di sepanjang paksi X, Y- paksi, dan paksi Z, apabila telefon bimbit berputar mengikut arah jam, nilai halaju sudut adalah positif, manakala mengikut arah jam ia adalah negatif! Selalunya digunakan untuk mengira sudut telefon telah bertukar! Ini ialah sekeping kod di Internet~

rrreee

Menggunakan perbezaan masa (dT) antara dua pemerolehan data bersebelahan oleh penderia giroskop, sudut putaran telefon mudah alih di sepanjang X, Y dan Z paksi dalam tempoh masa ini dikira, dan Kumpul nilai masing-masing kepada elemen tatasusunan sudut yang berbeza


3. Muat turun kod sampel untuk bahagian ini:

SensorDemo4.zip


Ringkasan bahagian ini:

Baiklah, bahagian ini memperkenalkan secara ringkas penderia pecutan dan giroskop kepada anda, dan menulis pedometer ringkas. Saya rasa saya tidak banyak bermain dengan penderia, jadi tidak ada apa-apa untuk ditulis, saya akan memperkenalkan secara ringkas baki penderia di bahagian seterusnya. Lupakan sahaja, anggap saja ia sebagai sains popular dan kaji dengan mendalam jika anda perlu menggunakannya pada masa hadapan~7.jpg