锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

android中传感器的应用

时间:2022-08-26 17:00:00 振动速度传感器yz

googleandroid一共提供了14传感器。下面我将根据官方情况reference以及API介绍所有传感器,并附上代码例子。

大部分Android平台设备有多个传感器,可以监控其方向和运动状态的变化。 许多设备还有其他类型的传感器,可以感知周围的环境条件,如温度、压力、湿度和光线。 你可以利用Android访问这些传感器并获取原始传感器数据的传感器框架。

传感器框架提供了丰富的类别和接口,可以帮助您完成许多与传感器相关的工作。Android传感器框架允许您访问多种类型的传感器。有的是硬件,有的是软件。 基于硬件的传感器是内置在手持或桌面设备中的物理部件。它们直接测量环境参数并发送加速度、地磁强度、角速度等数据。 基于软件的传感器没有物理设备,尽管它们也模仿硬件传感器。基于软件的传感器数据来自一个或多个硬件传感器,有时被称为虚拟传感器或合成传感器。 基于软件的线性加速度传感器和重力传感器

有许多类型的传感器,可以拥有所有类型的传感器Android设备非常罕见。例如,大多数手持设备和桌面设备都有加速度和磁性传感器,但气压计和温度计要少得多。 而且,某种传感器的数量可以在一个设备上有多个。例如,一个设备可以配备两个重力传感器,每个传感器的范围不同。

根据其测量类型,传感器分为三种类型:移动传感器(motion sensor)、位置传感器position sensor)以及环境传感器environment sensor)。

Android平台提供了5传感器可以监控设备的移动。包括:加速度传感器、重力传感器、陀螺仪传感器、旋转矢量传感器、线性加速度传感器。两个是基于硬件的(加速度传感器和陀螺仪),三个传感器可以是基于硬件或软件(重力传感器、线性加速度传感器和旋转矢量传感器)。例如,一些基于软件传感器的设备会从加速度传感器和磁力仪中提取数据,但陀螺仪也可以用于其他设备提取数据。大多数Android所有设备都有加速度传感器和陀螺仪。基于软件的传感器是可变的,因为它们依赖于一个或多个硬件传感器来提取相应的数据。

移动传感器用于监控设备的移动,如倾斜、振动、旋转或摆动。移动通常是直接用户输入的反映(例如,用户在游戏中操作汽车或控制球),但也可以反映设备的物理环境(例如,在驾驶汽车时移动位置)。在第一个场景中,您应该监控设备的移动,而不是设备的参考系统或应用程序的参考系统。在第二个场景中,您应该监控设备的移动,而不是全球参考系统。一般来说,移动传感器本身不用于监控设备的位置,但它们可以与其他传感器一起使用,比如与地磁传感器一起判断设备相对于全球参考系统的位置。

Android该平台提供了两种用于判断设备位置的传感器:地磁场传感器和方向传感器,以及一种用于判断设备面板是否接近一个对象的传感器(即距离传感器)。基于硬件的地磁场传感器和距离传感器。大多数手持设备和平板电脑制造商都在其设备中包含地磁场传感器。同样,手持设备制造商也包含一个距离传感器来判断手持设备是否靠近人脸(例如,在电话呼叫期间)。方向传感器是基于软件的,并且要从加速度传感器和地磁场传感器来获取数据。

位置传感器有利于判断设备在全球参考系中的物理位置。例如,使用地磁场传感器和加速度传感器的组合来判断设备相对于磁场北极的位置。方向传感器(或类似于基于传感器的方位方法)也可以用来判断设备在您应用程序参考系统中的位置。通常,位置传感器不用于监控设备的移动或手势,如振动、倾斜或推动(更多信息,请参见MotionSensors)。地磁场传感器和方向传感器SensorEvent返回传感器值的多维数组。例如,在单独的传感器事件中,方向传感器的三个坐标中的每个都提供了地磁场的强度值。同样,方向传感器在传感器事件中提供方向角(旋转角)、倾斜度和摇晃值。值得一提的是,方向传感器已经过时,现在可以使用获取方向getOrientation()替代方法。

