大家都知道无人驾驶在Google、特斯拉等公司的推动下发展得如火如荼,但大家对实现无人驾驶所必需很多关键技术却并不了解。到2050年,世界70%的人口都将生活在城市中,交通和交通工具的创新发展将会是翻天覆地,汽车将会逐步的从简单自动泊车到完全无人驾驶的彻底革新。而对于汽车操作系统之争更加是核心中的核心,为此Google的Android Auto计划适时推出汽车专用Android N操作系统必将是一个划时代的作品。
与此同时,Qualcomm和Google的战略合作从手机系统扩展到了汽车领域,已经开始推行多项汽车解决方案,骁龙820A车载原型系统无疑是其中最耀眼的明星。820A将是为Android N量身定制的高集成度的处理器芯片, 820A系统以汽车为中心应用,将直接于汽车主机执行,能让车厂开发除了提供常见的多媒体、导航与讯息功能之外,也可控制汽车空调、AM/FM收音机、连结性以及其他功能的车用资通讯娱乐系统(In-Vehicle Infotainment,IVI)。将使汽车发挥更加强大的功能,让我们新一代的汽车拥有一颗强大的”芯”而变得更加安全高效。
车载系统N.Car框架
骁龙820A采用的系统平台是Android,由于许多汽车子系统通过各种总线拓扑互相互连和车载信息娱乐(IVI)系统。确切的总线类型和协议在制造商之间有很大差异;示例包括控制器局域网(CAN)总线,本地互连网络(LIN)总线,面向媒体的系统传输(MOST)以及诸如BroadR-Reach的汽车级以太网和TCP / IP网络。Android为了适配车载系统,开发了完整的一套有关汽车控制的流程来控制整体运行。
如上图所示,通过标准化car api,使得不同厂商的应用都可以稳定的运行在Android系统上。
高度抽象的应用接口Car API
API 是一些预先定义的函数,目的是提供应用程序与开发人员访问某种例程的能力,Car API 包括CarHvacManager, CarSensorManager, 和CarCameraManager。
HVAC是热系统相关控制包括,热系统(heating), 通风系统(ventilation) 和空调(air conditioning) 等相关功能。例如除霜,驱动轮温度的控制检测等等。
public @interface HvacPropertyId {
int MIRROR_DEFROSTER_ON = 0x0001;
int STEERING_WHEEL_TEMP = 0x0002;
Sensor是各种传感器功能,如门窗、座椅,刹车等。例如车速传感器,转速(RPM),里程(ODOMETER),燃油计(FUEL_LEVEL),制动(PARKING_BRAKE)等等。
public class CarSensorManager implements CarManagerBase {
public static final int SENSOR_TYPE_CAR_SPEED = 2;
public static final int SENSOR_TYPE_RPM = 3;
public static final int SENSOR_TYPE_ODOMETER = 4;
Camera是车载Camera的打开、关闭功能。着项功能其实是例如360全景监控车况、倒车影像,甚至路况信息采集的基础。即通常所说的计算视觉,有了这些camera视频数据,那么车载820A的强大功能就可以处理分析这些视频数据,识别出道路上的行人、车辆、交通指示牌等等,从而使得汽车具备一定的智能。
具体的实现方法位于 /platform/packages/services/Car/car-lib。
Car api 提供给车载开发人员各种接口,方便车载系统搭在各种应用。
例如:抽象的汽车座椅的属性,驾驶员和乘客,将会对每个座椅状态进行监控。
public class VehicleSeat {
public static final int SEAT_DRIVER_LHD = 0x0001;
public static final int SEAT_DRIVER_RHD = 0x0002;
public static final int SEAT_ROW_1_PASSENGER_LEFT = 0x0010;
public static final int SEAT_ROW_1_PASSENGER_CENTER = 0x0020;
public static final int SEAT_ROW_1_PASSENGER_RIGHT = 0x0040;
public static final int SEAT_ROW_2_PASSENGER_LEFT = 0x0100;
public static final int SEAT_ROW_2_PASSENGER_CENTER = 0x0200;
public static final int SEAT_ROW_2_PASSENGER_RIGHT = 0x0400;
public static final int SEAT_ROW_3_PASSENGER_LEFT = 0x1000;
public static final int SEAT_ROW_3_PASSENGER_CENTER = 0x2000;
public static final int SEAT_ROW_3_PASSENGER_RIGHT = 0x4000;
}
车窗的状态监控。
public class VehicleWindow {
public static final int WINDOW_FRONT_WINDSHIELD = 0x0001;
public static final int WINDOW_REAR_WINDSHIELD = 0x0002;
public static final int WINDOW_ROOF_TOP = 0x0004;
public static final int WINDOW_ROW_1_LEFT = 0x0010;
public static final int WINDOW_ROW_1_RIGHT = 0x0020;
public static final int WINDOW_ROW_2_LEFT = 0x0100;
public static final int WINDOW_ROW_2_RIGHT = 0x0200;
public static final int WINDOW_ROW_3_LEFT = 0x1000;
public static final int WINDOW_ROW_3_RIGHT = 0x2000;
}
不同汽车区域的监控,针对不同区域有不同的权限。
public class VehicleZone {
public static final int ZONE_ROW_1_LEFT = 0x00000001;
public static final int ZONE_ROW_1_CENTER = 0x00000002;
public static final int ZONE_ROW_1_RIGHT = 0x00000004;
public static final int ZONE_ROW_1_ALL = 0x00000008;
public static final int ZONE_ROW_2_LEFT = 0x00000010;
public static final int ZONE_ROW_2_CENTER = 0x00000020;
public static final int ZONE_ROW_2_RIGHT = 0x00000040;
public static final int ZONE_ROW_2_ALL = 0x00000080;
public static final int ZONE_ROW_3_LEFT = 0x00000100;
public static final int ZONE_ROW_3_CENTER = 0x00000200;
public static final int ZONE_ROW_3_RIGHT = 0x00000400;
public static final int ZONE_ROW_3_ALL = 0x00000800;
public static final int ZONE_ROW_4_LEFT = 0x00001000;
public static final int ZONE_ROW_4_CENTER = 0x00002000;
public static final int ZONE_ROW_4_RIGHT = 0x00004000;
public static final int ZONE_ROW_4_ALL = 0x00008000;
public static final int ZONE_ALL = 0x80000000;
}
由于接口过多,就不一一列出了。
CarService核心组件
CarService位于/platfrom/packages/services/Car,具体可以分为一下几个功能:
所有服务最终通过VehicleNetworkService访问HAL层
Vehicel hal 控制内置安全,只有系统组建可以使用,其他的组建类似于第三方应用只能通过car api访问。Oems通过/system/etc/vns/目录下的vns_policy.xml 和vendor_vns_policy.xml来控制对时间、燃油计、里程计、车速等的访问控制,具体的实现方式在/platform/packages/services/Car/ libvehiclenetwork/目录中。和传统的Android设计一样,通过client/server机制实现的。
汽车硬件抽象层HAL Vehicle
Android汽车硬件抽象层(HAL)为Android框架提供了一致的界面,无论物理传输层如何。该车HAL是开发Android Automotive实现的界面。
系统集成商可以通过将特定于功能的平台HAL接口(例如HVAC)与特定于技术的网络接口(例如CAN总线)连接来实现车辆HAL模块。典型的实现可以包括运行用于CAN总线访问或类似的专用实时操作系统(RTOS)的专用微控制器单元(MCU),其可以经由串行链路连接到运行Android Automotive的CPU。代替专用MCU,也可以将总线访问实现为虚拟化CPU。
Vehicle HAL中定义车辆属性的接口,包含元数据(例如车辆是否可以是int型,或者模式是否可以切换等等)。这写东西的定义位于hardware/libhardware /include/hardware/vehicle.h,然后具体实现是在hardware/libhardware/ modules/vehicle/。和所有Android上HAL一样,只有调用open()成功后,client才可以使用hw_device_t 运行其他的Vehicle HAL设备的功能.
static struct hw_module_methods_t hal_module_methods = {
.open = vdev_open,
};
vehicle_module_t HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = VEHICLE_MODULE_API_VERSION_1_0,
.hal_api_version = HARDWARE_HAL_API_VERSION,
.id = VEHICLE_HARDWARE_MODULE_ID,
.name = "Default vehicle HW HAL",
.author = "",
.methods = &hal_module_methods,
},
};
static int vdev_open(const hw_module_t* module, const char* name UNUSED,
hw_device_t** device) {
ALOGD("vdev_open");
// Oops, out of memory!
vehicle_device_impl_t* vdev = calloc(1, sizeof(vehicle_device_impl_t));
if (vdev == NULL) {
return -ENOMEM;
}
// Common functions provided by harware.h
vdev->vehicle_device.common.tag = HARDWARE_DEVICE_TAG;
vdev->vehicle_device.common.version = VEHICLE_DEVICE_API_VERSION_1_0;
vdev->vehicle_device.common.module = (hw_module_t *) module;
vdev->vehicle_device.common.close = vdev_close;
// Define the Vehicle HAL device specific functions.
vdev->vehicle_device.list_properties = vdev_list_properties;
vdev->vehicle_device.init = vdev_init;
vdev->vehicle_device.release = vdev_release;
vdev->vehicle_device.get = vdev_get;
vdev->vehicle_device.release_memory_from_get = vdev_release_memory_from_get;
vdev->vehicle_device.set = vdev_set;
vdev->vehicle_device.subscribe = vdev_subscribe;
vdev->vehicle_device.unsubscribe = vdev_unsubscribe;
vdev->vehicle_device.dump = vdev_dump;
*device = (hw_device_t *) vdev;
return 0;
}
安全Security
安全分为三个等级,第一个等级是system only,通过vns_policy.xml控制。第二个等级是通过app控制权限,具体实现机制在car services中,第三个等级是不需要权限,同样,实现机制也是在car services中。
测试工具
对于开发调试,特别是早期测试,必要的工具可以大大提高效率。
hardware/libhardware/tests/vehicle/vehicle—hal—tool.c这个工具可以验证系统是否起来,它也可以运行一些早期的程序。
packages/services/Car/tests/carservice_test/,这个目录包含了一些汽车服务测试,对于每个属性,测试中都会实现预期的行为。这可以是了解预期行为的良好起点。
本片小编总结的一些骁龙820A车载系统的代码分布情况,希望在大家阅读学习的时候有帮助。具体的细节体现在该系列的后续篇章中。
Qualcomm汽车技术讨论组 QQ群号:566131670