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

浅谈Android传感器 III-磁传感器

时间:2022-08-30 18:00:02 传感器无线地磁两轴磁传感器android设备传感器相关a用在设备的传感器vetor温度传感器willtec磁性传感器

有线门磁为嵌入式安装更加隐蔽,感应门窗的开合,适用于木质或铝合金门窗发出有线常闭/常开开关信号。门磁是用来探测门、窗、抽屉等是否被非法打开或移动。它由无线发射器和磁块两部分组成。门磁系统其实和床磁等原理相同。

d4566703ea17404ce9e7e95925fc439c.png

Android该平台为我们确定设备的位置提供了两种传感器: 地磁传感器和方向传感器。 Android它还提供了一个传感器,让我们在决定人脸离手机有多近时关闭屏幕(距离传感器proximity sensor)。 基于硬件的地磁传感器和距离传感器。 大多数手持设备供应商都提供地磁传感器。 同样, 手持设备制造商通常包含一个距离传感器来决定何时关闭屏幕。 方向传感器(orientation sensor)以软件为基础, 它通过加速度传感器和地磁传感器计算数据。 但是方向传感器在Android2.不再推荐使用2中。

在确定设备在世界上的位置时,位置传感器将非常有用。 例如,我们可以使用地磁传感器和加速传感器来确定设备相对于地磁北极的位置。 我们还可以使用方向传感器(或基于传感器的方向方法)来确定设备相对于APP框架为参考位置。 位置传感器通常不用于监测设备的移动或运动, 比如摇动, 倾斜等。

通过地磁传感器和方向传感器SensorEvent多维数组返回数据。 栗如, 每次返回传感器事件时,方向传感器提供三维空间地磁力的强度值。 同方向传感器提供方向角(Yaw偏航角), 俯仰角(pitch)和翻滚角(roll)。 下表提供了Android平台各位传感器信息:

SensorEvent.values[0]

矢量分量沿x轴旋转(x*sin(θ/2 ))。

无单位

SensorEvent.values[1]

矢量分量沿y轴旋转(y*sin(θ/2 ))。

SensorEvent.values[2]

矢量分量沿z轴旋转(z*sin(θ/2 ))。

TYPE_GEOMAGNETIC_ROTATION_VECTOR

SensorEvent.values[0]

矢量分量沿x轴旋转(x*sin(θ/2 ))。

无单位

SensorEvent.values[1]

矢量分量沿y轴旋转(y*sin(θ/2 ))。

SensorEvent.values[2]

矢量分量沿z轴旋转(z*sin(θ/2 ))。

TYPE_MAGNETIC_FIELD

SensorEvent.values[0]

地磁强度沿x轴

μT

SensorEvent.values[1]

沿y轴的地磁强度

SensorEvent.values[2]

地磁强度沿z轴

TYPE_MAGNETIC_FIELD_UNCALIBRATED

SensorEvent.values[0]

x轴地磁强度(无硬铁校准)hard iron calibration)

μT

SensorEvent.values[1]

沿y轴的地磁强度(无硬铁校准hard iron calibration)

SensorEvent.values[2]

沿z轴的地磁强度(无硬铁校准)hard iron calibration)

SensorEvent.values[3]

校准X轴铁偏差(Iron bias estimation)

SensorEvent.values[4]

校准y轴铁偏差(Iron bias estimation)

SensorEvent.values[5]

沿z轴铁偏差校准(Iron bias estimation)

TYPE_ORIENTATION①

SensorEvent.values[0]

方位角(绕z轴)

SensorEvent.values[1]

俯仰角(pitch) (绕x轴的角度)

SensorEvent.values[2]

翻滚角(roll) (绕y轴的角度)

TYPE_PROXIMITY

SensorEvent.values[0]

与对象的距离②

cm

① 该传感器在Android2.不再推荐在版本中使用。 Sensor framework提供备用方法, 下面会有介绍。

② 有些距离传感器只提供代表远近的二进制数据。

使用游戏旋转矢量传感器:

游戏旋转矢量传感器与旋转矢量传感器相同, 除不使用地磁场外。 所以Y轴不是指向北,而是指其他一些参考系。