Android 该平台提供测环境参数提供了四种传感器。您可以使用这些传感器进行监测 Android 湿度、光照、气压、温度等环境。 这四种传感器都是基于硬件的,当然需要制造商在设备中使用。 除了制造商用来控制屏幕亮度的光传感器外,其他环境传感器可能不会内置在设备中。 因此,在试图读取数据之前,实时验证传感器的存在尤为重要。

与大部分运动和位置传感器返回多维数组数据不同,环境传感器在 SensorEvent 事件中返回的是单个值。比如,温度单位就是 °C,气压单位就是 hPa 而且,也不像运动和方位传感器那样常常需要高通和低通滤波处理,环境传感器一般不需要进行任何数据过滤或处理。

 

下面就各种类型传感器进行详细讲解。

(1)       加速度传感器  #define SENSOR_TYPE_ACCELEROMETER

加速度传感器又叫G-sensor,返回xyz三轴的加速度数值。该数值包含地心引力的影响,单位是m/s^2。将手机平放在桌面上,x轴默认为0y轴默认0z轴默认9.81

加速度传感器使用标准的传感器器坐标系统。在实践中,当设备以它自然的方向被平方在桌面时,下列条件是适用的: 

1. 如果在左边推动设备(让它向右移动),那么X轴的加速度值就是正值;

2. 如果在底部推动设备(让它向上移动),那么Y轴的加速度值就是正值; 

3. 如果向着天空,用A m/s2 的加速度来推动设备,那么Z轴的加速度值就是A+9.81,它

对应了设备的加速度(+A m/s2)减去重力作用(-9.81 m/s2)。 

4. 静止的设备的有一个+9.81的加速度值,它对应设备的加速度(0 m/s2减去重力作用,也

就是-9.81 m/s2)。 

通常,加速度传感器是一种用于监视设备移动的比较好的传感器。几乎每种Android手持设备和平板电脑都有加速度传感器,而且它的能耗要比其他的移动传感器要低10倍。唯一的缺点是,你要实现低通和高通滤波来消除重力作用和减少噪音的影响。

使用传感器时:

首先要定义: private Sensor myaccelerometer;

                  private SensorManager myManager;

这是一个传感器类型和一个传感器控制类型。

然后要获取服务

myManager = (SensorManager)getSystemService(SENSOR_SERVICE);

以及获取传感器对象

myaccelerometer = myManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

然后需要声明一个SensorEventListener 对象用于侦听Sensor 事件,重载public void onSensorChanged(SensorEvent event)方法

最后是要对SensorService进行注册,在不用时销毁注册。

 

示例代码如下:

public class Sensor1 extends Activity{

private Sensor myaccelerometer;

private SensorManager myManager;

private TextView myTextView;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.sensor1);

 

myTextView = (TextView)findViewById(R.id.textView3);

 

myManager = (SensorManager)getSystemService(SENSOR_SERVICE);

myaccelerometer = myManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

 

xyzpre[0] = 0;

xyzpre[1] = 0;

xyzpre[2] = 0;

}

 

private float xyz[] = new float[3];

private float xyzpre[] = new float[3];

 

private class Mysensorlistener implements SensorEventListener{

 

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

}

int temp=0;

@Override

public void onSensorChanged(SensorEvent event) {

// TODO Auto-generated method stub

temp++;

if(temp == 10)

{

xyz[0] = event.values[0]-xyzpre[0];

xyz[1] = event.values[1]-xyzpre[1];

xyz[2] = event.values[2]-xyzpre[2];

 

xyzpre[0] = event.values[0];

xyzpre[1] = event.values[1];

xyzpre[2] = event.values[2];

 

if(xyz[0] > 3.5){

 

}

 

temp = 0;

}

myTextView.setText("x:"+xyz[0]+"\n"+"y:"+xyz[1]+"\n"+"z:"+xyz[2]);

 

}

}

