Android_这点事_传感器

Android_这点事_传感器

传感器的坐标体系

安卓中的传感器中的传感数据都是以下图所示的坐标体系进行传递的,这张图是Android传感器的基础
在这里插入图片描述
X轴 从设备的左边到右边
Y轴 从设备的底部到顶部
Z轴 从设备的背面穿过设备指向屏幕

加速度传感器

加速度传感器又叫G_Sensor,是能够测量加速力的电设备,加速力就是物体在加速过程中施加给物体的一种力
返回设备的X轴,Y轴,Z轴方向上的加速度值
工作原理:惯性原理
举例:重力加速度为 9.8m/s,即当物体自由下落的时候的物体的加速度为9.8

磁场传感器

磁场传感器返回设备在X轴,Y轴,Z轴的磁力值
单位:uT 即微特斯拉
应用:指南针罗盘

陀螺仪

返回设备在围绕X轴,Y轴,Z轴的角速度值
单位:弧度
说明:返回的是一个速度值,这个值反应设备翻转的快慢

相关传感器代码

package com.hengda.insdemo.ins.controller

import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.util.Log
import com.hengda.insdemo.ins.callback.SensorCallback

/**
 * 作者:hanshizhe
 * 邮箱:hanshizhe@foxmail.com
 * 时间:2018/12/5 9:05
 * 描述:方向传感器(加速度、地磁)控制器
 *
 *
 * 加速度传感器              -->  返回X轴Y轴Z轴方向的加速度值,      单位为m/S2
 * 接近传感器               --> 返回是否有物体接近它,一些传感器也可以告诉你距离有多远通常作用范围只有5厘米
 * 地磁传感器               --> 返回设备在X轴或Y轴或Z轴的磁力值,   单位为 ut 即微特斯拉  应用为:指南针,罗盘
 * 陀螺仪                  --> 返回设备围绕X轴或Y轴或Z轴的角速度值,单位为 弧度     <这里返回的是一个速度值>
 */
class SensorController(var manager: SensorManager, var callback: SensorCallback) : SensorEventListener {

    companion object {
        const val DEGREE_ARRAY_SIZE = 100
    }
    //用来保存加速度传感器的值
    private var accelerometerValues = FloatArray(3)
    //用来保存地磁传感器的值
    private var magneticValues = FloatArray(3)
    //用来保存最终的结果
    private var values = FloatArray(3)
    //
    private var r = FloatArray(9)
    //保存角度
    private var degreeArray = DoubleArray(DEGREE_ARRAY_SIZE)
    private var arrayIndex = 0
    /*
    * 注册传感器监听
    *  以下为硬件传感器的采样频率,采样评率依次变慢
    *  SensorManager.SENSOR_DELAY_FASTEST
    *  SensorManager.SENSOR_DELAY_GAME
    *  SensorManager.SENSOR_DELAY_UI
    *  SensorManager.SENSOR_DELAY_NORMAL
    */
    fun register(): Boolean {
        if (manager == null) return false
        //加速度传感器
        val r1 = manager.registerListener(this, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI)
        //磁场传感器
        val r2 = manager.registerListener(this, manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI)
        //陀螺仪
        val r3 = manager.registerListener(this, manager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR), SensorManager.SENSOR_DELAY_NORMAL)
        return r1 && r2 && r3
    }

    /*
    * 取消注册
    */
    fun unregister() {
        try {
            manager.unregisterListener(this)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    /*
    * 取消注册
    */
    override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {

    }

    /*
    * 传感器发生变化
    */
    override fun onSensorChanged(event: SensorEvent) {
        if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
            //加速度值
            accelerometerValues = event.values.clone()
            callback.onAccs(event.values.clone())
        } else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
            //地磁传感器
            magneticValues = event.values.clone()
            callback.onMagnetic(magneticValues)
        } else if (event.sensor.type == Sensor.TYPE_ROTATION_VECTOR) {
            //陀螺仪
            callback.onRot(Math.toDegrees(event.values[0].toDouble()))
        }
        //通过加速度值与地磁传感器的值计算出数组为9的大小的矩阵
        SensorManager.getRotationMatrix(r, null, accelerometerValues, magneticValues)
        //根据旋转矩阵计算设备的方向 输出弧度 values
        SensorManager.getOrientation(r, values)
        //通过弧度计算出角度
        var degree = Math.toDegrees(values[0].toDouble())
        //计算角度
        if (degree < 0) degree += 360
        //获取100个角度数据计算平均值
        degreeArray[arrayIndex] = degree
        arrayIndex++
        if (arrayIndex == DEGREE_ARRAY_SIZE) {
            degree = computeAvgDegree(degreeArray)
            //回调角度
            callback.onAngle(degree)
            arrayIndex = 0
        }
    }

    /*
    * 计算平均角度(冒泡排序取中间值)
    */
    private fun computeAvgDegree(degreeArray: DoubleArray): Double {
        val array = degreeArray.clone()
        val count = array.size
        for (i in 0 until count - 1) {
            for (j in 0 until count - i - 1) {
                if (array[j] > array[j + 1]) {
                    val a = array[j + 1]
                    array[j + 1] = array[j]
                    array[j] = a
                }
            }
        }
        return array[count / 2]
    }
}

参考

Android手机中的加速度计与陀螺仪
Android操作系统11种传感器介绍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值