因为游戏旋转矢量传感器不使用地磁场, 由于不受磁场影响,相关方向更准确。 如果你不在乎北方在哪里,你可以在游戏中使用传感器, 此时普通旋转矢量不合适, 因为它依赖于磁场。 以下代码展示了如何获得传感器的例子:

private SensorManager mSensorManager;

private Sensor mSensor;

。..

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

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);

使用地磁旋转矢量传感器:

地磁旋转矢量传感器与旋转矢量传感器相同, 但它用地磁代替陀螺仪。 因此其精度将低于普通旋转矢量传感器, 但是功耗也降低了。 只有在需要在后台获取旋转信息而不想消耗太多电量的时候才应该使用。 传感器应与批处理(batching)一起是最有用的。

下面的代码演示了如何获实例:

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

方向传感器通过使用设备的地磁场传感器和设备的加速度计获取数据。 使用这两个硬件传感器, 方向传感器可以提供这三个维度的数据:

l 方位角(z轴角)。 这个角度在地磁北极和设备的y轴之间。 例如,如果设备的y轴对准地磁北极, 所以值是0, 若设备y轴对准南极, 则该值为180. 同样的, 当y轴指向东方时, 该值是90, 西边是270.

l 俯仰角(pitch) (绕x轴的角度)。 处于z轴正方向和y轴正方向之间的时候该值是正的, z轴正方向和y轴负方向时, 该值为负。 范围是180度~-180度。

l 翻滚角(roll) (绕y轴的角度)。 在z轴正方向和x轴正方向时,该值为正。 Z轴正方向和x轴负方向时, 该值为负。 取值范围是90~-90度。

这个定义跟随航空学的方位角, 俯仰角不同于翻滚角, 在航空学中,x轴表示沿飞机的长边(从尾部到头部)。 另外,由于历史原因, 顺时针方向为正(数学上, 逆时针方向应为正)。

方向传感器通过处理加速度计和地磁场传感器的数据来获取自己的数据。 因为涉及的处理任务比较繁重, 因此,精度和准确性降低(只有当滚角分量为0时,其数据才能可靠)。 因此, 方向传感器在Android2.不建议在2中使用。 官方推荐使用getRotationMatrix()方法和getOrientation()方法结合计算方向值, 代替方向传感器。 我们也可以使用它remapCoordinateSystem()方法是映射方向值APP参考框架。 如何直接从方向传感器获取方向数据, 只有在几乎没有翻滚角的情况下才推荐:

public class SensorActivity extends Activity implements SensorEventListener {

private SensorManager mSensorManager;

private Sensor mOrientation;

@Override

public void onCreate(Bundle savedInstnceState) {

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

该传感器提供了三维磁场的原始数据。 通常我们不需要直接使用该传感器, 而是使用旋转矢量传感器来确定旋转运动的原始数据, 或者我们还可以使用加速度计和地磁场传感器跟getRotationMatrix()方法合作获取旋转矩阵和倾角矩阵。 然后可以使用这些矩阵同getOrientation()和getInclination()方法来获得方位角和地磁倾角数据。

使用未校正的磁力计:

未校正的磁力计跟地磁场传感器相似, 但是它没有”硬铁校正”(hard iron calibration)。 工厂校正和温度校正依然应用于磁场。 未校正的磁力计在处理坏硬铁估计(bad hard iron estimations)的时候有用。 通常geomagneticsensor_event.value[0]将会接近uncalibrated_magnetometer_event.values[0]- uncalibrated_magnetometer_event.values[3]。 也就是, calibrated_x ~= uncalibrated_x - bias_estimate_x.

注意: 未校正传感器提供更多的原始结果并可能包括一些偏差, 但是它们的测量值包含更少的校正导致的跳变。 一些APP可能会更想这些未校正的原始数据, 因为他们更加平滑和可靠。 比如当APP想要实现自己的传感器合成, 则他们可能更喜欢没有矫正过的数据。

除了磁场, 未校正磁力计还会提供硬铁校正在每个轴的估计值。 下面代码演示了如何获取该传感器实例:

private SensorManager mSensorManager;

private Sensor mSensor;

。..

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

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);

使用距离传感器(Proximity Sensor):

距离传感器让我们可以确定一个目标与设备的距离。 下面代码演示了如何获取它的实例:

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

}

}

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章