Android API Guides---Position Sensors

Position Sensors

Android平台提供了两个感应器,让你确定设备的位置:地磁传感器和方向传感器。 Android平台还提供了一个传感器,可以让你确定设备的脸有多接近一个对象(被称为接近传感器)。地磁场传感器和接近传感器是基于硬件的。大多数手机和平板电脑制造商包括地磁传感器。同样,手机制造商通常包括接近传感器,以确定何时被保持靠近用户的面部(例如,在电话呼叫)的手机。方位传感器是基于软件的,并从加速度计和地磁场传感器获得其数据。


注:方向传感器的Andr​​oid 2.2(API级别8)被废弃。


位置传感器,用于确定在参考世界帧一个设备的物理位置是有用的。例如,您可以结合使用地磁传感器与加速度计来确定设备的相对磁北极的位置。您也可以使用方向传感器(或类似的基于传感器的定位方式),以确定设备在参考应用程序的框的位置。位置传感器通常不用于监控设备的运动,或运动,如抖动,倾斜,或推力(有关详细信息,请参阅运动传感器)。


地磁场传感器和方向传感器返回每个SensorEvent传感器值的多维阵列。例如,方向传感器的单个传感器事件期间为三个坐标轴的提供地磁强度值。同样地,方位传感器的单个传感器事件期间提供方位角(偏航),俯仰和翻滚值。有关由传感器使用的坐标系统的更多信息,请参阅传感器坐标系。接近传感器提供每个传感器事件的单个值。表1总结了所支持的Andr​​oid平台上的位置传感器。


所支持的Andr​​oid平台上表1.位置传感器。
传感器传感器事件数据说明测量单位
沿x轴TYPE_GAME_ROTATION_VECTOR SensorEvent.values​​ [0]旋转矢量分量(X * SIN(θ/ 2))。无单位
沿y轴(y * SIN(θ/ 2))SensorEvent.values​​ [1]旋转矢量分量。
沿z轴SensorEvent.values​​ [2]旋转矢量成分(Z * SIN(θ/ 2))。
沿x轴TYPE_GEOMAGNETIC_ROTATION_VECTOR SensorEvent.values​​ [0]旋转矢量分量(X * SIN(θ/ 2))。无单位
沿y轴(y * SIN(θ/ 2))SensorEvent.values​​ [1]旋转矢量分量。
沿z轴SensorEvent.values​​ [2]旋转矢量成分(Z * SIN(θ/ 2))。
TYPE_MAGNETIC_FIELD SensorEvent.values​​ [0]沿x轴地磁的磁场强度。 μT
SensorEvent.values​​ [1]沿y轴地磁的磁场强度。
SensorEvent.values​​ [2]沿着z轴地磁的磁场强度。
沿x轴TYPE_MAGNETIC_FIELD_UNCALIBRATED SensorEvent.values​​ [0]地磁场强(没有硬铁校准)。 μT
SensorEvent.values​​ [1]地磁场强(没有硬铁校准)沿y轴。
SensorEvent.values​​ [2]地磁场强(没有硬铁校准)沿z轴。
沿x轴SensorEvent.values​​ [3]铁偏差估计。
沿y轴SensorEvent.values​​ [4]铁偏差估计。
沿z轴SensorEvent.values​​ [5]铁偏差估计。
TYPE_ORIENTATION1 SensorEvent.values​​ [0]方位角(围绕Z轴的角度)。度
SensorEvent.values​​ [1]间距(绕x轴角)。
SensorEvent.values​​ [2]卷轴(绕y轴角)。
TYPE_PROXIMITY SensorEvent.values​​ [0] object.2厘米的距离
1此传感器在Android 2.2的(API级别8)已过时。传感器框架提供用于获取设备取向,这是在使用方向传感器讨论的替代方法。


2有些接近传感器提供近及远仅代表二进制值。


使用游戏旋转矢量传感器


游戏旋转向量传感器是相同的旋转矢量传感器,除了它不使用地磁场。因此,Y轴不北,而是指向其它一些参考。该引用允许数量级的顺序相同的陀螺仪绕Z轴漂移漂移。


因为游戏旋转矢量传感器不使用磁场,相对的旋转是更精确,而不是由磁场的变化的影响。使用这种传感器在游戏中,如果你不关心,其中北,和正常旋转向量不适合,因为其对磁场的依赖您的需求。


下面的代码演示了如何获得默认的游戏旋转矢量传感器的一个实例:

private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);
使用地磁旋转矢量传感器


地磁旋转向量传感器是类似于旋转矢量传感器,但它使用磁力,而不是一个陀螺仪的。该传感器的精度比所述正常旋转矢量传感器低,但功率消耗被降低。只有当你想收集的一些背景信息,旋转不消耗太多的电池使用这种传感器。在与配料一起使用时,这种传感器是最有用的。


下面的代码演示了如何获得默认地磁旋转矢量传感器的一个实例:

private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);

使用方向传感器


该方向传感器可让您监视相对于参考(具体而言,磁北)地球的帧设备的位置。下面的代码展示了如何获得默认方向传感器的一个实例:

private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
方位传感器通过使用设备的地磁场传感器的组合与设备的加速计获得它的数据。使用这两个硬件传感器,方位传感器提供了以下三个方面的数据:


