美女网站一区二区_在线观看日韩毛片_成人在线视频首页_欧美精品一区二区三区久久久_国产精品亚洲一区二区三区在线_日本免费新一区视频_日本美女一区二区三区_精品亚洲成a人_久久不见久久见免费视频1_91首页免费视频_欧美一区二区在线看_91精品91久久久中77777_天堂蜜桃一区二区三区_av在线一区二区_欧美不卡一区二区_欧美影视一区二区三区

產品分類

當前位置: 首頁 > 傳感測量產品 > 工業傳感器 > 加速度傳感器

類型分類:
科普知識
數據分類:
加速度傳感器

在Android的驅動程序中對加速度傳感器的數據進行方向和坐標的轉換

發布日期:2022-10-09 點擊率:101

摘要:Android 是面向智能手機和其他便攜式設備的最受歡迎的操作系統(OS)之一。它為多種傳感器提供了標準的API 接口,包括加速度計。加速度計的標準API 定義了原始加速度數據的坐標系統。用戶必須將從傳感器中讀取的原始數據轉換為標準單位,并使其符合系統定義的坐標方向。本文介紹了Android 中的坐標系統是如何定義的,以及如何在Android 系統的驅動代碼中對3 軸加速度計數據的方向和坐標進行轉換。本文討論的示例代碼基于飛思卡爾的Android 2.2 和2.3 驅動程序,加速度計則以飛思卡爾的MMA8452Q 加速度傳感器為例。
關鍵詞:加速度計,傳感器驅動,Android

一部智能手機或便攜設備應具有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 列出了與設備的各個位置相對應的傳感器的加速度值讀數。用戶可以用下表檢查加速度計的方向與系統坐標是否一致。

表 1. 不同位置上各軸的加速度值

通過加速度傳感器讀取3 軸加速度值時,需要假設傳感器的3 軸方向與系統坐標是一致的。但是在實際的產品中,可能會使用不同的傳感器芯片,或者采用不同的安裝方向,因此數據方向也會不同。圖2 所示的是飛思卡爾MMA8452Q 3 軸加速度傳感器的方向定義。


圖 2. MMA8452Q 的方向定義

在圖 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 層上進行轉換。


圖 3. Android 驅動架構

在 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<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 ");
return; }

X 軸和Y 軸可以通過以下方式輕松交換:

if (mma8452_read_data(&y,&x,&z) != 0) {
//DBG("mma8452 data read failed ");
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 ");
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 驅動。

參考資料
1. Android Coordinate System
http://developer.android.com/reference/android/hardware/SensorEvent.html
2. Reference Code and User’s Guide on ‘Android MMA8452.tar.gz’.
3. Reference Code and User’s Guide on ‘mma8452_imx51_android10_v100.tar.gz’.
4. Datasheet ‘MMA8452Q.pdf’.

下一篇: PLC、DCS、FCS三大控

上一篇: 索爾維全系列Solef?PV

推薦產品

更多
美女网站一区二区_在线观看日韩毛片_成人在线视频首页_欧美精品一区二区三区久久久_国产精品亚洲一区二区三区在线_日本免费新一区视频_日本美女一区二区三区_精品亚洲成a人_久久不见久久见免费视频1_91首页免费视频_欧美一区二区在线看_91精品91久久久中77777_天堂蜜桃一区二区三区_av在线一区二区_欧美不卡一区二区_欧美影视一区二区三区


        91精品国产综合久久精品麻豆| 欧美激情第一页在线观看| 三级影片在线观看欧美日韩一区二区| 亚洲三级在线观看| 中文字幕在线播放不卡一区| 中文字幕不卡在线播放| 国产亚洲精品久| 国产精品视频观看| 1区2区3区欧美| 亚洲一线二线三线视频| 亚洲午夜在线电影| 亚洲国产成人91porn| 日韩成人一区二区| 国产一区不卡在线| 成人av午夜电影| 成人综合色站| 亚欧洲精品在线视频免费观看| 亚洲一区影院| 欧美一区二区啪啪| 中文字幕精品三区| 日韩一区精品字幕| 国产999精品久久久久久| 91黄在线观看| 日本福利一区二区三区| 在线中文字幕一区| 26uuu国产日韩综合| 亚洲色图丝袜美腿| 久久精品av麻豆的观看方式| 99视频在线精品| 奇米视频888战线精品播放| 色噜噜狠狠色综合中国| 精品久久久久久久久久久院品网| 中文字幕一区二区三区在线不卡 | 欧美日韩精品电影| 国产人久久人人人人爽| 亚洲综合成人网| 国产精品一区二区久久不卡| 国产欧美精品一区二区三区| 一本色道久久综合精品竹菊| 精品国产一区二区三区忘忧草 | 91日韩精品一区| 在线观看免费91| 国产欧美综合色| 日韩va亚洲va欧美va久久| 91香蕉国产在线观看软件| 一区二区91美女张开腿让人桶| 精品国产3级a| 日本中文字幕一区二区有限公司| 91老师国产黑色丝袜在线| 色又黄又爽网站www久久| 日本一区二区免费在线| 久久99精品久久久久久国产越南 | 好看的日韩精品| 91麻豆精品国产91久久久资源速度| 国产精品理伦片| 国产精品99久久久| 亚洲 国产 欧美一区| 久久综合狠狠综合| 韩国在线一区二区| 涩涩日韩在线| 中文字幕亚洲一区二区av在线| 国产91露脸合集magnet | 中文字幕一区不卡| 懂色av一区二区三区免费观看| 天堂精品视频| 中文字幕在线一区二区三区| 成人午夜视频网站| 欧美日韩一区中文字幕| 亚洲国产一区二区三区| 国产一级特黄a大片99| 日韩三级在线免费观看| 免费欧美日韩国产三级电影| 久久综合狠狠综合久久综青草| 日韩精品资源二区在线| 免费观看在线综合色| 欧洲精品一区色| 中文字幕一区二区三区在线观看| 99热99精品| 日韩精品一区二区三区视频| 久久99精品久久只有精品| 在线一区日本视频| 亚洲国产综合色| 久久综合一区二区三区| 中文字幕免费在线观看视频一区| 风间由美一区二区av101| 欧美三级欧美一级| 日韩高清不卡一区二区三区| 三区精品视频观看| 夜夜夜精品看看| 欧美少妇一区| 亚洲欧美视频一区| 精品国产乱码一区二区三区四区| 日本一区二区三区四区 | 亚洲免费视频一区| 天天影视色香欲综合网老头| 日韩欧美精品在线不卡| 亚洲女同一区二区| 日韩久久久久久久久久久久久| 亚洲免费观看高清在线观看| 韩国精品一区二区三区六区色诱| 国产欧美一区二区精品忘忧草| 99久久婷婷国产综合精品| 欧美精品一区二区三区很污很色的| 成人免费观看av| 久久亚洲一区二区三区明星换脸| 91小视频免费观看| 亚洲国产高清在线| 精品欧美一区二区三区久久久| 国产精品你懂的在线欣赏| 国产一区二区三区色淫影院| 中文字幕一区二区日韩精品绯色| 久久久久欧美| 午夜精品久久久| 在线视频你懂得一区| 韩国女主播一区| 精品区一区二区| 成人自拍爱视频| 中文字幕在线一区免费| 欧美三级网色| 日本欧美在线观看| 欧美日韩电影在线| 成人性视频免费网站| 国产色爱av资源综合区| 农村寡妇一区二区三区| 亚洲高清视频在线| 欧美日韩mp4| 91在线国内视频| 一区二区三区免费| 欧美日韩国产一级| 1卡2卡3卡精品视频| 亚洲六月丁香色婷婷综合久久 | 免费观看91视频大全| 在线播放91灌醉迷j高跟美女| 99精品久久99久久久久| 自拍偷拍亚洲欧美日韩| 在线影视一区二区三区| 成人高清伦理免费影院在线观看| 欧美国产日本韩| 亚洲一区二区三区加勒比| 国产精品一区一区| 中文字幕国产一区| 亚洲一区三区电影在线观看| 粉嫩一区二区三区在线看| 中文字幕一区免费在线观看| 欧美在线不卡视频| 国产日韩欧美亚洲一区| 另类小说色综合网站| 国产亚洲欧美日韩日本| 一区二区免费在线视频| 91色视频在线| 日韩综合在线视频| 久久精品亚洲国产奇米99| 亚洲一区不卡在线| 白白色 亚洲乱淫| 亚洲成av人片在线观看| 久久色在线观看| 一道本成人在线| 国产精品区一区二区三在线播放| 美腿丝袜亚洲一区| 亚洲视频免费看| 精品国产免费人成电影在线观看四季 | 在线播放日韩导航| 久久精品第九区免费观看| 久久se精品一区精品二区| 国产农村妇女毛片精品久久麻豆| 一本高清dvd不卡在线观看| 91成人理论电影| 裸体一区二区三区| 亚洲精品一二三| 69堂成人精品免费视频| 视频一区三区| 国产精品大全| 国产乱码精品一区二区三区五月婷| 亚洲精品国产第一综合99久久| 91精品国产综合久久精品| 一区二区三区|亚洲午夜| 国产精品三区四区| 粉嫩aⅴ一区二区三区四区 | 精品国产麻豆免费人成网站| 在线观看免费亚洲| 欧美一级二级三级九九九| 91视频com| 精品一区二区av| 亚洲伊人色欲综合网| 中文字幕欧美区| 精品粉嫩aⅴ一区二区三区四区| 中文字幕日韩精品久久| 人偷久久久久久久偷女厕| 成人永久免费| 999视频在线免费观看| 国产成人自拍在线| 日本视频一区二区三区| 一区二区三区中文字幕| 国产精品护士白丝一区av| 久久久久久免费网| 日韩精品中文字幕在线一区| 欧美性xxxxx极品少妇| 一区二区三区四区免费视频| 国产精品三区四区| 成人3d动漫一区二区三区91|