Mysensorlistener Mylistener = new Mysensorlistener();

 

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

 

myManager.registerListener(Mylistener, myaccelerometer,(int) 10e17);

 

}

@Override

protected void onPause() {

// TODO Auto-generated method stub

myManager.unregisterListener(Mylistener);

 

super.onPause();

}

 

(2)       旋转矢量传感器 #define SENSOR_TYPE_ROTATION_VECTOR

旋转矢量传感器简称RV-sensor。旋转矢量代表设备的方向,是角度和坐标轴的一个组合,通过一个角θ绕着坐标轴旋转得到。

RV-sensor输出:

sin(θ/2)RV的数量级。

RV的方向与轴旋转的方向相同。

RV的三个数值,与cos(theta/2)组成一个四元组。

RV的数据没有单位,xyz使用的坐标系与加速度相同。

参考坐标系是一个直接的标准正交基。其中:

l  X定义为由YZ产生,这是切向于设备的当前位置所在的地面,大致指向东。

l  Y是切线向于设备的当前位置的地面指向磁北极。

l  Z轴指向天空垂直于地面。

传感器返回五个值为:

values[0]: x*sin(θ/2)

values[1]: y*sin(θ/2)

values[2]: z*sin(θ/2)

values[3]: cos(θ/2)

values[4]: estimated heading Accuracy (in 弧度) (-1 if unavailable)

下列代码显示了如何获取默认的旋转矢量传感器的实例:

privateSensorManager mSensorManager;

privateSensor mSensor;..

.mSensorManager =(SensorManager) getSystemService(Context.SENSOR_SERVICE);

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

 

对于移动检测和监视,旋转矢量传感器和重力传感器是使用频率最高的传感器。旋转矢量传感器尤其灵活,可广泛的应用于移动相关的任务,如,检测手势、监视角度变化、监视相对的方向变化等。例如:如果你正在开发一款使用2维或3维罗盘来增强现实感游戏,或增强相机的稳定性的应用程序,那么旋转矢量传感器是非常理想的选择。在大多场景中,使用这些传感器比使用加速度传感器和地磁传感器或方向传感器要好。

 

(3)       未校准的旋转矢量传感器 #define SENSOR_TYPE_GAME_ROTATION_VECTOR 

此传感器除了未使用地磁场以外,和ROTATION_VECTOR是一样的。因此它的Y轴并不指向北,而是指向其他参照,这个参照允许与陀螺仪绕漂移是同一数量级的,漂移是围绕Z轴的。

在理想情况下,一个电话旋转和回到同样的现实世界的方位应该报告相同的游戏旋转矢量(不使用地球磁场)。然而,定位可能随时间有些漂移。

这个传感器不存在value[4]这个值。

 

(4)       陀螺仪传感器  #define SENSOR_TYPE_GYROSCOPE

陀螺仪传感器叫做Gyro-sensor,返回xyz三轴的角速度数据。陀螺仪以rad/s(弧度/每秒)为单位围绕设备的XYZ轴来测量速率或旋转角度。下列代码显示了如何获取一个默认的陀螺仪的实例: 

private SensorManager mSensorManager; private Sensor mSensor; ... 

mSensorManager = (SensorManager) 

getSystemService(Context.SENSOR_SERVICE); 

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 

该传感器的坐标系统与加速度传感器所使用的坐标系统是相同的。逆时针方向旋转是正值,也就是说,如果设备是逆时针旋转,那么观察者就会看到一些有关以设备原点为中心的正向的XYZ轴的位置。这是标准的正向旋转的数学定义,并且与方向传感器所使用的用于滚动的定义不同。

根据Nexus S手机实测:

水平逆时针旋转,Z轴为正。

水平顺时针旋转,z轴为负。

向左旋转,y轴为负。

向右旋转,y轴为正。(待商榷,实测为准,自己测试一下)

向上旋转,x轴为负。

向下旋转,x轴为正。

通常,陀螺仪的输出会被集成到时间上,以便计算在一定时间步长之上旋转角度的变化