方位角(度围绕z轴的旋转)。这是磁北和设备的Y轴之间的夹角。例如,如果装置的Y轴与磁北对准此值是0,而如果该设备的Y轴是南指向这个值是180。同样地,当y轴指向东这个值是90,当它是指向西这个值是270。
间距(度围绕x轴的旋转)。这个值是正的,当正z轴朝向正的y轴旋转,并且它是负时正z轴朝向负y轴旋转。值的范围为180度到-180度。
辊(度围绕y轴的旋转)。这个值是正的,当正z轴朝向正x-轴旋转,并且它是负时正z轴朝向负x-轴旋转。值的范围为90度到-90度。
这个定义是从偏航,俯仰和横滚用于航空,其中X轴是沿平面(尾到鼻)的长边的不同。另外,由于历史原因侧倾角是在顺时针方向正(从数学上讲,它应该在逆时针方向为正)。


方位传感器通过从加速度计和地磁场传感器处理原始传感器数据导出其数据。因为所涉及的取向传感器的准确度和精确度被减少繁重的处理(具体而言,该传感器当轧辊分量为0是唯一可靠的)。其结果是,方向传感器中的Andr​​oid 2.2(API级别8)被废弃。而不是使用方向传感器的原始数据,我们建议您使用getRotationMatrix()方法会同getOrientation()方法来计算方向值。您也可以使用remapCoordinateSystem()方法的方向值转换为参考应用程序的框架。


下面的代码示例显示了如何直接从方向传感器获取方位数据。我们建议您这样做只是如果设备有微不足道的卷。

public class SensorActivity extends Activity implements SensorEventListener {

  private SensorManager mSensorManager;
  private Sensor mOrientation;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
  }

  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // Do something here if sensor accuracy changes.
    // You must implement this callback in your code.
  }

  @Override
  protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, mOrientation, SensorManager.SENSOR_DELAY_NORMAL);
  }

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

  @Override
  public void onSensorChanged(SensorEvent event) {
    float azimuth_angle = event.values[0];
    float pitch_angle = event.values[1];
    float roll_angle = event.values[2];
    // Do something with these orientation angles.
  }
}
你通常不会需要比翻译传感器的坐标系中参考应用程序的框架来执行任何数据处理或原始数据的过滤功能,您从一个方向传感器获得,其他。加速度计播放示例展示了如何加速度传感器数据转换成参考另一帧;该技术类似于你可能会和方向传感器使用的一个。


使用地磁传感器


该地磁传感器可用于监控地球磁场的变化。下面的代码演示了如何获得默认地磁传感器的一个实例:

private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
该传感器为三个坐标轴的提供原始的场强数据(μT)。通常情况下,你不需要直接使用此传感器。相反,你可以使用旋转矢量传感器确定生旋转运动,也可以使用加速度计和地磁传感器会同getRotationMatrix()方法来获取旋转矩阵和倾角矩阵。然后,您可以使用这些矩阵与getOrientation()和getInclination()方法来获取方位和地磁倾角数据。
使用未校准磁强计
未校正磁力类似地磁场传感器,不同的是不硬铁校准施加到磁场。工厂校准和温度补偿仍施加到磁场。未校准磁强计是处理不好的硬铁估计是有用的。一般情况下,geomagneticsensor_event.values​​ [0]将接近uncalibrated_magnetometer_event.values​​ [0] - 未校准磁强计event.values​​ [3]。那是,
calibrated_x〜= uncalibrated_x - bias_estimate_x
注意:未校准传感器,提供更多的原始结果和可能包括一些偏见,但他们的测量结果包含更正减少跳跃通过应用校准。一些应用可能更喜欢这些未校正结果更平滑,更可靠。例如,如果一个应用程序试图自行进行传感器融合,引入校准实际上可以扭曲的结果。
除了磁场,未校正磁力还提供了在各轴所估计的硬铁偏移。下面的代码展示了如何获得默认未校准的磁力计的一个实例:
私人的SensorManager mSensorManager;
私人传感器mSensor;
...
mSensorManager =(的SensorManager)getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);
使用接近传感器
接近传感器可以让您确定一个对象有多远从设备。下面的代码展示了如何获得默认接近传感器的一个实例:

private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
接近传感器通常被用于确定一个人的头部多远是从面部一个手持通话器设备(例如,当用户发起或接收电话呼叫)。最接近传感器返回的绝对距离,在厘米,但有些仅返回远近值。下面的代码演示了如何使用接近传感器:

public class SensorActivity extends Activity implements SensorEventListener {
  private SensorManager mSensorManager;
  private Sensor mProximity;

  @Override
  public final void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Get an instance of the sensor service, and use that to get an instance of
    // a particular sensor.
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
  }

  @Override
  public final void onAccuracyChanged(Sensor sensor, int accuracy) {
    // Do something here if sensor accuracy changes.
  }

  @Override
  public final void onSensorChanged(SensorEvent event) {
    float distance = event.values[0];
    // Do something with this sensor data.
  }

  @Override
  protected void onResume() {
    // Register a listener for the sensor.
    super.onResume();
    mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
  }

  @Override
  protected void onPause() {
    // Be sure to unregister the sensor when the activity pauses.
    super.onPause();
    mSensorManager.unregisterListener(this);
  }
}
注意:有些接近传感器返回代表“接近”或二进制值“远”。在这种情况下,该传感器通常报告在远状态的最大范围的值,并在邻近状态一个更低的值。通常情况下,远的值是一个值>5厘米,但是这可以从传感器变化到传感器。您可以通过使用获得最大范围()方法确定传感器的最大范围。

你可能感兴趣的:(java,android,api,sdk,position,Sensors)