Android System & AOSP Engineering/Android Automotive

Android VHAL(Vehicle HAL) 실무: VehiclePropValue 구조체 분석 및 속도·HVAC 데이터 바인딩

임베디드 친구 2026. 8. 18. 21:25
반응형

1. Android Automotive VHAL(Vehicle HAL) 및 VehiclePropValue 데이터 바인딩 도입 배경

차량용 안드로이드 OS(Android Automotive OS, AAOS) 개발 시 차량의 하드웨어 센서 데이터(속도, RPM, HVAC 온도 등)를 안드로이드 애플리케이션 프레임워크와 연결하는 계층이 Vehicle HAL(VHAL)입니다.실제 차량 하드웨어(CAN Bus, LIN Bus 등) 및 MCU(Microcontroller Unit)와 통신이 불가능한 에뮬레이터(Emulator) 개발 환경에서는 VHAL 계층에서 가상 센서 데이터를 생성하고 바인딩하는 구조를 정확히 이해해야 합니다. 본 포스팅에서는 VehiclePropValue 구조체의 메모리 layout과 속도(PERF_VEHICLE_SPEED) 및 공조 시스템(HVAC_TEMPERATURE_SET) 프로퍼티 바인딩 방식을 상세히 분석합니다.

2. Android VHAL VehiclePropValue 데이터 바인딩 핵심 요약

  • VehiclePropValue 구조체 분석: VHAL은 prop(Property ID), areaId(Zone ID), value(Data union) 필드를 포함하는 VehiclePropValue 구조체를 사용하여 차량 데이터를 전달합니다.

  • 속도 및 공조(HVAC) 프로퍼티 ID: 차량 속도 수집에는 PERF_VEHICLE_SPEED (0x11600207, float)를, 구역별 공조 제어에는 HVAC_TEMPERATURE_SET (0x15400503, float) 프로퍼티를 사용합니다.

  • 에뮬레이터 테스트 명령어: ADB shell 명령어를 실행하여 가상 센서 이벤트를 주입할 수 있습니다.

    adb shell dumpsys car_service inject-vhal-prop <PROPERTY_ID> <AREA_ID> <VALUE>

3. VehiclePropValue 구조체 분석 및 속도·HVAC 데이터 바인딩 구현

3.1. VehiclePropValue 구조체 메모리 레이아웃 분석

Android AOSP VHAL 인터페이스(HIDL/AIDL)에서 모든 차량 데이터는 VehiclePropValue 구조체를 통해 전송됩니다. 해당 구조체는 프로퍼티 종류, 차량 내 구역, 데이터 타입, 타임스탬프 정보를 포함합니다.

// hardware/interfaces/automotive/vehicle/2.0/types.hal
struct VehiclePropValue {
    int32_t prop;          // Vehicle Property Identifier (e.g., PERF_VEHICLE_SPEED)
    int64_t timestamp;     // Timestamp in nanoseconds (System clock)
    int32_t areaId;        // Vehicle area ID (e.g., WINDOW_FRONT_WINDSHIELD, SEAT_ROW_1_LEFT)
    VehiclePropertyStatus status; // Property status (AVAILABLE, UNAVAILABLE, ERROR)

    // Value container union/struct
    struct RawValue {
        vec<int32_t> int32Values;
        vec<int64_t> int64Values;
        vec<float> floatValues;
        vec<uint8_t> bytes;
        string stringValue;
    } value;
};

3.2. PERF_VEHICLE_SPEED 및 HVAC 프로퍼티 사양 비교

차량 속도 프로퍼티와 HVAC 온도 설정 프로퍼티는 데이터 타입과 areaId 설정 방식에서 차이가 있습니다.

