헤드 트래커 HID 프로토콜

Android 13 이상을 실행하는 장치에서 사용할 수 있는 HID(Head Tracker Human Interface Device) 프로토콜을 사용하면 USB 또는 Bluetooth를 통해 머리 추적 장치를 Android 장치에 연결하고 센서 를 통해 Android 프레임워크 및 앱에 노출할 수 있습니다. 뼈대. 이 프로토콜은 오디오 가상화 효과(3D 오디오)를 제어하는 ​​데 사용됩니다. 이 페이지에서는 장치호스트 라는 용어를 Bluetooth 의미에서 사용합니다. 여기서 장치 는 머리 추적 장치를 의미하고 호스트 는 Android 호스트를 의미합니다.

기기 제조업체는 헤드 트래커 HID 프로토콜을 지원하도록 Android 기기를 구성해야 합니다. 구성에 대한 자세한 내용은 Dynamic Sensors README 를 참조하십시오.

이 페이지에서는 다음 리소스를 잘 알고 있다고 가정합니다.

최상위 구조

Android 프레임워크는 헤드 트래커 장치를 HID 장치로 식별합니다.

유효한 HID 설명자의 전체 예는 부록 1: HID 설명자의 예를 참조하십시오.

최상위 수준에서 헤드 트래커 장치는 Sensors 페이지( 0x20 ) 및 Other: Custom 사용( 0xE1 )이 있는 앱 모음입니다. 이 컬렉션에는 여러 데이터 필드( 입력 )와 속성( 기능 )이 있습니다.

속성 및 데이터 필드

이 섹션에서는 헤드 트래커 장치의 애플리케이션 컬렉션에 있는 속성 및 데이터 필드에 대해 설명합니다.

속성: 센서 설명( 0x0308 )

센서 설명( 0x0308 ) 속성은 다음 값을 포함해야 하는 읽기 전용 ASCII(8비트) 문자열 속성입니다.

#AndroidHeadTracker#1.0

null 종결자가 필요하지 않습니다. 즉, 이 속성의 전체 크기는 23개의 8비트 문자입니다.

이 속성은 다른 사용자 지정 센서와의 충돌을 피하기 위한 판별자 역할을 합니다.

속성: 영구 고유 ID( 0x0302 )

영구 고유 ID( 0x0302 ) 속성은 각각 8비트(총 128비트)인 16개 요소의 읽기 전용 배열입니다. null 종결자가 필요하지 않습니다. 이 속성은 선택 사항입니다.

이 속성을 사용하면 오디오 장치에 통합된 머리 추적 장치가 연결된 오디오 장치를 참조할 수 있습니다. 다음 구성표가 지원됩니다.

독립형 헤드 트래커

Persistent Unique ID( 0x0302 ) 속성이 존재하지 않거나 모두 0으로 설정된 경우 헤드 트래커 장치가 오디오 장치에 영구적으로 연결되지 않고 별도로 사용할 수 있음을 의미합니다. 예를 들어 사용자가 수동으로 헤드 트래커 장치를 별도의 오디오 장치와 연결합니다.

블루투스 MAC 주소를 이용한 참조

팔중주 0 1 2 4 5 6 7 8 9 10 11 12 13 14 15
0 0 0 0 0 0 0 0 블루투스 맥

B 에서 T 0 장치가 이 MAC 주소.

UUID를 사용한 참조

옥텟 8의 최상위 비트(MSB)가 설정될 때마다( ≥0x80 ), RFC-4122 에 지정된 대로 필드가 UUID로 해석됩니다. 해당 오디오 장치는 Android 프레임워크에 등록된 동일한 UUID를 사용된 전송 유형에 고유한 지정되지 않은 메커니즘을 통해 제공합니다.

속성: 보고 상태( 0x0316 )

보고 상태( 0x0316 ) 속성은 HID 사양에 정의된 표준 의미를 갖는 읽기/쓰기 속성입니다. 호스트는 이 속성을 사용하여 보고할 이벤트를 장치에 표시합니다. 이벤트 없음( 0x0840 ) 및 모든 이벤트( 0x0841 ) 값만 사용됩니다.

