Android 源码分析 - 传感器 - Native层

本文详细介绍了Android系统中的libgui库及其在传感器服务中的作用,包括Sensor、SensorEventQueue、SensorManager等核心类。同时,深入解析了sensorservice服务的实现,如SensorDevice、SensorInterface和SensorService。SensorService如何管理传感器连接,以及如何通过内部线程处理传感器事件。此外,还探讨了SensorFusion的概念,包括GravitySensor、LinearAccelerationSensor、RotationVectorSensor和OrientationSensor的模拟实现,展示了如何通过融合多个传感器数据来计算复杂的运动状态。
部署运行你感兴趣的模型镜像

libgui

        源代码位于:frameworks/native/libs/gui。

        头文件位于:frameworks/native/include/gui。

        在显示部分涉及到libgui,其中与传感器相关的功能之前没有提及,主要涉及以下几个类:

 

        Sensor描述一个传感器设备。

        ISensorServer定义传感器服务接口。

        ISensorEventConnection定义与ISensorServer的连接,传感器事件通过BitTube传递。

        SensorEventQueue封装ISensorEventConnection,从BitTube读取事件。

        SensorManager封装ISensorServer,ISensorServer由Binder服务“sensorservice”实现。

libsensorservice

        源代码位于:frameworks/native/services/sensorservice。

         SensorDevice封装HAL传感器模块,其嵌套类Info保存了各个用户对一个传感器设备设置的batch参数(BatchParams),实际设置到HAL层的参数是其中的最小值。用户disable设备实际就是删除Info中batchParams的一项。

        SensorInterface代表一个传感器,定义了对传感器设备的操作虚接口。HardwareSensor派生实现了SensorInterface接口,内部保存Sensor结构体(使用其句柄),通过SensorDevice的接口实现其功能。

        SensorService实现ISensorServer接口,管理Sensor列表,用户连接SensorEventConnection。

成员

类型

说明

mSensorList

Vector<Sensor>

所有传感器,包括虚拟传感器

mUserSensorList

Vector<Sensor>

用户可见的传感器,包括部分虚拟传感器

mSensorMap

DefaultKeyedVector<int, SensorInterface*>

所有传感器的实现对象

mVirtualSensorList

Vector<SensorInterface *>

所有虚拟传感器

mActiveSensors

DefaultKeyedVector<int, SensorRecord*>

活动的传感器,以传感器句柄为索引,与该传感器所有活动连接

mActiveVirtualSensors

DefaultKeyedVector<int, SensorInterface*>

活动的虚拟传感器

mActiveConnections

SortedVector< wp<SensorEventConnection> >

所有活动(至少active一个传感器)的连接

mLastEventSeen

KeyedVector<int32_t, sensors_event_t>

以传感器句柄为索引,其最后一个事件

        SensorService继承Thread,通过内部线程调用SensorDevice的poll方法。

        SensorService保存每个传感器的最后一个事件,当有新的连接使用没有传感器,并且该传感器不属于连续事件类型时,将立即发送最后一个事件。

        SensorService::SensorEventConnection实现ISensorEventConnection接口,保存用户UID,维护一个BitTube管道,用于发送传感器事件给用户。

         Fusion使用角速度、加速度、磁场计算旋转矩阵。

        SensorFusion使用Fusion计算旋转矩阵,需要角速度传感器(陀螺仪,GYROSCOPE)、加速度传感器(ACCELEROMETER)、磁场传感器(MAGNETIC_FIELD)。SensorFusion使用mClients保存用户列表,在需要时激活。

        GravitySensor模拟重力加速度传感器。通过旋转矩阵的z列(第3列)乘以地球引力常量(GRAVITY_EARTH)计算。

        LinearAccelerationSensor模拟线加速度传感器。线加速度等于加速度减去重力加速度。

        RotationVectorSensor模拟旋转矢量传感器,旋转矢量即Fusion的Attribute。

        OrientationSensor模拟姿态传感器,通过旋转矩阵计算。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值