프로퍼티 항목 (Property Name) Property ID (Hex) Change Mode Access Mode Data Type Area ID 사용 여부
PERF_VEHICLE_SPEED 0x11600207 (291504647) CONTINUOUS READ floatValues[0] (m/s Global (0)
HVAC_TEMPERATURE_SET 0x15400503 (356517123) ON_CHANGE READ_WRITE floatValues[0] (°C) Zone Specific (VehicleAreaSeat)

3.3. VHAL C++ C++ 데이터 바인딩 소스코드 구현

다음 코드는 VHAL stub 또는 Mock 하드웨어 레이어에서 차량 속도 및 HVAC 온도 데이터를 바인딩하여 생성하는 C++ 구현입니다.

#include <android/hardware/automotive/vehicle/2.0/IVehicle.h>
#include <vhal_v2_0/VehicleUtils.h>

using namespace android::hardware::automotive::vehicle::V2_0;

// Function to generate vehicle speed VehiclePropValue
VehiclePropValue createSpeedPropValue(float speedInMetersPerSecond) {
    VehiclePropValue propValue;
    propValue.prop = static_cast<int32_t>(VehicleProperty::PERF_VEHICLE_SPEED);
    propValue.areaId = 0; // Global property (No specific area)
    propValue.timestamp = elapsedRealtimeNano();
    propValue.status = VehiclePropertyStatus::AVAILABLE;

    // Set float payload
    propValue.value.floatValues.resize(1);
    propValue.value.floatValues[0] = speedInMetersPerSecond;

    return propValue;
}

// Function to generate HVAC temperature VehiclePropValue
VehiclePropValue createHvacTempPropValue(int32_t zoneAreaId, float temperatureCelsius) {
    VehiclePropValue propValue;
    propValue.prop = static_cast<int32_t>(VehicleProperty::HVAC_TEMPERATURE_SET);
    propValue.areaId = zoneAreaId; // e.g., VehicleAreaSeat::ROW_1_LEFT
    propValue.timestamp = elapsedRealtimeNano();
    propValue.status = VehiclePropertyStatus::AVAILABLE;

    // Set float payload
    propValue.value.floatValues.resize(1);
    propValue.value.floatValues[0] = temperatureCelsius;

    return propValue;
}

4. Android Emulator 환경에서 ADB 커맨드를 활용한 VHAL 센서 디버깅 팁

차량 실차가 없는 에뮬레이터 환경에서는 dumpsys car_service CLI 도구를 통해 VHAL 프로퍼티 주입(Injection) 및 데이터 흐름을 모니터링할 수 있습니다.

4.1. 가상 속도 데이터 주입 (Speed Injection)

속도 데이터 단위는 m/s 단위입니다. 60km/h는 약 16.66m/s입니다.

# Inject Vehicle Speed: 16.66 m/s (approx. 60 km/h)
adb shell dumpsys car_service inject-vhal-prop 0x11600207 0 16.66

4.2. HVAC 운전석 온도 설정 주입 (HVAC Temp Injection)

운전석(ROW_1_LEFT = 0x1) 구역에 온도 설정값 22.5°C를 주입하는 명령입니다.

# Inject HVAC Temp: Area ID 1 (ROW_1_LEFT), Value 22.5 C
adb shell dumpsys car_service inject-vhal-prop 0x15400503 1 22.5

4.3. CarService 수신 상태 검증

# Print current VehicleProperty states in CarService
adb shell dumpsys car_service --vhal

5. VHAL 구현 시 개발자가 흔히 하는 실수 및 해결 방법

5.1. 단위 변환 오류 (km/h vs m/s)

  • 문제 발생: PERF_VEHICLE_SPEED 속도 값을 km/h 단위로 바인딩하여 UI 계측기(Cluster)에 3.6배 높은 속도가 표시되는 현상이 발생합니다.
  • 해결 방법: Android VHAL Specification에 정의된 표준 단위를 준수해야 합니다. PERF_VEHICLE_SPEED 표준 단위는 m/s(Meters per second)입니다. Application 계층 표시 시 변환 로직(km/h = m/s * 3.6)을 적용해야 합니다.

5.2. HVAC 프로퍼티의 invalid areaId 설정 문제

  • 문제 발생: HVAC_TEMPERATURE_SET 데이터를 주입할 때 areaId를 0으로 설정하면 CarService에서 데이터가 유실되거나 예외가 발생합니다.
  • 해결 방법: HVAC 프로퍼티는 구역별(Zone) 독립 제어 프로퍼티입니다. types.hal에 정의된 VehicleAreaSeat bitmask(예: SEAT_ROW_1_LEFT = 1, SEAT_ROW_1_RIGHT = 4)에 맞춰 올바른 areaId 값을 바인딩해야 합니다.

5.3. timestamp 미설정으로 인한 Stale Data 처리

  • 문제 발생: VehiclePropValue 생성 시 timestamp 필드를 0으로 방치하면 CarPropertyManager 구독 시스템에서 최신 데이터로 인지하지 못합니다.
  • 해결 방법: 데이터 생성 시점의 나노초 단위를 elapsedRealtimeNano() 함수로 호출하여 timestamp 필드에 명시해야 합니다.

6. 결론

Android Automotive VHAL 개발에서 VehiclePropValue 구조체 분석과 올바른 단위/AreaId 바인딩은 안정적인 차량 데이터 수신의 핵심입니다. 속도(PERF_VEHICLE_SPEED) 데이터의 m/s 단위 준수, HVAC의 areaId 비트마스크 설정, ADB 커맨드를 활용한 주입 테스트를 통해 에뮬레이터 환경에서도 실차 연동 전 완벽한 VHAL 파이프라인 검증이 가능합니다.

반응형