이 필드의 초기 값은 이벤트 없음이어야 하며 장치가 수정하지 않아야 하며 호스트만 수정할 수 있습니다.

속성: 전원 상태( 0x0319 )

전원 상태( 0x0319 ) 속성은 HID 사양에 정의된 표준 의미를 갖는 읽기/쓰기 속성입니다. 호스트는 이 속성을 사용하여 장치가 어떤 전원 상태에 있어야 하는지를 장치에 표시합니다. Full Power( 0x0851 ) 및 Power Off( 0x0855 ) 값만 사용됩니다.

이 필드의 초기 값은 장치에 의해 결정되며 장치가 수정해서는 안 되며 호스트만 수정할 수 있습니다.

속성: 보고서 간격( 0x030E )

보고서 간격( 0x030E ) 속성은 HID 사양에 정의된 표준 의미를 갖는 읽기/쓰기 속성입니다. 호스트는 이 속성을 사용하여 데이터 판독값을 보고하는 빈도를 장치에 표시합니다. 단위는 초입니다. 이 값의 유효한 범위는 장치에 의해 결정되며 물리적 최소/최대 메커니즘을 사용하여 설명됩니다. 최소 50Hz 보고 속도가 지원되어야 하며 권장되는 최대 보고 속도는 100Hz입니다. 따라서 최소 보고 간격은 20ms 이하여야 하며 10ms 이상을 권장합니다.

데이터 필드: 사용자 정의 값 1( 0x0544 )

Custom Value 1( 0x0544 ) 필드는 실제 헤드 트래킹 정보를 보고하기 위한 입력 필드이다. HID 사양의 섹션 6.2.2.7에 지정된 물리적 값에 대한 일반 HID 규칙에 따라 해석되는 3요소 배열입니다. 각 요소의 유효한 범위는 [-π, π] rad입니다. 단위는 항상 라디안입니다.

요소는 [rx, ry, rz] [rx, ry, rz] 가 참조 프레임에서 헤드 프레임으로의 변환을 나타내는 회전 벡터 입니다. 크기는 [0..π] 범위에 있어야 합니다.

기준 프레임은 임의적이지만 일반적으로 고정되어 있으며 오른손잡이여야 합니다. 약간의 드리프트는 허용됩니다. 머리 축은 다음과 같습니다.

  • 왼쪽 귀에서 오른쪽으로 X
  • Y 머리 뒤에서 코까지(뒤에서 앞으로)
  • Z 목에서 머리 꼭대기까지

데이터 필드: 사용자 정의 값 2( 0x0545 )

Custom Value 2( 0x0545 ) 필드는 실제 헤드 트래킹 정보를 보고하기 위한 입력 필드이다. 물리적 값에 대한 일반적인 HID 규칙에 따라 해석되는 3요소 고정 소수점 배열입니다. 단위는 항상 라디안/초입니다.

요소는 [vx, vy, vz] [vx, vy, vz] 가 헤드 프레임의 각속도(자체에 상대적)를 나타내는 회전 벡터 입니다.

데이터 필드: 사용자 정의 값 3( 0x0546 )

사용자 정의 값 3( 0x0546 ) 필드는 참조 프레임의 불연속성을 추적하는 데 사용되는 입력 필드입니다. 크기가 8비트인 정수 스칼라입니다. 예를 들어 방향을 결정하는 데 사용되는 방향 필터 알고리즘에 상태가 재설정된 경우와 같이 기준 프레임이 변경될 때마다 장치에 의해 (랩어라운드와 함께) 증가되어야 합니다. 이 값은 물리적 값에 대한 일반 HID 규칙에 따라 해석됩니다. 그러나 물리적 가치와 단위는 중요하지 않습니다. 호스트와 관련된 유일한 정보는 변경된 값입니다. 논리적 단위에서 물리적 단위로 변환하는 동안 정밀도 손실과 관련된 숫자 문제를 방지하려면 이 필드에 대해 물리적 최소값, 물리적 최대값 및 단위 지수 값을 0으로 설정하는 것이 좋습니다.

