현재 위치 - 회사기업대전 - 중국 기업 정보 - 안드로이드 드라이버에서 가속도 센서 데이터의 방향 및 좌표 회전을 수행하는 방법

안드로이드 드라이버에서 가속도 센서 데이터의 방향 및 좌표 회전을 수행하는 방법

스마트폰 또는 휴대용 장치에는 Wi-Fi 및 인터넷 기능이 있어야 하며, 어플리케이션 소프트웨어와 같은 다양한 기능을 실행할 수 있어야 하며, 내장형 센서가 있어야 합니다. 고급형 스마트폰은 근접 센서, 주변광 센서, 3

축 가속도계, 자력계 등 다양한 센서를 통합할 수 있다. 안드로이드 2.3

자이로 스코프, 회전 벡터, 선형 가속, 중력 및 압력 센서 등 다양한 새로운 센서를 지원하는 API 가 추가되었습니다. 응용 소프트웨어는 이러한 새로운 센서를 사용 하 여 이들을 결합 하 여 고정밀 고급 모션 감지 기능을 구현할 수 있습니다.

3 축 가속도계 또는 낮은 g 값 센서는 안드로이드 API

가 지원하는 센서 중 하나이며 애플리케이션에 표준 인터페이스 데이터를 제공하는 특정 좌표계를 갖추고 있습니다. 좌표 공간의 정의는 그림 1 과 같이 휴대폰 화면의 기본 방향과 관련이 있습니다.

그림

1. 3 축 가속도계의 안드로이드 좌표계

안드로이드 좌표계에서 좌표 원점은 화면의 왼쪽 아래 구석에 있고 x 축은 수평으로 오른쪽, y 를 가리킵니다 이 시스템에서 화면 뒤의 좌표는 음의 z 축 값을 가집니다. 안드로이드 가속도계 데이터는

sensor.type _ accelerometer

모든 숫자 값은 SI

표준 단위로 정의됩니다

values [0]: x 축의 가속도 값에서 GX

values [1]: y

축의 가속도 값에서 gy 를 뺀 값입니다 장치가 테이블 위에 평평하게 놓여 있을 때 가속도 값은 +9.81 입니다. 이는 장치의 가속도 값 (0 m/s2) 에서 중력 가속도 값 (-9.81 m/s2) 을 뺀 값입니다.

디바이스가 테이블 위에 평평하게 놓여 있고 가속도 A m/s2 로 하늘 방향으로 밀면 가속도 값은 A+9.81 과 같습니다. 이는 디바이스 가속도 값 (+A

m/s2) 에서 중력을 뺀 값입니다

표 1

에는 디바이스의 각 위치에 해당하는 센서의 가속도 값 판독값이 나와 있습니다. 다음 표를 사용하여 가속도계의 방향이 시스템 좌표와 일치하는지 확인할 수 있습니다.

가속도 센서를 통해 3 축 가속도 값을 읽을 때 센서의 3

축 방향이 시스템 좌표와 일치한다고 가정해야 합니다. 그러나 실제 제품에서는 센서 칩이 다르거나 설치 방향이 다를 수 있으므로 데이터 방향도 다를 수 있습니다. 그림 2 는 비스칼 MMA8452Q

3 축 가속도 센서의 방향 정의를 보여 줍니다.

그림 2 에서 칩을 설치할 때 핀 1 을 오른쪽 아래 위치 (PD) 에 두고 PCB 앞에 설치해야 안드로이드

< P > 좌표계의 기본 위치와 일치시킬 수 있습니다. 이렇게 설치하면 데이터 방향이 시스템 좌표 정의와 일치하는지 확인할 수 있습니다. 다른 경우에는 데이터가 시스템 정의와 정확히 일치하지 않으므로 데이터 방향과 좌표를 변경해야 합니다. 경우에 따라 X

와 y 축을 교환해야 하거나 방향과 X-Y 축을 모두 바꿔야 합니다.

방향을 변경하거나 X-Y 축을 교환해야 하는지 여부를 결정하는 방법은 표 1 과 같이

1.

위 (UP) 에 장치를 배치합니다.

2. 센서에서 3 축 데이터를 읽습니다. Y 축의 데이터가 1g

(9.81m/S2) 이고 다른 두 축의 데이터가 약 0 인 경우 X-Y 축을 교환할 필요가 없습니다. 그렇지 않으면 x 축과 y 축을 교환해야 합니다. 3 단계로 이동합니다.

