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 파이프라인 검증이 가능합니다.