有谁能告诉我重力sensor, 加速度sensor, 陀螺仪sensor有啥区别?

javarat 2011-09-27 10:53:20
这两天看这三个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层,那应该是哪层来定义呢?
...全文
5369 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
John_ham_John 2011-10-08
  • 打赏
  • 举报
回复 2
抛开代码,从原理上简单地说。
重力计,加速度,陀螺仪,是三种完全不同的传感器,如果设备检测报告说有这三种传感器,就一定应该有三个物理不同的器件在机内,互相无法仿真的。
加速度计,是测量直线方向加速度,被测量出的模拟量经过调理归一化,向上层报告XYZ三个方向加速度值。
陀螺仪,是测量角速度,被测量出的模拟量经过调理归一化,向上层报告三个方向,就是偏航/俯仰/横滚角的offset数值。
通常加速度计和陀螺仪联合使用,才能正确计算设备在瞬时的全向运动趋势。
而重力计,是微机电时代的独特产品,主要用于检测地球的方向而不是运动趋势,三向重力计的另外两个轴的数据可用于不精确地检测倾斜等等,再变通一下,也可以配合地磁传感器一起搞点水平方向旋转的运动检测,但这些仿真都不可靠,用在简单游戏尚可,精度要求高的应用,或者讲所谓要用户体验,还得用前面两种同时使用。
重力计最便宜,使用也最简单,所以当下用得多。放在方向传感器类里,是合理的,要说是加速度勉强了点,这个固有的g,会在三个方向上,作为“噪声”,影响到XYZ数据。比如说,手机不完全平行于地球做自由落体下落,g在三轴上的影响,很不容易计算,这个“噪声”的消除就难。
类别Sensor.TYPE里的加速度计,指的是正宗的加速度计。
ACCELEROMETER和ORIENTATION的驱动,如果指向同一物理设备,将来会带来麻烦。加速度计和陀螺仪普及以后,将来的应用会区别使用这两种不同的东西的。
javarat 2011-10-08
  • 打赏
  • 举报
回复
还有你的关于陀螺仪sensor的博客写的很好,非常详细.



[Quote=引用 14 楼 javarat 的回复:]

你的意思是,

HAL层创建两个sensor然后从一个硬件设备上读取数据对吧?

两个sensor从一个设备上读取数据不会冲突吧? 比如gsensor读到的数据,asensor就读不到了?

谢谢

引用 11 楼 cdbdyx 的回复:

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

引用 1……
[/Quote]
javarat 2011-10-08
  • 打赏
  • 举报
回复
2.3里面有gravity sensor的类型声明

[Quote=引用 13 楼 beeboobeeboo 的回复:]

我看2.2的源码里面sensor的定义就这几种
/**
* Sensor types
*/
#define SENSOR_TYPE_ACCELEROMETER 1
#define SENSOR_TYPE_MAGNETIC_FIELD 2
#define SENSOR_TYPE_ORIENTATION 3
#define SENSOR_TYP……
[/Quote]
javarat 2011-10-08
  • 打赏
  • 举报
回复
你的意思是,

HAL层创建两个sensor然后从一个硬件设备上读取数据对吧?

两个sensor从一个设备上读取数据不会冲突吧? 比如gsensor读到的数据,asensor就读不到了?

谢谢

[Quote=引用 11 楼 cdbdyx 的回复:]

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

引用 10 楼 javarat 的回复:

引用 6 楼 jjlmonkey 的回复:

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


我的意思就是……
[/Quote]
充电宝111 2011-09-30
  • 打赏
  • 举报
回复
可以啊,我说的很清楚了,按功能分,如果不同功能,上层可以分成两个,从HAL层就分开了,应用层监听不同的sensor功能

[Quote=引用 10 楼 javarat 的回复:]

引用 6 楼 jjlmonkey 的回复:

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


我的意思就是说, 是否应该在HAL层或者其他层创建两个sensor呢?
[/Quote]
beeboobeeboo 2011-09-30
  • 打赏
  • 举报
回复
我看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 8

SENSOR_TYPE_GRAVITY 是不是原来版本的说法,现在用SENSOR_TYPE_ACCELEROMETER就行了
beeboobeeboo 2011-09-30
  • 打赏
  • 举报
回复
陀螺仪的那3个值是绝对位置,是设备相对于地面磁场来说的,硬件一般都是通过一个磁场sensor来实现的。
具体原理看哥的博客:http://blog.csdn.net/beeboobeeboo/article/details/6536941
javarat 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jjlmonkey 的回复:]

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

我的意思就是说, 是否应该在HAL层或者其他层创建两个sensor呢?
javarat 2011-09-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cdbdyx 的回复:]

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

可以这么说吗?
一个硬件gsensor , 需要在hal层定义两个sensor,分别是重力和加速度sensor,然后分别向上层上报数据?
javarat 2011-09-29
  • 打赏
  • 举报
回复

我的创建两个sensor的意思是, 既然重力和加速度是一个硬件sensor,

那么对于应用层来说,应该这两个sensor都是可用的,

应该不是当sensorManager.getType时, SENSOR_TYPE_GRAVITY 或 SENSOR_TYPE_GRAVITY 说找不到这个类型吧?

javarat 2011-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cdbdyx 的回复:]

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

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

多谢
充电宝111 2011-09-28
  • 打赏
  • 举报
回复
什么创建两个sensor?没听懂
有些sensor是可以提供两个功能的,比如proximity sensor,既可以提供距离,又可以提供环境光照,硬件是一个,驱动也是一个,上层分为两个
一般sensor的架构都不会有字符设备,都是通过input从内核传给HAL,然后HAL再分流给JAVA的
jjlmonkey 2011-09-28
  • 打赏
  • 举报
回复
应该说重力sensor也算是加速度sensor,那创建两个sensor 是什么意思呢?难道是说硬件是说创建两个字符设备,然后在HAL层分开读取和上报?
javarat 2011-09-27
  • 打赏
  • 举报
回复
自己顶~帮定给分~
充电宝111 2011-09-27
  • 打赏
  • 举报
回复
先搞明白yaw/pitch/roll是神马再去看这三个sensor的区别,别看X,Y,Z,没用
周药师 2011-09-27
  • 打赏
  • 举报
回复
传感器类型常量 内部整数值 中文名称
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);

卷毛大帝 2011-09-27
  • 打赏
  • 举报
回复
我也比较迷惑这个

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