2.1.

y 축에서 읽은 데이터가 +1 g (+9.81m/s2) 인 경우 y 축의 방향을 변경할 필요가 없습니다. 데이터가 음수인 경우 y

2.2.

표 1 과 같이 왼쪽 (LEFT) 위치에 장치를 배치합니다. X 축에서 읽은 데이터는 ±1g (±9.81m/s2) 여야 하고 다른 두 축의 데이터는 약 0 이어야 합니다. X

축의 데이터가 양수이면 방향을 변경할 필요가 없습니다. 그렇지 않으면 x 축의 방향을 변경해야 합니다. 그런 다음 4 단계를 수행하여 z 축의 방향을 결정합니다.

3.

장치는 위쪽 (UP) 위치에 남아 있으며 센서에서 3 축 데이터를 읽습니다. 이 시점에서 x 축의 데이터는 1g

(9.81m/S2) 이고, 다른 두 축의 데이터는 약 0 이며 X-Y 교환이 필요합니다.

3.1. x 축의 데이터를 +1 g

(+9.81m/s2) 로 읽는 경우 x 축의 방향을 변경할 필요가 없습니다. 그렇지 않으면 변화가 필요하다.

3.2. 표 1 과 같이 왼쪽 (LEFT) 위치에 장치를 배치합니다. 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 축 방향을 변경해야 합니다.

안드로이드 시스템에서 센서 데이터는 커널 공간의 Linux 드라이버에 의해 읽혀지고 HAL 계층 드라이버에 의해 API 로 전송됩니다. 계층 구조는 그림 3

와 같습니다. 따라서 센서 데이터는 Linux 드라이버 계층 또는 HAL 계층에서 변환할 수 있습니다.

안드로이드 Hal 파일에서 x 축, y 축 및 z 축의 방향 변경

HAL

파일에는 센서에서 읽은 가속 데이터를 다음으로 변환하는 매크로 정의 세트가 있습니다

//conversion of

acceleration data to si units (m/s 2)

와 같은 코드 Defineconvert _ a _ x (-convert _ a)

# defineconvert _ a _ y (convert _ a) 상수 GRAVITY_EARTH

는 표준 중력 가속도 값, 즉 9.81m/s2 이며 LSG 는 중력 가속도 값의 최소 유효 개수 값입니다 (예: MMA8452

따라서 CONVERT_A 는 가속도 센서에서 읽은 데이터를 디지털 판독값에서 표준 중력 가속도 단위로 변환하는 데 사용됩니다.

CONVERT_A_X, CONVERT_A_Y 및 CONVERT_A_Z 를 각각 수정하여 x, y 및 z

를 쉽게 변경할 수 있습니다 축의 방향이 시스템 정의와 반대인 경우 (-CONVERT_A) 를 사용하여 방향을 변경할 수 있습니다. 방향이 같으면 (CONVERT_A) 를 사용하면 방향이 그대로 유지됩니다.

이 매크로 정의는 fsl 안드로이드 9 (안드로이드 2.2) 드라이버의 HAL 파일 sensor.c 에 있습니다. Fsl 안드로이드 10

(안드로이드 2.3) 의 경우 'libsensors' 폴더의 HAL 파일 Sensor.h 에서 찾을 수 있습니다.

안드로이드 2.2 Hal

파일에서 x 축과 y 축 교환

경우에 따라 센서 데이터의 좌표가 시스템 좌표와 일치하도록 x 축과 y 축을 교환해야 합니다.

fsl

안드로이드 9 (안드로이드 2.2) 드라이버의 경우 x 축과 y 축 교환이 매우 간단합니다.

먼저 HAL 파일 sensor.c

의 sensor_poll () 함수에서

switch (event) 코드를 찾습니다

break;

case

ABS _ y:

ssensors.acceleration.y = event >

break;

caseabs _ z:

ssensors.acceleration.z = event.value * convert.

break;

}

그런 다음 다음과 같이 코드를 수정합니다.

switch (event.code) {

break;

caseabs _ y:

ssensors.acceleration.x = event.value * convert.

break;

caseabs _ z:

ssensors.acceleration.z = event.value *

break;

}

는 안드로이드 2.3 의 HAL 파일에서 x 축과 y 축 교환

에서

안드로이드 2.3 의 모든 HAL

