이 섹션에서는 센서 축, 기본 센서 및 복합 센서(액티비티, 애티튜드, 미보정 및 상호작용)에 관해 설명합니다.
센서 축
여러 센서의 센서 이벤트 값은 기기와 관련하여 정적인 구체적인 프레임으로 표현됩니다.
휴대기기 축
센서 API는 화면의 자연스러운 방향만 기준으로 삼습니다(기기의 화면 방향이 변경되어도 축은 전환되지 않음).
![휴대기기용 센서 API 좌표계](https://developer.android.google.cn/images/axis_device.png?authuser=19&hl=ko)
그림 1. 센서 API에서 사용하는 좌표계(휴대기기 기준)
자동차 축
Android Automotive 구현에서는 축이 차체 프레임과 관련하여 정의됩니다. 차량 기준 프레임의 원점은 후차축의 중앙입니다. 차량 기준 프레임의 방향은 다음과 같습니다.
- X축이 오른쪽을 가리키며 차량의 대칭면과 수직인 수평면에 있습니다.
- Y축이 앞을 향해 있고 수평면에 있습니다.
![자동차 기기용 센서 API 좌표계](https://source.android.google.cn/static/docs/core/interaction/sensors/images/axis_auto.png?authuser=19&hl=ko)
그림 2. 센서 API에서 사용하는 좌표계(자동차 기기 기준)
차량 기준 프레임은 오른손 좌표계입니다. 따라서 Z축이 위를 가리킵니다.
기준 프레임의 Z축은 중력에 맞게 정렬됩니다. 즉, X축 및 Y축이 모두 수평 방향입니다. 따라서 Y축이 항상 앞차축을 통과하지 못할 수도 있습니다.
기본 센서
기본 센서 유형은 해당 유형을 나타내는 물리 센서에서 이름을 가져옵니다. 이러한 센서는 다른 여러 센서를 활용해 데이터를 생성하는 복합 센서와 달리, 하나의 물리 센서에서 데이터를 전달합니다. 기본 센서 유형의 예는 다음과 같습니다.
SENSOR_TYPE_ACCELEROMETER
SENSOR_TYPE_GYROSCOPE
SENSOR_TYPE_MAGNETOMETER
하지만 기본 센서는 그 기초가 되는 물리 센서와 같지 않으므로 이와 혼동해서는 안 됩니다. 기본 센서의 데이터는 물리 센서의 원시 출력이 아닙니다. 이는 바이어스 보상 및 온도 보상과 같은 교정값이 적용되기 때문입니다.
예를 들어 다음과 같은 사용 사례에서 기본 센서의 특성은 그 기초가 되는 물리 센서의 특성과 다를 수 있습니다.
- 바이어스 범위가 1deg/sec로 평가된 자이로스코프 칩
- 공장 보정 후에는 온도 보상 및 바이어스 보상이 적용되며, Android 센서의 실제 바이어스는 바이어스가 0.01deg/sec 미만이 될 것으로 보장될 때까지 감소할 수 있습니다.
- 이러한 상황에서는 기초 센서의 데이터시트에 1deg/sec으로 명시된 경우에도 Android 센서의 바이어스가 0.01deg/sec 미만이라고 말합니다.
- 전력 소모량이 100uW인 기압계.
- 생성된 데이터는 칩에서 SoC로 전송해야 하므로 기압계의 Android 센서에서 데이터를 수집하는 데 드는 실제 전력 소모량은 훨씬 클 수 있습니다(예: 1,000uW).
- 이러한 상황에서는 기압계 칩에서 측정한 전력 소모량이 100uW인 경우에도 Android 센서의 전력 소모량이 1,000uW라고 말합니다.
- 보정되면 100uW를 소모하지만 보정 중에는 더 많은 전력을 소모하는 자기계.
- 보정 루틴에서 자이로스코프를 활성화하여 5,000uW를 소모하고 일부 알고리즘을 실행해 900uW가 추가로 소모되도록 요구할 수 있습니다.
- 이러한 상황에서는 (자기계) Android 센서의 최대 전력 소모량이 6,000uW라고 말합니다.
- 이 경우 평균 전력 소모량이 훨씬 유용한 측정값이며, 이러한 측정값은 HAL을 통해 센서 정적 특성에 보고됩니다.
가속도계
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER)
가 non-wake-up 센서를 반환함
가속도계 센서는 3개의 센서 축을 따라 기기의 가속을 보고합니다. 측정된 가속에는 물리적인 가속도(속도 변화) 및 중력이 모두 포함됩니다. 측정값은 sensors_event_t.acceleration의 x, y, z 필드에 보고됩니다.
모든 값은 SI 단위(m/s^2)로 표시되고 3개의 센서 축을 따라 기기 가속에서 중력을 뺀 값을 측정합니다.
예를 들면 다음과 같습니다.
- 자유 낙하인 경우 기준(x, y, z)이 0에 근접해야 합니다.
- 기기를 테이블에 평평하게 눕힌 상태에서 왼쪽에서 오른쪽으로 밀면 x 가속 값은 양수입니다.
- 기기를 테이블에 평평하게 눕힌 상태에서는 Z축을 따라 가속 값이 +9.81alo이며, 이는 기기 가속(0m/s^2)에서 중력(-9.81m/s^2)을 뺀 값에 해당합니다.
- 기기를 테이블에 평평하게 눕힌 상태에서 하늘 쪽으로 밀면 가속 값은 +9.81보다 크며, 이는 기기 가속(+Am/s^2)에서 중력(-9.81m/s^2)을 뺀 값에 해당합니다.
판독값은 다음을 사용하여 보정됩니다.
- 온도 보상
- 온라인 바이어스 보정
- 온라인 눈금 보정
바이어스 및 눈금 보정은 스트리밍 도중에 값이 점프되지 않도록 센서가 비활성화된 상태에서만 업데이트해야 합니다.
가속도계는 sensors_event_t.acceleration.status
를 통해 판독값이 얼마나 정확할 것으로 예상되는지도 보고합니다. 이 필드에 사용 가능한 값에 관한 자세한 내용은 SensorManager
의 SENSOR_STATUS_*
상수를 참고하세요.
주변 온도
보고 모드: 변경 시
getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE)
가 non-wake-up 센서를 반환함
이 센서는 주변 온도(실온)를 섭씨 단위로 제공합니다.
자기장 센서
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD)
가 non-wake-up 센서를 반환함
SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD
자기장 센서(자기계)는 3개의 센서 축을 따라 측정된 주변 자기장을 보고합니다.
측정값은 sensors_event_t.magnetic
의 x, y, z 필드에 보고되며 모든 값의 단위는 마이크로테슬라(uT)입니다.
자기계는 sensors_event_t.magnetic.status
를 통해 판독값이 얼마나 정확할 것으로 예상되는지도 보고합니다. 이 필드에 사용 가능한 값에 관한 자세한 내용은 SensorManager
의 SENSOR_STATUS_*
상수를 참고하세요.
판독값은 다음을 사용하여 보정됩니다.
- 온도 보상
- 공장(또는 온라인) 연철 보정
- 온라인 강철 보정
자이로스코프
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_GYROSCOPE)
가 non-wake-up 센서를 반환함
자이로스코프 센서는 3개의 센서 축 기준의 기기 회전 속도를 보고합니다.
회전은 시계 반대 방향(오른손 법칙)으로 양수입니다. 즉, 기기가 원점에 위치한 상태에서 X, Y 또는 Z축의 양수 위치에서 기기를 관찰하는 관찰자가 기기가 시계 반대 방향으로 회전하는 것처럼 보일 경우 양수 회전을 보고하게 됩니다. 이는 양수 회전의 표준적인 수학적 정의이며 항공우주 용어인 롤(roll)에 관한 정의와 일치하지 않습니다.
측정값은 sensors_event_t.gyro
의 x, y, z 필드에 보고되며 모든 값의 단위는 rad/s입니다.
판독값은 다음을 사용하여 보정됩니다.
- 온도 보상
- 공장(또는 온라인) 눈금 보상
- 온라인 바이어스 보정(드리프트 제거용)
자이로스코프는 sensors_event_t.gyro.status
을 통해 판독값이 얼마나 정확할 것으로 예상되는지도 보고합니다. 이 필드에 사용 가능한 값에 관한 자세한 내용은 SensorManager
의 SENSOR_STATUS_*
상수를 참고하세요.
자이로스코프는 자기계 및 가속도계를 기반으로 에뮬레이션할 수 없습니다. 로컬 일관성과 응답성이 감소하기 때문입니다. 따라서 자이로스코프는 일반적인 자이로스코프 칩에 기반해야 합니다.
심박수
보고 모드: 변경 시
getDefaultSensor(SENSOR_TYPE_HEART_RATE)
가 non-wake-up 센서를 반환함
심박수 센서는 기기를 만지는 사람의 현재 심박수를 보고합니다.
현재 심박수는 sensors_event_t.heart_rate.bpm
에 분당 심박수(BPM)로 보고되며, 센서 상태는 sensors_event_t.heart_rate.status
에 보고됩니다. 이 필드에 사용 가능한 값에 관한 자세한 내용은 SensorManager
의 SENSOR_STATUS_*
상수를 참고하세요. 특히 최초 활성화 후에는 기기를 몸에 휴대하지 않은 것으로 알려지지 않은 이상 첫 번째 이벤트의 상태 필드를 SENSOR_STATUS_UNRELIABLE
로 설정해야 합니다. 이는 온체인지 센서이므로 heart_rate.bpm
또는 heart_rate.status
가 마지막 이벤트 이후로 변경된 경우에만 이벤트가 생성됩니다. 이벤트는 모든 sampling_period
보다 더 빨리 생성되지 않습니다.
sensor_t.requiredPermission
은 항상 SENSOR_PERMISSION_BODY_SENSORS
입니다.
밝기
보고 모드: 온체인지
getDefaultSensor(SENSOR_TYPE_LIGHT)
가 non-wake-up 센서를 반환함
광센서가 현재 조명을 SI lux 단위로 보고합니다.
측정값은 sensors_event_t.light
에 보고됩니다.
근접 센서
보고 모드: 온체인지
보통 wake-up 센서로 정의됨
getDefaultSensor(SENSOR_TYPE_PROXIMITY)
가 wake-up 센서를 반환함
근접 센서는 센서와 눈에 보이는 가장 가까운 표면 사이의 거리를 보고합니다.
Android 4.4까지는 근접 센서가 항상 wake-up 센서였으며, 근접성의 변화를 감지하면 SoC의 절전 모드가 해제되었습니다. Android 4.4 이후에는 이 센서의 wake-up 버전부터 구현하는 것이 좋습니다. 이 버전이 전화 통화를 하는 동안 화면을 켜고 끄는 데 사용되기 때문입니다.
측정값은 sensors_event_t.distance
에 센티미터 단위로 보고됩니다. 일부 근접 센서는 바이너리 'near' 또는 'far' 측정만 지원합니다.
이 경우 센서는 'far' 상태에는 sensor_t.maxRange
값을, 'near' 상태에는 sensor_t.maxRange
보다 작은 값을 보고합니다.
압력 센서
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_PRESSURE)
가 non-wake-up 센서를 반환함
압력 센서(기압계)는 주변 압력을 헥토파스칼(hPa) 단위로 보고합니다.
판독값은 다음을 사용하여 보정됩니다.
- 온도 보상
- 공장 바이어스 보정
- 공장 눈금 보정
기압계는 고도 변화를 예상하는 데 자주 사용됩니다. 절대 고도를 예상하려면 기후에 따라 변화하는 해면기압을 참조해야 합니다.
상대 습도
보고 모드: 온체인지
getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY)
가 non-wake-up 센서를 반환함
상대 습도 센서는 상대적인 주변 대기 습도를 측정하고 백분율 값을 반환합니다.
복합 센서 유형
복합 센서는 단일 실제 센서 또는 여러 실제 센서의 데이터를 처리 또는 융합하여 데이터를 생성합니다. 기본 센서가 아닌 모든 센서를 복합 센서라고 부릅니다. 복합 센서의 예는 다음과 같습니다.
- 일반적으로 가속도계에 기반하지만 전력 소모량과 정확도가 충분한 경우 다른 센서에도 기반할 수 있는 걸음수 감지기 및 중요한 움직임
- 가속도계 및 자이로스코프 기반의 게임 회전 벡터
- 자이로스코프 기반 센서와 유사하지만 바이어스 보정이 측정에서 교정되는 대신 별도로 보고되는 미보정 자이로스코프
기본 센서처럼 복합 센서의 특성도 최종 데이터의 특성에서 비롯됩니다. 예를 들어 게임 회전 벡터의 전력 소모량은 아마도 가속도계 칩, 자이로스코프 칩, 데이터 처리 칩과 데이터 전송 버스의 전력 소모량을 합친 것과 같을 것입니다. 또 다른 예로, 게임 회전 벡터의 드리프트는 보정 알고리즘 품질만큼이나 실제 센서 특성에 좌우됩니다.
다음 표에는 사용 가능한 복합 센서 유형이 나열되어 있습니다. 각 복합 센서는 단일 실제 센서 또는 여러 실제 센서의 데이터에 의존합니다. 대략적인 결과를 추정하려면 사용자 경험을 저해할 수 있는 다른 기본 실제 센서를 선택하지 않는 것이 좋습니다.
센서 유형 | 카테고리 | 기본 실제 센서 | 보고 모드 |
---|---|---|---|
애티튜드 |
가속도계, 자이로스코프가 자기계를 사용하면 안 됨 |
연속 |
|
애티튜드 |
가속도계, 자기계가 자이로스코프를 사용하면 안 됨 |
연속 |
|
보기 동작 ![]() |
상호작용 |
정의되지 않음 |
원샷 |
애티튜드 |
가속도계, 자이로스코프 |
연속 |
|
보정되지 않음 |
자이로스코프 |
연속 |
|
액티비티 |
가속도계, 자이로스코프(있는 경우) 또는 자기계(자이로가 없는 경우) |
연속 |
|
보정되지 않음 |
자기계 |
연속 |
|
방향(지원 중단됨) |
애티튜드 |
가속도계, 자기계, 자이로스코프(있는 경우) |
연속 |
상호작용 |
정의되지 않음 |
원샷 |
|
애티튜드 |
가속도계, 자기계, 자이로스코프 |
연속 |
|
액티비티 |
가속도계(또는 전력이 매우 낮은 경우 또 다른 가속도계) |
원샷 |
|
액티비티 |
가속도계 |
온체인지 |
|
액티비티 |
가속도계 |
특수 |
|
액티비티 |
가속도계 |
특수 |
|
상호작용 |
정의되지 않음 |
원샷 |
= 저전력 센서
액티비티 복합 센서
선형 가속
기본 실제 센서: 가속도계 및(있는 경우) 자이로스코프(또는 자이로스코프가 없는 경우 자기계)
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION)
가 non-wake-up 센서를 반환함
선형 가속 센서는 센서 프레임 내 기기의 선형 가속을 보고하며, 중력은 포함하지 않습니다.
출력은 개념적으로 가속도계의 출력에서 중력 센서의 출력을 뺀 값입니다. 출력은 sensors_event_t.acceleration
의 x, y, z 필드에 m/s^2로 보고됩니다.
기기가 움직이지 않으면 모든 축의 판독값이 0에 근접해야 합니다.
기기가 자이로스코프를 보유한 경우 선형 가속 센서가 자이로스코프 및 가속도계를 입력으로 사용해야 합니다.
기기가 자이로스코프를 보유하지 않은 경우 선형 가속 센서가 가속도계와 자기계를 입력으로 사용해야 합니다.
중요한 움직임
기본 실제 센서: 가속도계(또는 저전력인 경우 또 다른 가속도계)
보고 모드: 원샷
저전력
이 센서의 wake-up 버전만 구현합니다.
getDefaultSensor(SENSOR_TYPE_SIGNIFICANT_MOTION)
가 wake-up 센서를 반환함
중요한 움직임 감지기는 중요한 움직임이 감지되면 트리거됩니다. 이러한 움직임은 사용자 위치의 변화로 이어질 수 있습니다.
중요한 움직임의 예는 다음과 같습니다.
- 걷거나 자전거를 타는 경우
- 움직이는 차나 기차에 앉아 있는 경우
중요한 움직임을 트리거하지 않는 상황을 예로 들면 다음과 같습니다.
- 휴대전화가 주머니에 있고 사람이 움직이지 않는 경우
- 휴대전화가 테이블에 있고 근처의 통행이나 세탁기로 인해 테이블이 약간 움직이는 경우
상위 수준에서는 중요한 움직임 감지기가 위치 파악 시의 전력 소모를 줄이는 데 사용됩니다. 기기가 정적임을 현지화 알고리즘이 감지하면 저전력 모드로 전환 가능합니다. 여기서 알고리즘은 사용자가 위치를 변경할 때 기기의 절전 모드를 해제하기 위해 중요한 움직임에 의존합니다.
이 센서는 저전력이어야 합니다. 이는 약간의 부정 오류로 이어질 수 있는 전력 소모를 상쇄합니다. 이렇게 하는 데에는 몇 가지 이유가 있습니다.
- 이 센서의 목적은 전력을 절약하는 데 있습니다.
- 사용자가 움직이지 않을 때 이벤트가 트리거되는 상황(거짓양성)은 전력이 낭비되는 만큼 피해야 합니다.
- 사용자가 움직일 때 이벤트가 트리거되지 않는 상황(거짓음성)은 반복적으로만 발생하지 않는다면 허용됩니다. 사용자가 10초 동안 걸었는데 10초 이내에 이벤트가 트리거되지 않는 상황은 허용되지 않습니다.
각 센서 이벤트는 sensors_event_t.data[0]
에 1
을 보고합니다.
걸음 감지기
기본 실제 센서: 가속도계(저전력인 경우 또 다른 가속도계)
보고 모드: 특수(걸음당 1개의 이벤트)
저전력
getDefaultSensor(SENSOR_TYPE_STEP_DETECTOR)
가 non-wake-up 센서를 반환함
걸음 감지기는 사용자가 한 걸음을 걸을 때마다 이벤트를 생성합니다.
이벤트 sensors_event_t.timestamp
의 타임스탬프는 발이 지면에 닿는 순간에 해당하며, 높은 가속 편차를 생성합니다.
걸음 감지기는 걸음수 측정기에 비해 지연 시간이 짧아야 합니다(2초 미만). 걸음 감지기와 걸음수 측정기 모두 사용자가 걷거나 달리거나 계단을 오르면 이를 감지하며, 사용자가 자전거나 차 등을 운전할 때는 트리거되면 안 됩니다.
이 센서는 저전력이어야 합니다. 즉, 하드웨어에서 걸음을 감지할 수 없는 경우에는 이 센서를 정의하면 안 됩니다. 특히 걸음 감지기만 활성화되고 가속도계는 활성화되지 않은 경우 모든 가속도계 판독값이 아닌 걸음만 중단을 트리거해야 합니다.
sampling_period_ns
는 걸음 감지기에 영향을 미치지 않습니다.
각 센서 이벤트는 sensors_event_t.data[0]
에 1
을 보고합니다.
걸음수 측정기
기본 실제 센서: 가속도계(저전력인 경우 또 다른 가속도계)
보고 모드: 온체인지
저전력
getDefaultSensor(SENSOR_TYPE_STEP_COUNTER)
가 non-wake-up 센서를 반환함
걸음수 측정기는 마지막 재부팅 이후에 활성화된 상태에서 사용자가 걸은 걸음수를 보고합니다.
측정값은 sensors_event_t.step_counter
에 uint64_t
로 보고되며, 시스템 재부팅 시에만 0으로 재설정됩니다.
이벤트의 타임스탬프는 이벤트의 마지막 걸음을 걸은 시점으로 설정됩니다.
걸음 시간의 의미는 걸음 감지기 센서 유형을 참고하세요.
걸음수 측정기는 걸음 감지기보다 지연 시간이 길 수 있습니다(최대 10초). 이러한 지연 시간 덕분에 이 센서는 정확성이 높습니다. 하루 동안 측정한 걸음수는 실제 걸음수의 10% 이내여야 합니다. 걸음 감지기와 걸음수 측정기 모두 사용자가 걷거나 달리거나 계단을 오르면 이를 감지하며, 사용자가 자전거나 자동차 등을 운전할 때는 트리거되면 안 됩니다.
하드웨어는 내부 걸음수가 오버플로되지 않는지 확인해야 합니다. 하드웨어 내부 측정기의 최소 크기는 16비트여야 합니다. 오버플로가 임박한 경우(최대 2^16걸음마다) 드라이버가 측정기를 유지하도록 SoC의 절전 모드를 해제할 수 있습니다.
상호작용에 언급된 것처럼 이 센서가 작동하는 동안에는 다른 어떠한 센서(특히 사용되고 있을 가능성이 높은 가속도계)도 방해하면 안 됩니다.
특정 기기가 이러한 작업 모드를 지원할 수 없는 경우에는 HAL에서 이 센서 유형을 보고하면 안 됩니다. 즉, HAL에서 이 센서를 '에뮬레이션'하면 안 됩니다.
이 센서는 저전력이어야 합니다. 즉, 하드웨어에서 걸음을 감지할 수 없는 경우에는 이 센서를 정의하면 안 됩니다. 특히 걸음수 측정기만 활성화되고 가속도계는 활성화되지 않은 경우 가속도계 데이터가 아닌 걸음만 중단을 트리거해야 합니다.
기울임 감지기
기본 실제 센서: 가속도계(저전력인 경우 또 다른 가속도계)
보고 모드: 특수
저전력
이 센서의 wake-up 버전만 구현합니다.
getDefaultSensor(SENSOR_TYPE_TILT_DETECTOR)
가 wake-up 센서를 반환함
기울임 감지기는 기울임 이벤트가 감지될 때마다 이벤트를 생성합니다.
기울임 이벤트는 활성화 또는 센서에 의해 생성된 마지막 이벤트 이후에 최소 35도만큼 변경되는 2초의 평균 중력 방향에 의해 정의됩니다. 알고리즘은 다음과 같습니다.
reference_estimated_gravity
= 활성화 후 1초 동안 측정된 가속도계 측정값의 평균 또는 마지막 기울임 이벤트가 생성된 시점의 예상 중력current_estimated_gravity
= 마지막 2초 동안 측정된 가속도계 측정값의 평균angle(reference_estimated_gravity, current_estimated_gravity) > 35 degrees
인 경우 트리거
휴대전화 방향의 변화 없이 가속이 증가할 경우 기울임 이벤트가 트리거되면 안 됩니다. 예를 들어 차량을 운전하는 동안 급회전하거나 급가속할 경우 평균 가속의 각도가 35도 이상 차이 날 수 있지만 이러한 경우에도 기울임 이벤트가 트리거되면 안 됩니다.
일반적으로 이 센서는 가속도계의 도움만으로 구현됩니다. 전력 소모량만 크게 증가시키지 않는다면 다른 센서도 사용할 수 있습니다. 이는 SoC가 정지 모드로 전환될 수 있도록 허용해야 하는 저전력 센서입니다. HAL에서는 이 센서를 에뮬레이션하면 안 됩니다. 각 센서 이벤트는 sensors_event_t.data[0]
에 1
을 보고합니다.
애티튜드 복합 센서
회전 벡터
기본 실제 센서: 가속도계, 자기계 및 자이로스코프
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR)
가 non-wake-up 센서를 반환함
회전 벡터 센서는 East-North-Up 좌표 프레임 기준의 기기 방향을 보고합니다. 이는 보통 가속도계, 자이로스코프 및 자기계 판독값의 통합으로 획득됩니다. East-North-Up 좌표계는 직접적인 정규직교 기반으로 정의됩니다. 여기서
- X는 동쪽을 가리키며 지면과 관계가 없습니다.
- Y는 북쪽을 가리키며 지면과 관계가 없습니다.
- Z는 하늘을 가리키며 지면과 수직을 이룹니다.
휴대전화의 방향은 East-North-Up 좌표를 휴대전화 좌표에 맞게 조정하는 데 필요한 회전으로 표현됩니다. 즉, 회전을 세계 프레임(X,Y,Z)에 적용하면 휴대전화 좌표(x,y,z)에 맞게 조정됩니다.
회전은 참조(East-North-Up에 대해 조정됨) 기기 방향을 현재 기기 방향으로 전환하기 위해 축 rot_axis
기준의 각도 세타로 휴대전화를 회전하는 것으로 간주될 수 있습니다. 회전은 단위 쿼터니언의 단위 없는 4개의 x, y, z, w 구성요소로 인코딩됩니다.
sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
sensors_event_t.data[3] = cos(theta/2)
여기서
rot_axis
의 x, y, z 필드는 회전축을 나타내는 단위 길이 벡터의 East-North-Up 좌표입니다.theta
는 회전 각도입니다.
쿼터니언은 단위 쿼터니언이며 기준은 1
이어야 합니다.
실패하면 클라이언트의 이상 동작으로 이어집니다.
또한 이 센서는 예상 방향 정확도를 보고합니다.
sensors_event_t.data[4] = estimated_accuracy
(단위: 라디안)
방향 오류는 estimated_accuracy
보다 적어야 합니다(95%의 경우). 이 센서는 자이로스코프를 기본 방향 변경 입력으로 사용해야 합니다.
또한 이 센서는 가속도계와 자기계 입력을 사용하여 자이로스코프 드리프트를 구성하며, 가속도계와 자기계만 사용해서는 구현할 수 없습니다.
게임 회전 벡터
기본 실제 센서: 가속도계 및 자이로스코프(자기계 없음)
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR)
가 non-wake-up 센서를 반환함
게임 회전 벡터 센서는 회전 벡터 센서와 유사하지만 지자기장을 사용하지 않습니다. 따라서 Y축은 북쪽을 가리키는 대신 몇몇 다른 참조를 가리킵니다. 이러한 참조는 Z축 기준의 자이로스코프 드리프트와 같은 자릿수로 드리프트할 수 있습니다.
sensors_event_t.data[0-3]
을 설정하는 방법에 관한 자세한 내용은 회전 벡터 센서를 참고하세요. 이 센서는 예상 방향 정확도를 보고하지 않습니다. sensors_event_t.data[4]
가 예약되며 0
으로 설정되어야 합니다.
이상적인 상황에서는 동일한 실제 방향으로 회전되고 돌아간 휴대전화가 동일한 게임 회전 벡터를 보고해야 합니다.
이 센서는 자이로스코프와 가속도계에 기반해야 하며, 자이로스코프 바이어스의 예상을 통해 자기계를 입력으로 간접 사용할 수 없습니다.
중력
기본 실제 센서: 가속도계 및(있는 경우) 자이로스코프(또는 자이로스코프가 없는 경우 자기계)
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_GRAVITY)
가 non-wake-up 센서를 반환함
중력 센서는 기기 좌표 내 중력의 방향 및 강도를 보고합니다.
중력 벡터 구성요소는 sensors_event_t.acceleration
의 x, y, z 필드에 m/s^2로 보고됩니다.
기기가 대기 상태일 때는 중력 센서의 출력이 가속도계의 출력과 동일해야 합니다. 지구의 중력 강도는 약 9.8m/s^2입니다.
기기가 자이로스코프를 보유한 경우 중력 센서가 자이로스코프와 가속도계를 입력으로 사용해야 합니다.
기기가 자이로스코프를 보유하지 않은 경우 중력 센서가 가속도계와 자기계를 입력으로 사용해야 합니다.
지자기 회전 벡터
기본 실제 센서: 가속도계 및 자기계(자이로스코프 없음)
보고 모드: 연속
저전력
getDefaultSensor(SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR)
가 non-wake-up 센서를 반환함
지자기 회전 벡터는 회전 벡터 센서와 유사하지만 자기계를 사용하고 자이로스코프는 사용하지 않습니다.
이 센서는 자기계에 기반해야 합니다. 이 센서는 자이로스코프를 사용하여 구현할 수 없으며 이 센서에 자이로스코프 입력을 사용할 수 없습니다.
sensors_event_t.data[0-4]
를 설정하는 방법에 관한 자세한 내용은 회전 벡터 센서를 참고하세요.
회전 벡터 센서와 마찬가지로, 방향 오류는 예상 정확도(sensors_event_t.data[4]
)보다 적어야 합니다(95%의 경우).
이 센서는 저전력이어야 하므로 하드웨어에서 구현해야 합니다.
방향(지원 중단됨)
기본 실제 센서: 가속도계, 자기계 및 (있는 경우) 자이로스코프
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_ORIENTATION)
가 non-wake-up 센서를 반환함
참고: 이 센서는 Android SDK에서 지원 중단된 기존 센서 유형이며, 좀 더 명확히 정의된 회전 벡터 센서로 대체되었습니다. 가능한 한 방향 센서 대신 회전 벡터 센서를 사용하세요.
방향 센서는 기기의 애티튜드를 보고합니다. 측정값은 sensors_event_t.orientation
의 x, y, z 필드에 각도로 보고됩니다.
sensors_event_t.orientation.x
: 방위각, Z축 기준으로 자북 방향과 Y 축 사이의 각도(0<=azimuth<360
). 0=북, 90=동, 180=남, 270=서.sensors_event_t.orientation.y
: 피치, X축 기준의 회전(-180<=pitch<=180
), Z축이 Y축을 향해 이동 시 양수 포함sensors_event_t.orientation.z
: 롤, Y축 기준의 회전(-90<=roll<=90
), Z축이 X축을 향해 이동 시 양수 포함
여러 가지 이유로, 롤 각도는 시계 방향으로 양수입니다. 수학적인 관점에서는 시계 반대 방향으로 양수여야 합니다.
![기기 기준의 방향 묘사](https://source.android.google.cn/static/docs/core/interaction/sensors/images/axis_positive_roll.png?authuser=19&hl=ko)
그림 3. 기기 기준 방향
이 정의는 X 축이 항공기의 긴 면을 따라 뒤에서 앞으로 형성되는, 항공학에 사용되는 요, 피치 및 롤과는 다릅니다.
방향 센서는 sensors_event_t.orientation.status
를 통해 판독값이 얼마나 정확할 것으로 예상되는지도 보고합니다. 이 필드에 사용 가능한 값에 관한 자세한 내용은 SensorManager
의 SENSOR_STATUS_*
상수를 참고하세요.
미보정 센서
미보정 센서는 좀 더 원시적인 결과를 제공하며 일부 바이어스를 포함할 수 있습니다. 또한 보정을 통해 적용된 교정값의 '점프'를 훨씬 적게 포함할 수도 있습니다. 일부 앱은 좀 더 매끄럽고 안정적인 미보정 결과를 선호할 수 있습니다. 예를 들어 앱에서 센서 융합을 시도할 경우, 보정을 적용하면 실제로는 결과가 왜곡될 수 있습니다.
보정되지 않은 가속도계
기본 실제 센서: 가속도계
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED)
가 non-wake-up 센서를 반환함
보정되지 않은 가속도계 센서는 3개의 센서 축을 따라 바이어스 교정 없이 기기의 가속을 바이어스 예상값과 함께 보고합니다(공장 바이어스 보정과 온도 보정은 미보정 측정값에 적용됨).
모든 값은 SI 단위(m/s^2)로 표시되고 sensors_event_t.uncalibrated_accelerometer
의 필드에 보고됩니다.
x_uncalib
: X축을 따른 가속(바이어스 보상 없음)y_uncalib
: Y축을 따른 가속(바이어스 보상 없음)z_uncalib
: Z축을 따른 가속(바이어스 보상 없음)x_bias
: X축을 따라 추정된 바이어스y_bias
: Y축을 따라 추정된 바이어스z_bias
: Z축을 따라 추정된 바이어스
미보정 자이로스코프
기본 실제 센서: 자이로스코프
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED)
가 non-wake-up 센서를 반환함
미보정 자이로스코프는 바이어스 보상을 적용하지 않은 센서 축 기준의 회전 속도와 바이어스 예측값을 보고합니다. 모든 값은 초당 라디안 단위로 표시되고 sensors_event_t.uncalibrated_gyro
의 필드에 보고됩니다.
x_uncalib
: X축 기준의 각속도(드리프트 보상 없음)y_uncalib
: Y축 기준의 각속도(드리프트 보상 없음)z_uncalib
: Z축 기준의 각속도(드리프트 보상 없음)x_bias
: X축 기준으로 추정된 드리프트y_bias
: Y축 기준으로 추정된 드리프트z_bias
: Z축 기준으로 추정된 드리프트
개념적으로, 미보정 측정값은 보정된 측정값과 바이어스 예상값을 합한 값인 _uncalibrated = _calibrated + _bias
입니다.
x_bias
, y_bias
, z_bias
값은 바이어스 예상값이 변경되는 즉시 점프해야 하며, 나머지 시간 동안 안정적이어야 합니다.
사용된 좌표계에 관한 자세한 내용은 자이로스코프 센서의 정의를 참고하세요.
공장 보정 및 온도 보상을 측정값에 적용해야 합니다. 또한 x_bias
, y_bias
, z_bias
에 합리적인 예상값이 보고될 수 있도록 자이로스코프 드리프트 예상도 구현해야 합니다. 구현이 드리프트를 예상할 수 없는 경우에는 이 센서를 구현하면 안 됩니다.
이 센서가 있는 경우에는 관련 자이로스코프 센서도 있어야 하며, 두 센서 모두 동일한 sensor_t.name
및 sensor_t.vendor
값을 공유해야 합니다.
미보정 자기장
기본 실제 센서: 자기계
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED)
가 non-wake-up 센서를 반환함
미보정 자기장 센서는 주변 자기장과 강철 보정 예상값을 보고합니다. 모든 값은 마이크로테슬라(uT) 단위로 표시되고 sensors_event_t.uncalibrated_magnetic
의 필드에 보고됩니다.
x_uncalib
: X축을 따른 자기장(강철 보상 없음)y_uncalib
: Y축을 따른 자기장(강철 보상 없음)z_uncalib
: Z축을 따른 자기장(강철 보상 없음)x_bias
: X축을 따라 추정된 강철 바이어스y_bias
: Y축을 따라 추정된 강철 바이어스z_bias
: Z축을 따라 추정된 강철 바이어스
개념적으로, 미보정 측정값은 보정된 측정값과 바이어스 예상값을 합한 값인 _uncalibrated = _calibrated + _bias
입니다.
미보정 자기계는 더 높은 수준의 알고리즘이 잘못된 강철 예상을 처리할 수 있게 해줍니다. x_bias
, y_bias
, z_bias
값은 강철 예상값이 변경되는 즉시 점프해야 하며, 나머지 시간 동안 안정적이어야 합니다.
연철 보정 및 온도 보상을 측정값에 적용해야 합니다. 또한 x_bias
, y_bias
, z_bias
에 합리적인 예상값이 보고될 수 있도록 강철 예상값도 구현해야 합니다. 구현이 바이어스를 예상할 수 없는 경우에는 이 센서를 구현하면 안 됩니다.
이 센서가 있는 경우에는 관련 자기장 센서도 있어야 하며, 두 센서 모두 동일한 sensor_t.name
및 sensor_t.vendor
값을 공유해야 합니다.
힌지 각
보고 모드: 온체인지
getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE)
가 wake-up 센서를 반환함
힌지 각 센서는 기기의 두 필수 부분 사이의 각도(단위: 도)를 측정합니다. 이 센서 유형에서 힌지의 움직임이 측정되면 사용자가 디스플레이를 펼치거나 드러내는 방식 등으로 기기와 상호작용할 수 있는 방식을 변경할 것으로 예상됩니다.
상호작용 복합 센서
일부 센서는 대부분 사용자와의 상호작용을 감지하는 데 사용됩니다. Google은 이러한 센서가 구현되어야 하는 방식을 정의하지 않습니다. 하지만 이러한 센서는 저전력이어야 하며, 기기 제조업체에는 사용자 경험 측면의 품질을 확인해야 할 책임이 있습니다.
절전 모드 해제 동작
기본 실제 센서: 정의되지 않음(모든 저전력 센서)
보고 모드: 원샷
저전력
이 센서의 wake-up 버전만 구현합니다.
getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE)
가 wake-up 센서를 반환함
모든 절전 모드 해제 동작 센서는 기기의 구체적인 움직임에 따라 기기의 절전 모드를 해제합니다. 이 센서가 트리거되면 기기가 마치 전원 버튼이 눌린 것처럼 동작하여 화면을 켭니다. 이러한 동작(이 센서가 트리거될 때 화면을 켜는 동작)은 사용자가 기기 설정에서 비활성화할 수도 있습니다. 설정 변경은 센서 동작에 영향을 미치지 않으며, 트리거 시 프레임워크에서 화면을 켜는지 여부에만 영향을 미칩니다. 감지해야 하는 실제 동작은 지정되지 않으며, 기기 제조업체가 선택할 수 있습니다.
이 센서는 1년 내내 활성화될 가능성이 높으므로 저전력이어야 합니다.
각 센서 이벤트는 sensors_event_t.data[0]
에 1
을 보고합니다.
들어 올리는 동작
기본 실제 센서: 정의되지 않음(모든 저전력 센서)
보고 모드: 원샷
저전력
이 센서의 wake-up 버전만 구현합니다.
getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE)
가 wake-up 센서를 반환함
들어 올리는 동작 센서는 이전 위치(책상, 주머니, 가방)와 상관없이 기기를 들면 트리거됩니다.
각 센서 이벤트는 sensors_event_t.data[0]
에 1
을 보고합니다.
보기 동작
기본 실제 센서: 정의되지 않음(모든 저전력 센서)
보고 모드: 원샷
저전력
이 센서의 wake-up 버전만 구현합니다.
getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE)
가 wake-up 센서를 반환함
보기 동작 센서는 구체적인 동작에 따라 잠시 화면을 켜서 사용자가 화면의 콘텐츠를 볼 수 있게 해줍니다. 이 센서가 트리거되면 기기와 상호작용할 수 없는 잠금 상태가 유지된 상태(잠자기)에서 사용자가 알림이나 다른 콘텐츠를 볼 수 있도록 잠시 화면이 켜졌다가 다시 꺼집니다. 이 동작(센서가 트리거될 때 잠시 화면이 켜지는 동작)은 사용자가 기기 설정에서 비활성화할 수도 있습니다. 설정 변경은 센서 동작에 영향을 미치지 않으며, 트리거 시 프레임워크에서 화면을 켜는지 여부에만 영향을 미칩니다. 감지해야 하는 실제 동작은 지정되지 않으며, 기기 제조업체가 선택할 수 있습니다.
이 센서는 1년 내내 활성화될 가능성이 높으므로 저전력이어야 합니다.
각 센서 이벤트는 sensors_event_t.data[0]
에 1
을 보고합니다.
제한된 축 IMU 센서
Android 13에서 사용할 수 있는 제한된 축 IMU 센서는 3축(x, y, z)을 모두 사용할 수 없는 사용 사례를 지원하는 센서입니다. Android의 표준 IMU 유형(예:
SENSOR_TYPE_ACCELEROMETER
및
SENSOR_TYPE_GYROSCOPE
)은 세 축이 모두 지원된다고 가정합니다. 하지만 모든 폼 팩터와 기기에서 3축 가속도계와 3축 자이로스코프를 지원하는 것은 아닙니다.
가속도계 제한된 축
기본 실제 센서: 가속도계
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES)
가 non-wake-up 센서를 반환함
가속도계 제한된 축 센서는 TYPE_ACCELEROMETER
와 같지만 한 축이나 두 축이 지원되지 않는 사용 사례를 지원합니다.
센서에 의해 보고된 마지막 세 개의 센서 이벤트 값은 x, y, z축의 가속 값이 지원되는지를 나타냅니다. 값 1.0
은 축이 지원됨을, 값 0
은 지원되지 않음을 나타냅니다. 기기 제조업체는 빌드 시 지원되는 축을 식별하며 런타임 중에는 값이 변경되지 않습니다.
기기 제조업체는 미사용 축의 가속 값을 정의되지 않은 값이 아닌 0
으로 설정해야 합니다.
자이로스코프 제한된 축
기본 실제 센서: 자이로스코프
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES)
가 non-wake-up 센서를 반환함
자이로스코프 제한된 축 센서는 TYPE_GYROSCOPE
와 같지만 한 축이나 두 축이 지원되지 않는 사용 사례를 지원합니다.
센서에 의해 보고된 마지막 세 개의 센서 이벤트 값은 x, y, z축의 각속도 값이 지원되는지를 나타냅니다. 값 1.0
은 축이 지원됨을, 값 0
은 지원되지 않음을 나타냅니다. 기기 제조업체는 빌드 시 지원되는 축을 식별하며 런타임 중에는 값이 변경되지 않습니다.
기기 제조업체는 미사용 축의 각속도 값을 0
으로 설정해야 합니다.
가속도계 제한된 축 무보정
기본 실제 센서: 가속도계
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED)
가 non-wake-up 센서를 반환함
가속도계 제한된 축 무보정 센서는 TYPE_ACCELEROMETER_UNCALIBRATED
와 같지만 한 축이나 두 축이 지원되지 않는 사용 사례를 지원합니다.
센서에 의해 보고된 마지막 세 개의 센서 이벤트 값은 x, y, z축의 가속 및 편향 값이 지원되는지를 나타냅니다. 값 1.0
은 축이 지원됨을, 값 0
은 지원되지 않음을 나타냅니다. 기기 제조업체는 빌드 시 지원되는 축을 식별하며 런타임 중에는 값이 변경되지 않습니다.
기기 제조업체는 미사용 축의 가속 및 편향 값을 0
으로 설정해야 합니다.
자이로스코프 제한된 축 무보정
기본 실제 센서: 자이로스코프
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED)
가 non-wake-up 센서를 반환함
자이로스코프 제한된 축 무보정 센서는 TYPE_GYROSCOPE_UNCALIBRATED
와 같지만 한 축이나 두 축이 지원되지 않는 사용 사례를 지원합니다.
센서에 의해 보고된 마지막 세 개의 센서 이벤트 값은 x, y, z축의 각속도 및 드리프트 값이 지원되는지를 나타냅니다. 값 1.0
은 축이 지원됨을, 값 0
은 지원되지 않음을 나타냅니다. 기기 제조업체는 빌드 시 지원되는 축을 식별하며 런타임 중에는 값이 변경되지 않습니다.
기기 제조업체는 미사용 축의 각속도 및 드리프트 값을 0
으로 설정해야 합니다.
복합 제한된 축 IMU
기본 실제 센서: 3축 가속도계, 3축 자이로스코프, 3축 가속도계 무보정 , 3축 자이로스코프 무보정 센서의 모든 조합
보고 모드: 연속
복합 제한된 축 IMU 센서는 제한된 축 IMU 센서와 같지만, HAL에서 지원되는 대신 3축 센서 데이터를 이에 상응하는 제한된 축 변형으로 변환합니다. 이러한 복합 센서는 자동차 기기에서만 사용할 수 있습니다.
다음 표는 표준 3축 가속도계에서 복합 제한된 축 가속도계로의 변환 예를 보여줍니다.
SENSOR_TYPE_ACCELEROMETER의 SensorEvent 값 | SENSOR_TYPE_ACCELEROMETER SensorEvent 예시 | 복합 SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES SensorEvent |
---|---|---|
values[0] | -0.065 |
-0.065 |
values[1] | 0.078 |
0.078 |
values[2] | 9.808 |
9.808 |
values[3] | N/A |
1.0 |
values[4] | N/A |
1.0 |
values[5] | N/A |
1.0 |
자동차 센서
자동차 사용 사례를 지원하는 센서
방향
기본 실제 센서: GPS, 자기계, 가속도계, 자이로스코프의 모든 조합
보고 모드: 연속
getDefaultSensor(SENSOR_TYPE_HEADING)
가 non-wake-up 센서를 반환함
Android 13에서 사용할 수 있는 방향 센서는 진북을 기준으로 기기가 가리키는 방향을 도 단위로 측정합니다. 방향 센서에는 2개의 SensorEvent
값이 포함됩니다.
하나는 측정된 기기 방향을, 다른 하나는 제공된 방향 값의 정확도를 의미합니다.
이 센서에서 보고한 방향 값은 0.0
(포함)과 360.0
(제외) 사이여야 합니다. 0
은 북쪽, 90
은 동쪽, 180
은 남쪽, 270
은 서쪽을 나타냅니다.
이 센서의 정확도는 신뢰도 68%로 정의됩니다. 기본 분포가 가우시안 정규 분포인 경우 정확도는 표준 편차 중 하나입니다. 예를 들어 방향 센서가 방향 값 60도와 정확도 값 10도를 반환하는 경우 실제 방향이 50도에서 70도 사이일 확률은 68%입니다.