보고서 구조

보고서 ID를 할당하여 속성을 보고서로 그룹화하는 것은 유연합니다. 효율성을 위해 읽기/쓰기 속성에서 읽기 전용 속성을 분리하는 것이 좋습니다.

데이터 필드의 경우 사용자 정의 값 1, 2 및 3 필드는 동일한 보고서에 있어야 하며 지정된 장치(앱 컬렉션)에 대한 하나의 보고서에만 있어야 합니다.

입력 보고서 보내기

장치는 아래의 모든 조건이 충족될 때 주기적으로 비동기적으로(HID INPUT 메시지를 통해) 입력 보고서를 보내야 합니다.

  • 전원 상태 속성은 최대 전원으로 설정됩니다.
  • 보고 상태 속성은 모든 이벤트로 설정됩니다.
  • 보고 간격 속성이 0이 아닙니다.

보고 간격 속성은 보고서를 보내는 빈도를 결정합니다. 위의 조건 중 하나라도 충족되지 않으면 장치는 보고서를 보내지 않아야 합니다.

순방향 및 역방향 호환성

헤드 트래커 HID 프로토콜은 업데이트를 허용하는 버전 관리 체계를 사용하는 동시에 다른 버전의 프로토콜을 사용하는 호스트와 장치 간의 상호 운용성을 허용합니다. 프로토콜 버전은 다음 섹션에 설명된 대로 고유한 의미를 갖는 두 개의 숫자(주요 및 부수)로 식별됩니다.

장치에서 지원하는 버전은 해당 센서 설명( 0x0308 ) 속성을 검사하여 확인할 수 있습니다.

마이너 버전 호환성

부 버전에 대한 변경 사항은 동일한 주 버전을 기반으로 하는 이전 부 버전과 역호환됩니다. 부 버전에 대한 업데이트에서 호스트는 추가 데이터 필드 및 속성을 무시합니다. 예를 들어, 프로토콜 버전 1.6을 사용하는 장치는 버전 1.5를 포함하여 프로토콜 버전 1.x를 지원하는 호스트와 호환됩니다.

메이저 버전 호환성

이전 버전과 호환되지 않는 변경은 주요 버전에 대한 변경이 허용됩니다. 이전 호스트 및 새 호스트와의 상호 운용성을 위해 여러 주요 버전을 지원하기 위해 장치는 보고서 설명자에서 여러 앱 컬렉션을 지정할 수 있습니다. 예를 들어:

const unsigned char ReportDescriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM,

    HID_COLLECTION(HID_APPLICATION),
        // Feature report 2 (read-only).
        HID_REPORT_ID(2),

        // Magic value: "#AndroidHeadTracker#1.5"
        HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(0xFF),
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(23),
        HID_FEATURE(HID_CONST_VAR_ABS),

      ...

    HID_END_COLLECTION,

    HID_COLLECTION(HID_APPLICATION),
        // Feature report 12 (read-only).
        HID_REPORT_ID(12),

        // Magic value: "#AndroidHeadTracker#2.4"
        HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(0xFF),
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(23),
        HID_FEATURE(HID_CONST_VAR_ABS),

      ...

    HID_END_COLLECTION,
};

이 경우 호스트는 장치에서 광고하는 모든 다른 앱 컬렉션을 열거하고 센서 설명 속성을 검사하여 각각 구현하는 프로토콜 버전을 확인한 다음 호스트가 지원하는 최신 프로토콜 버전을 선택할 수 있습니다. 선택하면 호스트는 장치 연결 수명 동안 선택된 단일 프로토콜로 작동합니다.

부록 1: HID 설명자의 예

다음 예는 일반적인 유효한 HID 설명자를 보여줍니다. HID 센서 사용(섹션 4.1)에서 제공하는 일반적으로 사용되는 C 매크로를 사용합니다.