示例:

// Create a constant to convert nanoseconds to seconds.
private static final float NS2S = 1.0f / 1000000000.0f;
private final float[] deltaRotationVector = new float[4]();
private float timestamp;

public void onSensorChanged(SensorEvent event) {
  // This timestep's delta rotation to be multiplied by the current rotation
  // after computing it from the gyro sample data.
  if (timestamp != 0) {
    final float dT = (event.timestamp - timestamp) * NS2S;
    // Axis of the rotation sample, not normalized yet.
    float axisX = event.values[0];
    float axisY = event.values[1];
    float axisZ = event.values[2];

    // Calculate the angular speed of the sample
    float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);

    // Normalize the rotation vector if it's big enough to get the axis
    // (that is, EPSILON should represent your maximum allowable margin of error)
    if (omegaMagnitude > EPSILON) {
      axisX /= omegaMagnitude;
      axisY /= omegaMagnitude;
      axisZ /= omegaMagnitude;
    }

    // Integrate around this axis with the angular speed by the timestep
    // in order to get a delta rotation from this sample over the timestep
    // We will convert this axis-angle representation of the delta rotation
    // into a quaternion before turning it into the rotation matrix.
    float thetaOverTwo = omegaMagnitude * dT / 2.0f;
    float sinThetaOverTwo = sin(thetaOverTwo);
    float cosThetaOverTwo = cos(thetaOverTwo);
    deltaRotationVector[0] = sinThetaOverTwo * axisX;
    deltaRotationVector[1] = sinThetaOverTwo * axisY;
    deltaRotationVector[2] = sinThetaOverTwo * axisZ;
    deltaRotationVector[3] = cosThetaOverTwo;
  }
  timestamp = event.timestamp;
  float[] deltaRotationMatrix = new float[9];
  SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector);
    // User code should concatenate the delta rotation we computed with the current rotation
    // in order to get the updated rotation.
    // rotationCurrent = rotationCurrent * deltaRotationMatrix;
   }
}

标准的陀螺仪提供了原始的旋转数据,并不带有任何过滤或噪音和漂移(偏心)的校正。在实践中,陀螺仪的噪音和漂移会引入错误,因此需要对此进行抵消处理。通常通过监视其他传感器,如重力传感器或加速度传感器来判断漂移(偏心)和噪音。

 

(5)       重力传感器  #define SENSOR_TYPE_GRAVITY

重力传感器简称GV-sensor,输出重力数据。在地球上,重力数值为9.8,单位是m/s^2。坐标系统与加速度传感器相同。

假设当地的重力加速度值为g x=y=0 时,手机处于水平放置状态。 

     当手机正面朝上的时候,z的值为q,反面朝上的时候,z的值为-g

     当手机右侧面朝上的时候,x的值为g,左侧面朝上的时候,x的值为-g

     当手机上侧面朝上的时候,y的值为g,下侧面朝上的时候,y的值为-g

重力传感器和加速度传感器非常类似,在某些时候并无差别。根据reference上的说法,重力传感器显示的是xyz轴三个方向上的重力加速度。当设备休息时,重力传感器的输出和加速度传感器一样。

使用方法和加速度传感器一样。

首先定义SensorManagerSensor对象,然后开启服务,然后设置监听器,重写onSensorChanged()方法。然后对传感器进行register就可以进行使用了。示例如下:

private SensorManager sm = null;

private Sensor gravity_sensor = null;

sm = (SensorManager)getSystemService(SENSOR_SERVICE);

gravity_sensor = sm.getDefaultSensor(Sensor.TYPE_GRAVITY);

 private class Mysensorlistener implements SensorEventListener{

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

// TODO Auto-generated method stub

 

}

@Override

public void onSensorChanged(SensorEvent event) {

// TODO Auto-generated method stub

 

}

}

Mysensorlistener Mylistener = new Mysensorlistener();

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

sm.registerListener(Mylistener, gravity_sensor,(int) 10e17);

}

@Override

