这两天看这三个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层,那应该是哪层来定义呢?

解决方案 »

  1.   

    传感器类型常量 内部整数值 中文名称
    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);
      

  2.   

    先搞明白yaw/pitch/roll是神马再去看这三个sensor的区别,别看X,Y,Z,没用
      

  3.   


    硬件上是一个sensor,还是两个sensor?,如果gsensor和加速度sensor是一个sensor,那么HAL层或者上层,需要为一个硬件创建两个sensor吗?在哪一层创建?多谢
      

  4.   

    应该说重力sensor也算是加速度sensor,那创建两个sensor 是什么意思呢?难道是说硬件是说创建两个字符设备,然后在HAL层分开读取和上报?
      

  5.   

    什么创建两个sensor?没听懂
    有些sensor是可以提供两个功能的,比如proximity sensor,既可以提供距离,又可以提供环境光照,硬件是一个,驱动也是一个,上层分为两个
    一般sensor的架构都不会有字符设备,都是通过input从内核传给HAL,然后HAL再分流给JAVA的
      

  6.   


    我的创建两个sensor的意思是, 既然重力和加速度是一个硬件sensor,那么对于应用层来说,应该这两个sensor都是可用的, 应该不是当sensorManager.getType时, SENSOR_TYPE_GRAVITY 或 SENSOR_TYPE_GRAVITY 说找不到这个类型吧?
      

  7.   


    可以这么说吗?
    一个硬件gsensor , 需要在hal层定义两个sensor,分别是重力和加速度sensor,然后分别向上层上报数据?
      

  8.   


    我的意思就是说, 是否应该在HAL层或者其他层创建两个sensor呢?
      

  9.   

    可以啊,我说的很清楚了,按功能分,如果不同功能,上层可以分成两个,从HAL层就分开了,应用层监听不同的sensor功能
      

  10.   

    陀螺仪的那3个值是绝对位置,是设备相对于地面磁场来说的,硬件一般都是通过一个磁场sensor来实现的。
    具体原理看哥的博客:http://blog.csdn.net/beeboobeeboo/article/details/6536941
      

  11.   

    我看2.2的源码里面sensor的定义就这几种
    /**
     * 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就行了
      

  12.   

    你的意思是, HAL层创建两个sensor然后从一个硬件设备上读取数据对吧?两个sensor从一个设备上读取数据不会冲突吧? 比如gsensor读到的数据,asensor就读不到了?谢谢
      

  13.   

    2.3里面有gravity sensor的类型声明
      

  14.   

    还有你的关于陀螺仪sensor的博客写的很好,非常详细.
      

  15.   

    抛开代码,从原理上简单地说。
    重力计,加速度,陀螺仪,是三种完全不同的传感器,如果设备检测报告说有这三种传感器,就一定应该有三个物理不同的器件在机内,互相无法仿真的。
    加速度计,是测量直线方向加速度,被测量出的模拟量经过调理归一化,向上层报告XYZ三个方向加速度值。
    陀螺仪,是测量角速度,被测量出的模拟量经过调理归一化,向上层报告三个方向,就是偏航/俯仰/横滚角的offset数值。
    通常加速度计和陀螺仪联合使用,才能正确计算设备在瞬时的全向运动趋势。
    而重力计,是微机电时代的独特产品,主要用于检测地球的方向而不是运动趋势,三向重力计的另外两个轴的数据可用于不精确地检测倾斜等等,再变通一下,也可以配合地磁传感器一起搞点水平方向旋转的运动检测,但这些仿真都不可靠,用在简单游戏尚可,精度要求高的应用,或者讲所谓要用户体验,还得用前面两种同时使用。
    重力计最便宜,使用也最简单,所以当下用得多。放在方向传感器类里,是合理的,要说是加速度勉强了点,这个固有的g,会在三个方向上,作为“噪声”,影响到XYZ数据。比如说,手机不完全平行于地球做自由落体下落,g在三轴上的影响,很不容易计算,这个“噪声”的消除就难。
    类别Sensor.TYPE里的加速度计,指的是正宗的加速度计。
    ACCELEROMETER和ORIENTATION的驱动,如果指向同一物理设备,将来会带来麻烦。加速度计和陀螺仪普及以后,将来的应用会区别使用这两种不同的东西的。