android传感器原理,浅谈Android传感器 III-磁传感器
有线门磁为嵌入式安装更加隐蔽,感应门窗的开合,适用于木质或铝合金门窗发出有线常闭/常开开关信号。门磁是用来探测门、窗、抽屉等是否被非法打开或移动。它由无线发射器和磁块两部分组成。门磁系统其实和床磁等原理相同。
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.2版本中不再推荐使用。 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 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);
该传感器提供了三维磁场的原始数据。 通常我们不需要直接使用该传感器, 而是使用旋转矢量传感器来确定旋转运动的原始数据, 或者我们还可以使用加速度计和地磁场传感器跟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);
}
}
android传感器原理,浅谈Android传感器 III-磁传感器相关推荐
- 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台
一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...
- android fps 垂直同步,浅谈Android流畅度
原标题:浅谈Android流畅度 哈哈 讲个故事 白 1 流畅度 关于流畅度谷歌官方给出的解释为:running at a consistent 60 frames per second, witho ...
- android 存储空间监控,浅谈 Android 内存监控(中)
前言 在上篇 浅谈 Android 内存监控(上) 中,我们聊了 LeakCanary,微信的 Matirx 和美团的 Probe,它们各自有不同的应用场景,例如,在开发测试环境,我们会偏向用 Lea ...
- Android 改造无线电,浅谈Android平台的物联网网关方案设计
提出了一种基于Android平台的物联网网关方案.该网关通过蓝牙串口通信实现物联网中WSN (无线传感器网络)中心节点和Android网关的数据传输,在Android平台上实现WSN节点信息管理并通过 ...
- android霍尔功能,浅谈霍尔传感器用于手机的作用和用途有哪些?
想必大家买了手机以后,都会看一下使用手册吧!这时候大家有没有发现,有一项参数写着霍尔传感器,这是个什么东西呢?很多人都有疑问吧!下面就带大家了解一下霍尔传感器用于手机的作用和用途. 霍尔传感器用于手机 ...
- android序列化好处,浅谈Android序列化
在Activity中使用方法: 1)传递单一对象,具体代码如下: // parcelable对象传递方法 public void setParcelableMethod() { Person pers ...
- 浅谈Android Architecture Components
浅谈Android Architecture Components 浅谈Android Architecture Components 简介 Android Architecture Componen ...
- 浅谈Android文件管理器的几种实现方式(原理篇)--对我有帮助
转自 https://blog.csdn.net/weixin_33698823/article/details/87269955 浅谈Android文件管理器的几种实现方式 为了完成毕业设计,我花费 ...
- 浅谈Android引用计数(2)
在浅谈Android引用计数(1)中讲了LightRefBase实现对象计数管理的原理,这篇文章将要分析重量级的引用基类:RefBase的实现和它的作用. 下面是RefBase和相关类的类图: 图中可 ...
- 浅谈Android保护技术__代码混淆
浅谈Android保护技术__代码混淆 浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读 ...
最新文章
- html盒子宽高,css盒子模型之宽度和高度
- 缓冲流、转换流、序列化流代码练习
- 泰亚史诗萨拉斯服务器维护,泰亚史诗上古馈赠介绍 这个可是好东西
- checkpoint_通过Main的Checkpoint Restore加快Java启动速度
- 配置linux danted socks服务
- SPOJ PHRASES Relevant Phrases of Annihilation(后缀数组 + 二分)题解
- 二叉树的前中后序遍历的三种实现(java)以及一些小习题
- 采用什么样的辅助工具能够有效地帮助孩子提高英语及数学的成绩?
- java中的方法与方法之间的关键_Java中包与包之间方法的调用及其关键字区分(基础)...
- 杂志社的电子邮件地址
- HTML设置地址栏收藏夹图标
- android 声纹识别 开源,声纹识别开源工具ASV-Subtools.pdf
- modbus协议的认识和libmodbus库使用
- Win11打印机脱机了怎么重新连接?Win11打印机脱机的解决方法
- 诗画丽水 文化传承 萌娃上演宋韵国风非遗主题秀
- 用join实现交集,并集,差集,补集的效果
- js html显示emoji表情,js emoji表情长度判断
- 在CentOS上重新编译nginx,加sticky模块
- php安装xmeet,XMeet下载-XMeet官方版下载V1.8.4-99wo下载站
- 20:球弹跳高度的计算