这两天看这三个sensor, 被搞晕了
我的理解是:按理来说重力和加速度是一个sensor, 和陀螺仪是完全不同的sensor陀螺仪是用来检测手机本身各条边, 相对于重心的位置和方向, 所以他有x, y, z , 比如手机是否倾斜, 横屏竖屏等重力传感器和加速度传感器是一个传感器, 用来检测手机整体向某个方向运动的加速度, 比如当手机掉落时,加速度应等于g但是
网上很多gsensor的介绍都是下面这种原理:
Accelrator的x,y,z轴的正负向变化: 手机屏幕向上水平放置时: (x,y,z) = (0, 0, -9.81) 当手机顶部抬起时: y减小,且为负值 当手机底部抬起时: y增加,且为正值 当手机右侧抬起时: x减小,且为负值 当手机左侧抬起时: x增加,且为正值
我的问题是:
那这样不就成了, 陀螺仪sensor了么? 这三个x,y,z的值是相对手机重心来算出来的, 都是相对位置对吧?
那么我如何检测手机在某个方向的加速度? 比如手机掉落?附加问题:
如果说加速sensor和重力sensor是同一个sensor,那么他们的硬件应该也是同一个sensor吧?
但是上层(包括HAL层)对两个sensor的定义是分开的哦,
类型定义分别是 : SENSOR_TYPE_GRAVITY, 和 SENSOR_TYPE_ACCELERATOR
那么当我有一个硬件的gsensor时, 我是否应该在HAL层创建两个sensor,分别是accelerator和gravity?如果不是hal层,那应该是哪层来定义呢?
我的理解是:按理来说重力和加速度是一个sensor, 和陀螺仪是完全不同的sensor陀螺仪是用来检测手机本身各条边, 相对于重心的位置和方向, 所以他有x, y, z , 比如手机是否倾斜, 横屏竖屏等重力传感器和加速度传感器是一个传感器, 用来检测手机整体向某个方向运动的加速度, 比如当手机掉落时,加速度应等于g但是
网上很多gsensor的介绍都是下面这种原理:
Accelrator的x,y,z轴的正负向变化: 手机屏幕向上水平放置时: (x,y,z) = (0, 0, -9.81) 当手机顶部抬起时: y减小,且为负值 当手机底部抬起时: y增加,且为正值 当手机右侧抬起时: x减小,且为负值 当手机左侧抬起时: x增加,且为正值
我的问题是:
那这样不就成了, 陀螺仪sensor了么? 这三个x,y,z的值是相对手机重心来算出来的, 都是相对位置对吧?
那么我如何检测手机在某个方向的加速度? 比如手机掉落?附加问题:
如果说加速sensor和重力sensor是同一个sensor,那么他们的硬件应该也是同一个sensor吧?
但是上层(包括HAL层)对两个sensor的定义是分开的哦,
类型定义分别是 : SENSOR_TYPE_GRAVITY, 和 SENSOR_TYPE_ACCELERATOR
那么当我有一个硬件的gsensor时, 我是否应该在HAL层创建两个sensor,分别是accelerator和gravity?如果不是hal层,那应该是哪层来定义呢?
Sensor.TYPE_ACCELEROMETER 1 加速度传感器
Sensor.TYPE_MAGNETIC_FIELD 2 磁力传感器
Sensor.TYPE_ORIENTATION 3 方向传感器
Sensor.TYPE_GYROSCOPE 4 陀螺仪传感器
Sensor.TYPE_LIGHT 5 环境光照传感器
Sensor.TYPE_PRESSURE 6 压力传感器
Sensor.TYPE_TEMPERATURE 7 温度传感器
Sensor.TYPE_PROXIMITY 8 距离传感器
他们的sensor都是由上面的类型定义的
找到你需要对应的参数就可以了 ,SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
//TYPE_ACCELEROMETER
Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
硬件上是一个sensor,还是两个sensor?,如果gsensor和加速度sensor是一个sensor,那么HAL层或者上层,需要为一个硬件创建两个sensor吗?在哪一层创建?多谢
有些sensor是可以提供两个功能的,比如proximity sensor,既可以提供距离,又可以提供环境光照,硬件是一个,驱动也是一个,上层分为两个
一般sensor的架构都不会有字符设备,都是通过input从内核传给HAL,然后HAL再分流给JAVA的
我的创建两个sensor的意思是, 既然重力和加速度是一个硬件sensor,那么对于应用层来说,应该这两个sensor都是可用的, 应该不是当sensorManager.getType时, SENSOR_TYPE_GRAVITY 或 SENSOR_TYPE_GRAVITY 说找不到这个类型吧?
可以这么说吗?
一个硬件gsensor , 需要在hal层定义两个sensor,分别是重力和加速度sensor,然后分别向上层上报数据?
我的意思就是说, 是否应该在HAL层或者其他层创建两个sensor呢?
具体原理看哥的博客:http://blog.csdn.net/beeboobeeboo/article/details/6536941
/**
* Sensor types
*/
#define SENSOR_TYPE_ACCELEROMETER 1
#define SENSOR_TYPE_MAGNETIC_FIELD 2
#define SENSOR_TYPE_ORIENTATION 3
#define SENSOR_TYPE_GYROSCOPE 4
#define SENSOR_TYPE_LIGHT 5
#define SENSOR_TYPE_PRESSURE 6
#define SENSOR_TYPE_TEMPERATURE 7
#define SENSOR_TYPE_PROXIMITY 8SENSOR_TYPE_GRAVITY 是不是原来版本的说法,现在用SENSOR_TYPE_ACCELEROMETER就行了
重力计,加速度,陀螺仪,是三种完全不同的传感器,如果设备检测报告说有这三种传感器,就一定应该有三个物理不同的器件在机内,互相无法仿真的。
加速度计,是测量直线方向加速度,被测量出的模拟量经过调理归一化,向上层报告XYZ三个方向加速度值。
陀螺仪,是测量角速度,被测量出的模拟量经过调理归一化,向上层报告三个方向,就是偏航/俯仰/横滚角的offset数值。
通常加速度计和陀螺仪联合使用,才能正确计算设备在瞬时的全向运动趋势。
而重力计,是微机电时代的独特产品,主要用于检测地球的方向而不是运动趋势,三向重力计的另外两个轴的数据可用于不精确地检测倾斜等等,再变通一下,也可以配合地磁传感器一起搞点水平方向旋转的运动检测,但这些仿真都不可靠,用在简单游戏尚可,精度要求高的应用,或者讲所谓要用户体验,还得用前面两种同时使用。
重力计最便宜,使用也最简单,所以当下用得多。放在方向传感器类里,是合理的,要说是加速度勉强了点,这个固有的g,会在三个方向上,作为“噪声”,影响到XYZ数据。比如说,手机不完全平行于地球做自由落体下落,g在三轴上的影响,很不容易计算,这个“噪声”的消除就难。
类别Sensor.TYPE里的加速度计,指的是正宗的加速度计。
ACCELEROMETER和ORIENTATION的驱动,如果指向同一物理设备,将来会带来麻烦。加速度计和陀螺仪普及以后,将来的应用会区别使用这两种不同的东西的。