파일은' libsensors' 폴더에 있습니다. AccelSensor.cpp 파일에 있는 두 함수를 수정해야 합니다.

먼저 다음과 같이 AccelSensor () 함수의 코드를 수정합니다.

if

(Accel _ is) Lt; Accelerometer;; If (! Ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_X),

amp; Absinfo)) {

mpendingevents [accelerometer]. acceleration.y =

ABS

}

if (! Ioctl(data_fd,

eviocgabs (event _ type _ Accel _ y), amp;; Absinfo)) {

mpendingevents [가속기]. acceleration.x = absinfo.value * com

}

if (! Ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Z), amp;; Absinfo)) {

mpendingevents [accelerometer]. acceleration.z = absinfo.value * com

}

}

그런 다음 다음과 같이 processEvent () 함수의 코드를 수정합니다.

<; Int value)

{

스위치 (코드) {

case event _ type _ Lt; Accelerometer;; Mpendingevents [accelerometer]. acceleration.y = value * convert _ a _ y;

break;

caseevent _ type _ Accel _ y:

mpendingmask | = 1lt; Lt; Accelerometer;; Mpendingevents [accelerometer]. acceleration.x = value * convert _ a _ x;

break;

caseevent _ type _ Accel _ z:

mpendingmask | = 1lt; Lt; Accelerometer;; Mpendingevents [accelerometer]. acceleration.z = value * convert _ a _ z;

break;

}

}

가 완료되면 x 축과 y 축의 데이터가 서로 교환됩니다.

커널 구동 파일에서 x 축과 y 축 교환

X 축과 y 축의 데이터 교환은 센서 데이터 읽기를 처음 시작할 때 기본 리눅스 드라이버에서 구현할 수 있습니다. 이런 식으로 HAL 파일은 센서 칩이 PCB

에 설치된 방식이나 다양한 유형의 센서를 사용하는 방식에 관계없이 일관성을 유지할 수 있습니다.

안드로이드 2.2 및 2.3

에서 이 작업을 수행하는 가장 쉬운 방법은 report_abs () 함수의 코드를 수정하는 것입니다. 이 함수에서 센서 데이터는 다음과 같이 함수 mma8452_read_data () 를 호출하여 읽습니다 (사용된 센서가 MMA8452Q

인 경우).

X, amp;; Y, amp;; Z)! = 0) {

//dbg ("MMA 8452 data read failed \ n");

복귀; }

X 축과 Y

축은

if (mma8452 _ read _ data (amp Y, amp;; X, amp;; Z)! = 0) {

//dbg ("MMA 8452 data read failed \ n");

복귀; }

안드로이드

2.2 의 경우 MMA8452 의 커널 드라이버 파일은 mma8452.c;; 안드로이드 2.3 의 경우 드라이버 파일은' hwmon' 폴더에 있는 mxc_mma8452.c 입니다.

커널 드라이버 파일에서 x 축, y 축 및 z 축의 방향 변경

센서 데이터의 방향은 커널

드라이버 파일에서도 변경할 수 있습니다. Report_abs () 함수에 주석이 있는 다음 명령문을 추가하여 데이터 방향을 변경할 수 있습니다.

if

(mma8452 _ read _ data ( Y, amp;; X, amp;; Z)! = 0) {

//dbg ("MMA 8452 data read

failed \ n");

복귀;

}

x * =-1; //reverse x direction

y * =-1;

//reverse y direction

z * =-1; //reverse zdirection

input _ report _ ABS (mma8452 _ idev-gt; 입력, ABS_X, x);

input _ report _ ABS (mma8452 _ idev-gt; Input, ABS_Y, y);

input _ report _ ABS (mma8452 _ idev-gt; Input, ABS_Z, z);

input _ sync (mma8452 _ idev-gt; Input);

요약

안드로이드

시스템은 가속도계에 대한 좌표계를 정의했으므로 실제 센서에서 읽은 데이터를 변환해야 일관성을 유지할 수 있습니다. 변환이 필요한지 여부에 관계없이 x, y 및 Z

축의 방향과 X-Y 축 좌표를 확인해야 합니다.

HAL 파일이나 Kernel 구동 파일을 변경하여 축의 방향을 변경하거나 X 축과 Y 축을 교환할 수 있지만 HAL 파일과 Kernel 구동을 동시에 수정하지 마십시오.

찾기

copyright 2024회사기업대전