一部智能手机或便携设备应具有Wi-Fi 和互联网功能,能够运行应用软件等诸多特征,而且一定会具有内置传感器。高端智能手机可能集成接近传感器,环境光传感器,3

轴加速度计,以及磁力计等多种传感器。 Android 2.3

添加了一些支持多种新型传感器的API,包括陀螺仪、旋转向量、线性加速度、重力和气压传感器等。应用软件可以使用这些新型传感器,将它们组合起来,就可以实现高精确度的高级运动检测功能。

3 轴加速度计或低g 值传感器是Android API

支持的传感器之一,具有特定的坐标系统,可以给应用程序提供标准的接口数据。坐标空间的定义与手机屏幕的默认方向有关,如图1所示。

1. 3 轴加速度计的Android 坐标系统

在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

列出了与设备的各个位置相对应的传感器的加速度值读数。用户可以用下表检查加速度计的方向与系统坐标是否一致。

通过加速度传感器读取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 轴上读取的数据应为±1g (±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

轴上读取的数据应为±1g (±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 中。对于FSLAndroid 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<

&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<

break;

case EVENT_TYPE_ACCEL_Y:

mPendingMask |= 1<

break;

case EVENT_TYPE_ACCEL_Z:

mPendingMask |= 1<

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 驱动。

找找

android加速度传感器转为线性速度,如何在android的驱动程序中对加速度传感器的数据进行方向和坐标的转...相关推荐

  1. android手机录屏多少fps,如何在Android上以90fps或120fps的屏幕录制?

    [5G资讯网]Android智能手机每天都在开拓新的领域,应用程序也在以相同的速度发展.最近增加的90赫兹显示屏为智能手机上的更好游戏铺平了道路.在OnePlus 7T推出之前,90Hz显示屏仅限于游 ...

  2. Android多个imei如何获取,如何在Android 10中获取IMEI号,这是获取在Android 10及以下Android 10中获取IMEI号的代码...

    如何在android 10中获取imei编号,这是获取在android 10及以下android 10中获取imei编号的代码. if (android.os.Build.VERSION.SDK_IN ...

  3. android怎样添加图片锐化功能,如何在android处理图片(图像二值化锐化转换格式).doc...

    如何在android处理图片(图像二值化锐化转换格式) 链接:如何在android处理图片( 图像二值化.锐化.转换格式) /thread-36559-1-1.html package net.wea ...

  4. android getter不起作用,java - 如何在Android Studio中自动生成getter和setter

    java - 如何在Android Studio中自动生成getter和setter Android Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter? 14个解决方案 ...

  5. android用什么更新应用程序,如何在Android上更新应用程序 教你如何更新安卓手机APP...

    您从Play商店下载的大多数Android应用程序都会出于各种原因而定期提供更新:添加功能,错误修复,提高安全性...了解如何在Android智能手机上管理应用程序以及如何使它们保持最新. 如果您想要 ...

  6. android 发广播屏蔽home键,如何在Android App中屏蔽(拦截)Home按键及其他按键

    如何在Android App中屏蔽(拦截)Home按键及其他按键 (2013-09-08 13:29:11) 标签: 关键 按键 关键点 方法 安卓 it 编写一个Acitivity,如下所示: 关键 ...

  7. android支付宝支付微信支付封装,如何在Android App中集成支付宝和微信支付功能

    前言 本文主要介绍如何在 Android App 里集成支付宝和微信支付的功能,文中将实现的步骤一步步介绍的非常详细,对同样遇到这个问题的朋友相信会是一个很好的参考,下面话不多说了,来一起看看详细的介 ...

  8. android 最新sdk版本,详解如何在Android studio中更新sdk版本和build-tools版本

    一.首先看下Android开发用到的sdk目录: build-tools 保存着一些Android平台相关通用工具,比如adb.和aapt.aidl.dx等文件. aapt即Android Asset ...

  9. android点击下拉历史记录,如何在Android上删除浏览历史记录-万兴恢复专家

    第4部分:如何在Android上永久清除历史记录? 只需删除数据或使用恢复出厂设置无法永久擦除Android.在恢复过程的帮助下,数据很容易恢复,Avast已经证明了这一点.dr.fone工具包 - ...

最新文章

  1. AlertDialog对话框
  2. 【BIEE】BI Publisher下拉菜单设置
  3. python强制可读吗_python 中的强制类型转换
  4. 如何改造UE4用于赛璐璐3D卡渲?这里有一份日本大厂的实操分享
  5. Web测试到底是在测什么(资料合集)
  6. iphone4 短信截获
  7. linux防火墙查看被动模式,Centos7搭建vsftpd及被动模式下的防火墙设置
  8. python有什么用途视频_使用Python管理多平台视频流的最佳方法是什么?
  9. windows 哪些服务必须打开
  10. 大数据系统架构包含哪些内容
  11. 程序员,30岁前最好都找大厂,好好做技术
  12. 报错Failed to load config “prettier“ to extend from.?两步解决方案
  13. delphi IDE插件 cnpack 使用记录
  14. Springboot实现邮箱验证码注册、找回密码和登录功能
  15. 安防摄像头互联网直播方案LiveGBS设计文档
  16. .Net混淆工具和反混淆工具
  17. 无线通信基础知识3:电磁波的传播
  18. solidworks 资料分享
  19. 1D卷积入门:一维卷积是如何处理数字信号的
  20. 检索大写字母 c语言,c语言梦工厂梅丽题目含答案.docx

热门文章

  1. 毕业设计 树莓派指纹识别与RFID考勤系统 - 嵌入式 单片机 物联网
  2. 字节跳动技术评级与面试
  3. 【听】红高粱,莫言经典诺贝尔文学奖小说
  4. 计算机无法识别移动硬盘怎么办,电脑不能识别移动硬盘的原因 移动硬盘不识别怎么办...
  5. win7安全模式如何打开计算机管理,Win7安全模式怎么进?Win7进入安全模式方法
  6. Phoenix二级索引那些事儿(下)
  7. WordNet相关API介绍及语义相似度计算方法
  8. 计算机二进制造价便宜,二进制计算器/换算
  9. 怎样提高工作积极性与工作效率
  10. 配置Web DashBoard