QPython 中文文档 下载 App

QSL4A 传感器访问——用 Python 读取加速度计、陀螺仪、GPS

Android 传感器分类

Android 设备上的传感器大致分为四类:

类别常见传感器用途
动作类加速度计、陀螺仪、重力计、旋转矢量检测设备的运动状态
位置类GPS、磁力计、方向传感器检测设备的位置和朝向
环境类光线、接近、温度、气压、湿度检测周围环境条件
医疗类心率传感器少数设备有

QSL4A 提供了统一的传感器读取接口,让你用相同的方式访问不同类型的传感器。

传感器的基本用法

启动传感器监听

droid.startSensingTimed(1, 1000)

第一个参数 1 是传感器类型(具体类型编号见下文),第二个 1000 是采样间隔(毫秒)。上面这行意思是:启用传感器类型 1(加速度计),每 1000 毫秒读一次。

读取传感器数据

启动监听后,传感器数据会被推送到事件队列里。有两种方式获取:

方式一:事件轮询

import time
while True:
    events = droid.sensorsGetEventBuffered().result
    if events:
        for event in events:
            print(event)  # event 包含时间戳、传感器类型、x/y/z 值
    time.sleep(1)

方式二:定时主动获取

某些 QSL4A 版本提供主动拉取的 API,比如 droid.sensorsGetAcceleration() 直接返回当前加速度值。具体以实际版本为准。

停止监听

droid.stopSensing()

用完一定要停,否则传感器持续耗电,会快速消耗手机电量。

常用传感器详解

加速度计(Accelerometer)

传感器类型编号通常为 1。返回三个方向(x、y、z)的加速度值,单位是 m/s²。静止时 z 轴会是 9.8(重力)。

droid.startSensingTimed(1, 500)
# 读取事件...
droid.stopSensing()

用途:步数统计、设备晃动检测、横竖屏判断辅助。

陀螺仪(Gyroscope)

传感器类型编号通常为 4。返回三个方向的角速度(旋转速度),单位是弧度/秒。

用途:游戏控制、AR 应用、精确姿态检测。

GPS 定位

GPS 不是通过 startSensing 启动的,而是有专门的 API:

droid.startLocating()  # 启动 GPS 定位服务
# 等几秒让 GPS 搜星
location = droid.getLastKnownLocation().result
print(f"经度: {location.get('longitude')}, 纬度: {location.get('latitude')}")
print(f"精度: {location.get('accuracy')} 米")
droid.stopLocating()

GPS 第一次启动需要几秒到几十秒搜星,有延迟。如果对实时性要求不高,可以先用网络定位(更快但精度低)。

光线传感器

返回当前环境光照强度(单位:勒克斯)。可以用来判断白天还是夜间,自动调整屏幕亮度。

接近传感器

检测手机前方是否有物体靠近(比如打电话时贴到耳朵),返回 0(靠近)或 1(远离)。

权限需求

传感器需要的权限
加速度计、陀螺仪、光线、接近无额外权限(QPython App 自带)
GPS精确位置 + 粗略位置

省电最佳实践

传感器是手机上最耗电的组件之一(仅次于屏幕和蜂窝网络):

实际应用例子

步数计数器原型

from androidhelper import Android
import time

droid = Android()
droid.startSensingTimed(1, 200)  # 200ms 采样一次

previous_z = 0
step_count = 0

try:
    while True:
        events = droid.sensorsGetEventBuffered().result
        if events:
            for event in events:
                z = event.get("z", 9.8)
                # 简化的步数检测逻辑:z 轴加速度超过阈值且方向变化
                if abs(z - previous_z) > 2.0 and z < 9.0:
                    step_count += 1
                    droid.makeToast(f"步数: {step_count}")
                previous_z = z
        time.sleep(0.2)
except KeyboardInterrupt:
    droid.stopSensing()
    print(f"总步数: {step_count}")

这是一个简化示例,实际步数检测需要更复杂的滤波算法。但它展示了 QSL4A 传感器 API 的基本使用范式。

小结

QSL4A 的传感器 API 让移动端 Python 编程有了独特价值——PC 上做不到的硬件数据采集,在手机上几行代码就能实现。启动 → 轮询/获取数据 → 停止 三步是所有传感器的基本模式,关键是记得及时停止以省电。

继续看 摄像头调用 了解如何用 Python 控制拍照和录像。