linux 加速度传感器数据获取,对加速度传感器的数据进行方向和坐标的转换
Android是面向智能手机和其他便携式设备的最受欢迎的操作系统(OS)之一。 它为多种传感器提供了标准的API接口,包括加速度计。加速度计的标准API定义了原始加速度数据的坐标系统。用户必须将从传感器中读取的原始数据转换为标准单位,并使其符合系统定义的坐标方向。本文介绍了Android中的坐标系统是如何定义的,以及如何在Android系统的驱动代码中对3轴加速度计数据的方向和坐标进行转换。本文讨论的示例代码基于飞思卡尔的Android 2.2和2.3驱动程序,加速度计则以飞思卡尔的MMA8452Q加速度传感器为例。
一部智能手机或便携设备应具有Wi-Fi和互联网功能,能够运行应用软件等诸多特征,而且一定会具有内置传感器。高端智能手机可能集成接近传感器,环境光传感器,3轴加速度计,以及磁力计等多种传感器。Android 2.3添加了一些支持多种新型传感器的API,包括陀螺仪、旋转向量、线性加速度、重力和气压传感器等。应用软件可以使用这些新型传感器,将它们组合起来,就可以实现高精确度的高级运动检测功能。
3轴加速度计或低g值传感器是Android API支持的传感器之一,具有特定的坐标系统,可以给应用程序提供标准的接口数据。坐标空间的定义与手机屏幕的默认方向有关,如图1所示。
在Android坐标系统中,坐标原点位于屏幕的左下角,X轴水平指向右侧,Y轴垂直指向顶部,Z轴指向屏幕前方。 在该系统中,屏幕后方的坐标具有负的Z轴值。
Android加速度计数据定义为:
Sensor.TYPE_ACCELEROMETER
所有数值都采用SI标准单位(m/s2),测量手机的加速度值,并减去重力加速度分量。
values[0]:x轴上的加速度值减去Gx
values[1]:y轴上的加速度值减去Gy
values[2]:z轴上的加速度值减去Gz
例如,当设备平放在桌上并推着其左侧向右移动时,x轴加速度值为正。当设备平放在桌上时,加速度值为+9.81,这是用设备的加速度值 (0 m/s2) 减去重力加速度值 (-9.81 m/s2)得到的。
当设备平放在桌上放,并以加速度A m/s2朝天空的方向推动时,加速度值等于A+9.81,这是用设备加速度值(+A m/s2)减去重力加速度值(-9.81 m/s2)得到的。
表1列出了与设备的各个位置相对应的传感器的加速度值读数。用户可以用下表检查加速度计的方向与系统坐标是否一致。
表1. 不同位置上各轴的加速度值
位置
x
y
z
朝上:
0
9.81m/s2
0
朝左:
9.81m/s2
0
0
朝下:
0
-9.81m/s2
0
朝右:
-9.81m/s2
0
0
正面朝上:
0
0
9.81m/s2
背面朝上:
0
0
-9.81m/s2
通过加速度传感器读取3轴加速度值时,需要假设传感器的3轴方向与系统坐标是一致的。但是在实际的产品中,可能会使用不同的传感器芯片,或者采用不同的安装方向,因此数据方向也会不同。图2所示的是飞思卡尔MMA8452Q 3轴加速度传感器的方向定义。
在图2中,我们可以看到当安装芯片时,必须让引脚1处于右下角的位置(PD),并安装在PCB的前方,这样才能与Android坐标系统的默认位置相符。这样安装后,用户可确定数据方向与系统坐标定义是一致的。在任何其他情形下,数据都无法与系统定义保持完全一致,所以需要更改数据方向和坐标。在某些情况下,X和Y轴必须交换,或者既要改变方向,也要交换X-Y轴。
判断是否需要改变方向或交换X-Y轴的方法如下所述:
1. 将设备放置在朝上(UP)的位置,如表1中所示。
2. 从传感器中读取3轴的数据。如果Y轴上的数据为 ±1 g (±9.81m/s2),其他两个轴上的数据大约为0,则不需要交换X-Y轴。否则,需要交换X和Y轴,请转至步骤3。
2.1. 在该位置上,如果Y轴上读取的数据为+1 g (+9.81m/s2),则Y轴的方向不需要改变,如果数据为负,则Y轴的方向需要改变。
2.2. 将设备放置在朝左(LEFT)的位置,如表1中所示。X轴上读取的数据应为±1 g (±9.81m/s2),其他两个轴上的数据应大约为0。如果X轴上的数据为正,则其方向不需要改变;否则X轴的方向需要改变。然后,执行第4步判断Z轴的方向。
3. 设备仍然放置在朝上(UP)的位置,并从传感器中读取3个轴的数据。此时X轴上的数据应为 ±1 g (±9.81m/s2),其他两个轴上的数据大约为0,需要X-Y交换。
3.1. 在该位置上,如果X轴的数据读取为+1 g (+9.81m/s2),则X轴的方向不需要改变;否则需要改变。
3.2. 将设备放置在向左(LEFT)位置上,如表1中所示。Y轴上读取的数据应为±1 g (±9.81m/s2),其他两个轴上的数据应大约为0。如果Y轴上的数据为正,则其方向不需要改变;否则需要改变。然后执行第4步判断Z轴的方向。
4. 将设备放置在正面朝上(FRONT-UP)的位置,并从传感器中读取3轴数据。 如果Z轴上的数据为+1 g (+9.81m/s2),其他两个轴上的数据大约为0,则Z轴方向无需改变;如果Z轴数据为-1 g (-9.81m/s2),则Z轴方向需要改变。
在Android系统中,传感器数据由内核空间中的Linux驱动读取,然后由HAL层驱动发送至API。分层结构如图3所示。因此,传感器数据可以在Linux驱动层或在HAL层上进行转换。
在Android HAL文件中改变 X、Y和Z轴的方向
在HAL文件中,会有一组宏定义,用于把从传感器中读取的加速度数据转换为标准单位(m/s2)。如以下代码:
// conversion of acceleration data to SI units (m/s^2)
#define CONVERT_A (GRAVITY_EARTH / LSG)
#define CONVERT_A_X (-CONVERT_A)
#define CONVERT_A_Y (CONVERT_A)
#define CONVERT_A_Z (CONVERT_A)
在这个宏定义中,常量GRAVITY_EARTH 是一个标准重力加速度值,即9.81m/s2,LSG为一个重力加速度值的最小有效计数值,例如,MMA8452在正常模式下的读数为1024。因此,CONVERT_A用于把从加速度传感器中读取的数据,从数字读数转换为标准重力加速度单位。
通过分别修改CONVERT_A_X、CONVERT_A_Y和CONVERT_A_Z,我们可以轻松地改变X、Y和Z轴的方向。如果该轴的方向与系统定义相反,可以使用(-CONVERT_A)来改变其方向。如果方向一致,就使用(CONVERT_A),则保持方向不变。
这个宏定义位于FSL Android 9 (Android 2.2)驱动程序的HAL文件sensor.c 中。 对于FSL Android 10 (Android 2.3),您可以在’libsensors’文件夹的HAL文件Sensor.h中找到它。
在Android 2.2 HAL文件中交换X轴和Y轴
在某些情况下,X和Y轴必须进行交换,以便使传感器数据的坐标与系统坐标保持一致。
对于FSL Android 9 (Android 2.2)驱动程序来说,X轴和Y轴的交换非常简单。首先,在HAL文件sensor.c中,在函数sensor_poll() 中找到以下代码:
switch (event.code) {
case ABS_X:
sSensors.acceleration.x = event.value * CONVERT_A_X;
break;
case ABS_Y:
sSensors.acceleration.y = event.value * CONVERT_A_Y;
break;
case ABS_Z:
sSensors.acceleration.z = event.value * CONVERT_A_Z;
break;
}
然后,根据如下所示修改代码:
switch (event.code) {
case ABS_X:
sSensors.acceleration.y = event.value * CONVERT_A_Y;
break;
case ABS_Y:
sSensors.acceleration.x = event.value * CONVERT_A_X;
break;
case ABS_Z:
sSensors.acceleration.z = event.value * CONVERT_A_Z;
break;
}
在Android 2.3的HAL文件中交换X轴和Y轴
在Android 2.3的HAL文件中交换X轴和Y轴会更加复杂些,因为它具有更复杂的HAL文件结构。所有HAL文件都位于文件夹‘libsensors’中。文件AccelSensor.cpp中的两个函数需要修改。
首先,修改函数AccelSensor()的代码,如下所示:
if (accel_is_sensor_enabled(SENSOR_TYPE_ACCELEROMETER)) {
mEnabled |= 1<
if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_X), &absinfo)) {
mPendingEvents[Accelerometer].acceleration.y = absinfo.value * CONVERT_A_Y;
}
if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Y), &absinfo)) {
mPendingEvents[Accelerometer].acceleration.x = absinfo.value * CONVERT_A_X;
}
if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Z), &absinfo)) {
mPendingEvents[Accelerometer].acceleration.z = absinfo.value * CONVERT_A_Z;
}
}
然后,修改函数processEvent()的代码,如下所示:
void AccelSensor::processEvent(int code, int value)
{
switch (code) {
case EVENT_TYPE_ACCEL_X:
mPendingMask |= 1<
mPendingEvents[Accelerometer].acceleration.y = value * CONVERT_A_Y;
break;
case EVENT_TYPE_ACCEL_Y:
mPendingMask |= 1<
mPendingEvents[Accelerometer].acceleration.x = value * CONVERT_A_X;
break;
case EVENT_TYPE_ACCEL_Z:
mPendingMask |= 1<
mPendingEvents[Accelerometer].acceleration.z = value * CONVERT_A_Z;
break;
}
}
完成后,X轴和Y轴的数据就互相交换了。
在Kernel驱动文件中交换X轴和Y轴
X轴和Y轴的数据交换可以在底层的Linux驱动中,在刚开始读取传感器数据时实施。 通过这种方法,无论传感器芯片以何种方式安装在PCB中,或者使用各种不同类型的传感器,HAL文件都可以保持一致。
对于Android 2.2和2.3来说,执行该操作的最便捷的方式是修改函数report_abs()中的代码。在该函数中,传感器数据通过调用函数 mma8452_read_data()读取,如下所示(当使用的传感器为MMA8452Q时):
if (mma8452_read_data(&x,&y,&z) != 0) {
//DBG("mma8452 data read failed\n");
return; }
X轴和Y轴可以通过以下方式轻松交换:
if (mma8452_read_data(&y,&x,&z) != 0) {
//DBG("mma8452 data read failed\n");
return; }
对于Android 2.2,MMA8452的Kernel驱动文件为mma8452.c;对于Android 2.3,驱动文件是‘hwmon’文件夹中的mxc_mma8452.c。
在Kernel驱动文件中改变 X、Y和Z轴的方向
传感器数据的方向也可以在Kernel驱动文件中更改。以下带有注释的语句可以添加到函数report_abs()中,从而改变数据方向:
if (mma8452_read_data(&y,&x,&z) != 0) {
//DBG("mma8452 data read failed\n");
return;
}
x *= -1; //Reverse X direction
y *= -1; //Reverse Y direction
z *= -1; //Reverse Z direction
input_report_abs(mma8452_idev->input, ABS_X, x);
input_report_abs(mma8452_idev->input, ABS_Y, y);
input_report_abs(mma8452_idev->input, ABS_Z, z);
input_sync(mma8452_idev->input);
总结
Android系统已经为加速度计定义了坐标系统,因此用户必须转换从实际传感器中读取的数据,从而与其保持一致。无论是否需要转换,都应检查X、Y和Z轴的方向以及X-Y轴坐标。我们可以更改HAL文件或Kernel驱动文件来改变轴的方向,或交换X和Y轴,但是不要同时修改HAL文件和Kernel驱动。
linux 加速度传感器数据获取,对加速度传感器的数据进行方向和坐标的转换相关推荐
- android加速度传感器转为线性速度,如何在android的驱动程序中对加速度传感器的数据进行方向和坐标的转...
一部智能手机或便携设备应具有Wi-Fi 和互联网功能,能够运行应用软件等诸多特征,而且一定会具有内置传感器.高端智能手机可能集成接近传感器,环境光传感器,3 轴加速度计,以及磁力计等多种传感器. An ...
- 高通 android 传感器支持,Android加速度传感器数值的过滤
加速度传感器测量设备的加速度,包括重力加速度.以下代码展示了如何获取缺省的加速度传感器的一个实例: private SensorManager mSensorManager; private Sens ...
- MPU6050加速度传感器学习笔记之传感器
传感器基本概念 1. 传感器工作原理 在电子技术中, 传感器一般是指把物理量转化成电信号量的装置.敏感元件直接感受被测物理量,并输出与该物理量有确定关系的信号,经过转换元件将该物理量信号转换为电信号, ...
- 机械传感器与半导体加速度传感器比对
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 机械传感器与半导体加速度传感器比对 前言 一.机械传感器与半导体传感器定义 二.机械传感器与半导体传感器对比 1.加速度传感器比机械传 ...
- 加速度传感器采集的加速度值有没有必要转换为位移量
**加速度传感器采集的加速度值有没有必要转换为位移量** 加速度信号转换为位移量可以通过两种方法:时域积分和频域积分.在时域中积分,方法简单,但由于测试上原因,所测得的加速度信号均值不为零,经二次积分 ...
- 【开源教程13】疯壳·开源编队无人机-SPI(六轴传感器数据获取)
COCOFLY教程 --疯壳·无人机·系列 SPI(六轴传感器数据获取) 图1 一.ICM20602 简介 六轴传感器在当今智能穿戴和定位导航产品 ...
- 【飞控开发基础教程6】疯壳·开源编队无人机-SPI(六轴传感器数据获取)
COCOFLY教程 --疯壳·无人机·系列 SPI(六轴传感器数据获取) 图1 一.ICM20602 简介 六轴传感器在当今智能穿戴和定位导航产品 ...
- sar sensor传感器的作用_传感器攻防战-惯导IMU
惯导这个传感器一句话理解就是可以短时给出置信度较高的相对位移和航向角变化的传感器 惯导这个传感器很神奇,激光雷达,毫米波,摄像头三个还会争夺下,是不是用GPS大家也会考虑下,但惯导这个传感器没人会怀疑 ...
- android 传感器ceshi,Android代码-传感器-测试手机支持那几种传感
Android代码----传感器-----测试手机支持那几种传感 一个小小Demo检测手机支持那几种传感: 具体代码如下: [Java代码]DemoSensorActivity.java packag ...
- 安卓传感器全解:注册、注销传感器、监听传感器,距离传感器、方向传感器、陀螺仪、加速计、磁场、气压传感器
全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓传感器全解:注册.注销传感器.监听传感器.距离传感器.方向传感器.陀螺仪.加速计.磁场.气压传感器. 注册.注销.监听传感器 1.自定义传感器监听 ...
最新文章
- 使用adb命令控制Android
- Android 和 Chrome OS 融合的可能性
- 详解UML中的聚合,关联,泛化等关系
- docker 随笔记录
- GCF(2)---GCF中LAUNCH BROWSER测项注意事项
- 王思聪旗下公司破产拍卖:13.8万成交、溢价超100倍
- 分布式定时任务框架选型,写得太好了!
- try-catch-finally机制
- js 获取昨天,今天,本周,上周,季度等时间范围(封装的js)
- OC 和 swift 小结
- 由SVN的月份计算错误,谈一个月的含义
- 「插件」Runner更新Pro版,帮助设计师远离996
- SQL——数据各项操作代码实现
- 3D打印技术助力传感器:制造出堪比鹰眼视野的摄像头
- 宁波中小学生计算机技术展示,宁波市第25届中小学生计算机程序设计竞赛复赛试题(小学组).doc...
- git 本地多账号管理
- php上传文件并存储到mysql数据库的方法
- 中国十大电子商务网站排名揭晓
- 虚拟实验工场大学计算机报告,模拟工厂实习报告
- iphone 程购买实现