const unsigned char ReportDescriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM,
    HID_COLLECTION(HID_APPLICATION),
        // Feature report 2 (read-only).
        HID_REPORT_ID(2),

        // Magic value: "#AndroidHeadTracker#1.0"
        HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(0xFF),
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(23),
        HID_FEATURE(HID_CONST_VAR_ABS),

        // UUID.
        HID_USAGE_SENSOR_PROPERTY_PERSISTENT_UNIQUE_ID,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(0xFF),
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(16),
        HID_FEATURE(HID_CONST_VAR_ABS),

        // Feature report 1 (read/write).
        HID_REPORT_ID(1),

        // 1-bit on/off reporting state.
        HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(1),
        HID_REPORT_SIZE(1),
        HID_REPORT_COUNT(1),
        HID_COLLECTION(HID_LOGICAL),
            HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS,
            HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS,
            HID_FEATURE(HID_DATA_ARR_ABS),
        HID_END_COLLECTION,

        // 1-bit on/off power state.
        HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(1),
        HID_REPORT_SIZE(1),
        HID_REPORT_COUNT(1),
        HID_COLLECTION(HID_LOGICAL),
            HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF,
            HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER,
            HID_FEATURE(HID_DATA_ARR_ABS),
        HID_END_COLLECTION,

        // 6-bit reporting interval, with values [0x00..0x3F] corresponding to [10ms..100ms].
        HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
        HID_LOGICAL_MIN_8(0x00),
        HID_LOGICAL_MAX_8(0x3F),
        HID_PHYSICAL_MIN_8(10),
        HID_PHYSICAL_MAX_8(100),
        HID_REPORT_SIZE(6),
        HID_REPORT_COUNT(1),
        HID_USAGE_SENSOR_UNITS_SECOND,
        HID_UNIT_EXPONENT(0xD),  // 10^-3
        HID_FEATURE(HID_DATA_VAR_ABS),

        // Input report 1

        // Orientation as rotation vector (scaled to [-pi..pi] rad).
        HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
        HID_LOGICAL_MIN_16(0x01, 0x80), // LOGICAL_MINIMUM (-32767)
        HID_LOGICAL_MAX_16(0xFF, 0x7F), // LOGICAL_MAXIMUM (32767)
        HID_PHYSICAL_MIN_32(0x60, 0x4F, 0x46, 0xED),  // -314159265
        HID_PHYSICAL_MAX_32(0xA1, 0xB0, 0xB9, 0x12),  // 314159265
        HID_UNIT_EXPONENT(0x08),  // 10^-8
        HID_REPORT_SIZE(16),
        HID_REPORT_COUNT(3),
        HID_INPUT(HID_DATA_VAR_ABS),

        // Angular velocity as rotation vector (scaled to [-32..32] rad/sec).
        HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2,
        HID_LOGICAL_MIN_16(0x01, 0x80), // LOGICAL_MINIMUM (-32767)
        HID_LOGICAL_MAX_16(0xFF, 0x7F), // LOGICAL_MAXIMUM (32767)
        HID_PHYSICAL_MIN_8(0xE0),
        HID_PHYSICAL_MAX_8(0x20),
        HID_UNIT_EXPONENT(0x00),  // 10^0
        HID_REPORT_SIZE(16),
        HID_REPORT_COUNT(3),
        HID_INPUT(HID_DATA_VAR_ABS),

        // Reference frame reset counter.
        HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3,
        HID_LOGICAL_MIN_16(0x00, 0x00), // LOGICAL_MINIMUM (0)
        HID_LOGICAL_MAX_16(0xFF, 0x00), // LOGICAL_MAXIMUM (255)
        HID_PHYSICAL_MIN_8(0x00),
        HID_PHYSICAL_MAX_8(0x00),
        HID_UNIT_EXPONENT(0x00),  // 10^0
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(1),
        HID_INPUT(HID_DATA_VAR_ABS),

    HID_END_COLLECTION,
};