protected void onPause() {

// TODO Auto-generated method stub

sm.unregisterListener(Mylistener);

super.onPause();

 

}

 

(6)       线性加速度传感器  #define SENSOR_TYPE_LINEAR_ACCELERATION

线性加速度传感器简称LA-sensor。线性加速度传感器是加速度传感器减去重力影响获取的数据。单位是m/s^2,坐标系统与加速度传感器相同。

加速度传感器、重力传感器和线性加速度传感器的计算公式如下:

加速度 = 重力 + 线性加速度

下列代码显示了如何获取默认的线性加速度传感器的实例: 

private SensorManager mSensorManager; 

private Sensor mSensor; 

... 

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); 

通常,在想要获取没有重力影响的加速度数据时,使用这种传感器。例如,你能够使用这种传感器来看你的汽车运行速度。线性加速度传感器始终有一个偏移量,你需要删除这个偏移量。做这件事的最简单的方法就是在你的应用程序中建立一个校准处理。在校准期间,你能够要求用户把设备放到桌面上,读取所有三轴的偏移量,然后从加速度传感器中读取的数据中直接减去对应的偏移量,来获取线性加速度。

 

(7)       地磁场传感器  #define SENSOR_TYPE_MAGNETIC_FIELD

磁力传感器简称为M-sensor,返回xyz三轴的环境磁场数据。该数值的单位是微特斯拉(micro-Tesla),用uT表示。单位也可以是高斯(Gauss),1Tesla=10000Gauss

地磁场传感器让你能够监视地球磁场的变化。下列代码显示了如何获取默认地磁场传感器实例: 

private SensorManager mSensorManager; 

private Sensor mSensor; 

... 

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 

传感器分别提供三个坐标轴方向的原始磁场强度数据(以μT为单位)。通常,你不需要直接使用这种传感器。相反,你能够使用旋转矢量传感器来判断原始的旋转运动,或者使用加速度传感器和地磁场传感器跟getRotationMatrix()方法的组合来获取旋转矩阵和倾斜矩阵。然后使用这些矩阵和getOrientation()getInclination()方法来获取方位角和磁场倾角数据。

 

(8)       方向传感器(现已被弃用  #define SENSOR_TYPE_ORIENTATION

方向传感器简称为O-sensor,返回三轴的角度数据,方向数据的单位是角度。

方向传感器会相对与地球参照系来监视设备的位置(特别是北极)。以下代码显示了如何获取默认的方向传感器的实例: 

private SensorManager mSensorManager; 

private Sensor mSensor;

 ... 

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

通过使用设备的地磁场传感器跟加速度传感器的组合来获取方向传感器的数据。使用这两个硬件传感器,方向传感器能够提供以下三个维度的数据: 

1. 方位角(围绕Z轴的旋转角度)。这是被和设备Y轴之间的角度。例如,如果设备的Y轴方向与北极一致,这该值是0,如果设备的Y轴指向南方,则该值是180。同样,当Y轴指向东方时,该值是90;指向西方时,该值是270 

2. 倾斜角(围绕X轴的旋转角度)。当正方向的Z轴向着正向的Y轴旋转时,该值是正值,

当正方向的Z轴向着负方向的Y轴旋转时,该值是负值。它的取值范围是180度到-180

度之间。 

3. 转角(围绕Y轴旋转的角度)。当正方向的Z轴向着正向的X轴旋转时,该值是正值,

当正方向的Z轴向着负方向的X轴旋转时,该值是负值。它的取值范围是90度到-90度之间。 

这种定义有别与航空领域的偏航、倾斜和滚动,飞行器的X轴是飞机的长边(从尾部到头部)。另外,由于历史原因,顺时针方向的转角是正值(从数学的角度,逆时针方向应该是正值)。

方向传感器通过处理来自加速度传感器和地磁场传感器的原始数据来获取它的数据。因为要涉及到重力处理,所以方向传感器的精度和准确度会受到影响(特别是,这种传感器只在转角部分是0

相关文章