简介
ARMCLOUD 云手机支持对移动设备的各种传感器进行动态数据仿真,包括重力感应、陀螺仪、磁力计、加速度计等。通过模拟真实的传感器数据,可以为各种应用场景提供逼真的设备状态模拟。
支持的传感器类型
1. 运动传感器
加速度计 (acceleration)
- 格式:
acceleration:x:y:z - 功能:模拟设备在 X、Y、Z 三轴上的加速度变化
- 单位:m/s²
- 应用场景:重力感应游戏、计步器应用、屏幕旋转控制
线性加速度计 (linear-acceleration)
- 格式:
linear-acceleration:x:y:z - 功能:模拟去除重力影响后的线性加速度
- 单位:m/s²
- 应用场景:精确运动检测、手势识别
未校准加速度计 (acceleration-uncalibrated)
- 格式:
acceleration-uncalibrated:x:y:z - 功能:包含偏差的原始加速度数据
- 单位:m/s²
陀螺仪 (gyroscope)
- 格式:
gyroscope:x:y:z - 功能:模拟设备绕三轴的角速度变化
- 单位:rad/s
- 应用场景:体感游戏、VR/AR 应用、相机防抖
未校准陀螺仪 (gyroscope-uncalibrated)
- 格式:
gyroscope-uncalibrated:x:y:z - 功能:包含偏差的原始陀螺仪数据
- 单位:rad/s
重力传感器 (gravity)
- 格式:
gravity:x:y:z - 功能:模拟重力在设备坐标系中的分量
- 单位:m/s²
- 应用场景:水平仪应用、姿态检测
2. 位置传感器
磁力计 (magnetic-field)
- 格式:
magnetic-field:x:y:z - 功能:模拟设备检测磁场强度和方向
- 单位:μT (微特斯拉)
- 应用场景:指南针应用、导航软件、金属探测器
未校准磁力计 (magnetic-field-uncalibrated)
- 格式:
magnetic-field-uncalibrated:x:y:z - 功能:包含偏差的原始磁场数据
- 单位:μT
方向传感器 (orientation)
- 格式:
orientation:azimuth:pitch:roll - 功能:模拟设备的欧拉角姿态
- 单位:度 (已废弃,建议使用旋转向量)
3. 旋转传感器
旋转向量 (rotation-vector)
- 格式:
rotation-vector:x:y:z - 功能:模拟设备的旋转状态(四元数的前三个分量)
- 应用场景:3D 应用、VR/AR、姿态控制
游戏旋转向量 (game-rotation-vector)
- 格式:
game-rotation-vector:x:y:z - 功能:不使用磁力计的旋转向量
- 应用场景:游戏控制、防磁干扰场景
地磁旋转向量 (geomagnetic_roation)
- 格式:
geomagnetic_roation:x:y:z - 功能:基于加速度计和磁力计的旋转向量
- 应用场景:指南针、导航应用
4. 环境传感器
光线传感器 (light)
- 格式:
light:value - 功能:模拟环境光照强度
- 单位:lux (勒克斯)
- 应用场景:屏幕亮度自动调节、拍照场景检测
距离传感器 (proximity)
- 格式:
proximity:distance - 功能:模拟物体与设备的距离
- 单位:cm
- 应用场景:通话时屏幕关闭、手势控制
温度传感器 (temperature)
- 格式:
temperature:value - 功能:模拟环境温度
- 单位:℃
- 应用场景:天气应用、温度监控
气压传感器 (pressure)
- 格式:
pressure:value - 功能:模拟大气压强
- 单位:hPa (百帕)
- 应用场景:高度测量、天气预测
湿度传感器 (humidity)
- 格式:
humidity:value - 功能:模拟相对湿度
- 单位:% (相对湿度百分比)
- 应用场景:天气应用、室内环境监测
5. 运动检测传感器
计步器 (step-counter)
- 格式:
step-counter:count - 功能:累计步数统计
- 单位:步数 (整数)
- 应用场景:健康应用、运动跟踪
步行检测器 (step-detector)
- 格式:
step-detector:value - 功能:检测每一步的发生
- 应用场景:实时步行检测、运动分析
显著运动检测 (significant-motion)
- 格式:
significant-motion:value - 功能:检测设备的显著移动
- 应用场景:省电模式、位置更新触发
运动检测 (motion-detect)
- 格式:
motion-detect:value - 功能:通用运动检测
- 应用场景:安全监控、节能控制
倾斜检测器 (tilt-detector)
- 格式:
tilt-detector:value - 功能:检测设备倾斜状态变化
- 应用场景:屏幕方向锁定、倾斜控制
拿起手势 (pick-up)
- 格式:
pick-up:value - 功能:检测设备被拿起的动作
- 应用场景:自动亮屏、手势唤醒
6. 生物传感器
心率传感器 (heart-rate)
- 格式:
heart-rate:bpm - 功能:模拟心率数据
- 单位:BPM (每分钟心跳次数)
- 应用场景:健康监测、运动跟踪
7. 可折叠设备传感器
铰链角度传感器 (hinge-angle0/1/2)
- 格式:
hinge-angle0:angle、hinge-angle1:angle、hinge-angle2:angle - 功能:模拟可折叠设备的折叠角度
- 单位:度
- 应用场景:折叠屏设备适配、多屏显示控制
8. 可穿戴设备传感器
手腕倾斜手势 (wrist-tilt)
- 格式:
wrist-tilt:value:measurementId - 功能:检测手腕抬起动作
- 应用场景:智能手表亮屏、手势识别
使用方式
通过系统属性配置(推荐方式)
1. 设置系统属性
通过设置系统属性指定传感器数据文件路径:
setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/sensor1.txt
2. 创建传感器数据文件
在指定路径创建传感器数据文件,格式如下:
# /data/local/tmp/sensor1.txt
acceleration:-0.62871414:2.946163:9.217153
gyroscope:-3.625:-0.8125:1.2125
magnetic-field:1.4375:24.475:-18.362501
delay:50
acceleration:-0.52871414:2.846163:9.317153
gyroscope:-3.525:-0.7125:1.3125
magnetic-field:1.5375:24.575:-18.262501
delay:50
3. 数据文件格式说明
三轴传感器 (x:y:z 格式)
| 传感器类型 | 格式示例 | 单位 | 说明 |
|---|---|---|---|
acceleration | acceleration:-0.628:2.946:9.217 | m/s² | 加速度计数据 |
linear-acceleration | linear-acceleration:0.1:-0.2:0.05 | m/s² | 线性加速度 |
acceleration-uncalibrated | acceleration-uncalibrated:-0.63:2.95:9.22 | m/s² | 未校准加速度 |
gyroscope | gyroscope:-3.625:-0.8125:1.2125 | rad/s | 陀螺仪数据 |
gyroscope-uncalibrated | gyroscope-uncalibrated:-3.62:-0.81:1.21 | rad/s | 未校准陀螺仪 |
gravity | gravity:0.0:0.0:9.8 | m/s² | 重力传感器 |
magnetic-field | magnetic-field:1.4375:24.475:-18.3625 | μT | 磁力计数据 |
magnetic-field-uncalibrated | magnetic-field-uncalibrated:1.44:24.48:-18.36 | μT | 未校准磁力计 |
orientation | orientation:45.0:10.5:-5.2 | 度 | 方向传感器 (已废弃) |
rotation-vector | rotation-vector:0.1:0.2:0.3 | - | 旋转向量 |
game-rotation-vector | game-rotation-vector:0.15:0.25:0.35 | - | 游戏旋转向量 |
geomagnetic_roation | geomagnetic_roation:0.12:0.22:0.32 | - | 地磁旋转向量 |
单值传感器 (value 格式)
| 传感器类型 | 格式示例 | 单位 | 说明 |
|---|---|---|---|
light | light:500.0 | lux | 光线强度 |
proximity | proximity:0.0 | cm | 距离传感器 |
temperature | temperature:25.5 | ℃ | 环境温度 |
pressure | pressure:1013.25 | hPa | 大气压强 |
humidity | humidity:65.0 | % | 相对湿度 |
step-counter | step-counter:1250 | 步 | 累计步数 |
step-detector | step-detector:1.0 | - | 步行检测 |
significant-motion | significant-motion:1.0 | - | 显著运动 |
motion-detect | motion-detect:1.0 | - | 运动检测 |
tilt-detector | tilt-detector:1.0 | - | 倾斜检测 |
pick-up | pick-up:1.0 | - | 拿起手势 |
heart-rate | heart-rate:72.0 | BPM | 心率 |
hinge-angle0 | hinge-angle0:90.0 | 度 | 铰链角度0 |
hinge-angle1 | hinge-angle1:45.0 | 度 | 铰链角度1 |
hinge-angle2 | hinge-angle2:0.0 | 度 | 铰链角度2 |
特殊格式传感器
| 传感器类型 | 格式示例 | 说明 |
|---|---|---|
wrist-tilt | wrist-tilt:1.0:12345 | 手腕倾斜:数值:测量ID |
delay | delay:50 | 延时间隔,单位:毫秒 |
4. 文件限制
- 最大文件大小:1GB
- 支持格式:纯文本文件
- 编码要求:UTF-8
- 权限要求:文件必须具有可读权限
数据采集与生成
1. 真机数据采集
可以通过真实设备采集传感器数据来生成仿真文件:
Android 数据采集示例
public class SensorDataCollector implements SensorEventListener {
private SensorManager sensorManager;
private FileWriter fileWriter;
public void startCollection() {
try {
fileWriter = new FileWriter("/sdcard/sensor_data.txt");
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 注册传感器监听器
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_GAME);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSensorChanged(SensorEvent event) {
try {
String line = "";
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
line = String.format("acceleration:%.8f:%.8f:%.8f\n",
event.values[0], event.values[1], event.values[2]);
break;
case Sensor.TYPE_GYROSCOPE:
line = String.format("gyroscope:%.8f:%.8f:%.8f\n",
event.values[0], event.values[1], event.values[2]);
break;
case Sensor.TYPE_MAGNETIC_FIELD:
line = String.format("magnetic-field:%.8f:%.8f:%.8f\n",
event.values[0], event.values[1], event.values[2]);
break;
}
fileWriter.write(line);
fileWriter.write("delay:50\n");
fileWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 数据文件生成脚本
Python 脚本示例
#!/usr/bin/env python3
import math
import time
def generate_rotation_data(output_file):
"""生成设备旋转的传感器数据"""
with open(output_file, 'w') as f:
for angle in range(0, 361, 5): # 0到360度,每5度一个数据点
rad = math.radians(angle)
# 模拟重力在不同角度下的分解
acc_x = 9.8 * math.sin(rad)
acc_y = 0
acc_z = 9.8 * math.cos(rad)
# 模拟旋转时的角速度
gyro_x = 0.1 if angle < 180 else -0.1
gyro_y = 0
gyro_z = 0
# 磁力计数据保持相对稳定
mag_x = 25.0 * math.cos(rad)
mag_y = 25.0 * math.sin(rad)
mag_z = -18.0
f.write(f"acceleration:{acc_x:.6f}:{acc_y:.6f}:{acc_z:.6f}\n")
f.write(f"gyroscope:{gyro_x:.6f}:{gyro_y:.6f}:{gyro_z:.6f}\n")
f.write(f"magnetic-field:{mag_x:.6f}:{mag_y:.6f}:{mag_z:.6f}\n")
f.write("delay:100\n")
def generate_shake_data(output_file):
"""生成摇一摇手势的传感器数据"""
with open(output_file, 'w') as f:
for shake in range(10): # 10次摇动
# 向左摇
f.write("acceleration:-15.0:0.0:9.8\n")
f.write("gyroscope:0.0:0.0:5.0\n")
f.write("magnetic-field:1.4375:24.475:-18.362501\n")
f.write("delay:100\n")
# 向右摇
f.write("acceleration:15.0:0.0:9.8\n")
f.write("gyroscope:0.0:0.0:-5.0\n")
f.write("magnetic-field:1.4375:24.475:-18.362501\n")
f.write("delay:100\n")
# 回到静止
f.write("acceleration:0.0:0.0:9.8\n")
f.write("gyroscope:0.0:0.0:0.0\n")
f.write("magnetic-field:1.4375:24.475:-18.362501\n")
f.write("delay:200\n")
# 使用示例
generate_rotation_data("/data/local/tmp/rotation.txt")
generate_shake_data("/data/local/tmp/shake.txt")
动态仿真场景
1. 设备旋转模拟
使用数据文件方式
# 1. 生成旋转数据文件
python3 generate_rotation.py
# 2. 上传到云手机
adb push rotation.txt /data/local/tmp/
# 3. 设置系统属性启用仿真
adb shell setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/rotation.txt
# 4. 重启目标应用查看效果
adb shell am force-stop com.example.app
adb shell am start com.example.app/.MainActivity
2. 摇一摇手势模拟
# 使用预生成的摇一摇数据文件
adb push shake.txt /data/local/tmp/
adb shell setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/shake.txt
# 启动微信等支持摇一摇的应用进行测试
adb shell am start com.tencent.mm/.ui.LauncherUI
## 实际操作流程
### 1. 完整操作示例
```bash
# 连接到云手机
adb connect your-cloud-phone-ip:5555
# 上传准备好的传感器数据文件
adb push sensor_walking.txt /data/local/tmp/
# 设置文件可读权限
adb shell chmod 644 /data/local/tmp/sensor_walking.txt
# 设置系统属性
adb shell setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/sensor_walking.txt
# 验证属性设置
adb shell getprop persist.sys.cloud.sensor.tpl_dp
# 重启目标应用以使传感器数据生效
adb shell am force-stop com.example.walkingapp
adb shell am start com.example.walkingapp/.MainActivity
# 查看应用日志验证效果
adb logcat | grep SensorManager
2. 切换不同场景数据
# 切换到摇一摇数据
adb shell setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/shake.txt
# 切换到旋转数据
adb shell setprop persist.sys.cloud.sensor.tpl_dp /data/local/tmp/rotation.txt
# 停用传感器仿真(清空属性)
adb shell setprop persist.sys.cloud.sensor.tpl_dp ""
最佳实践
1. 数据文件管理
- 命名规范:使用有意义的文件名,如
walking_5min.txt、car_driving.txt - 数据完整性:确保每组传感器数据都有对应的 delay 值
- 文件大小:合理控制文件大小,避免接近 1GB 限制影响性能
2. 数据合理性
- 加速度计:静止状态下 Z 轴应约为 9.8m/s²(重力加速度)
- 陀螺仪:静止状态下三轴数值应接近 0
- 磁力计:典型地球磁场强度约为 25-65μT
3. 更新频率优化
- 游戏类应用:建议 delay:16 (60Hz)
- 导航类应用:建议 delay:200-1000 (1-5Hz)
- 一般应用:建议 delay:50-100 (10-20Hz)
4. 数据平滑性
在生成数据文件时,确保数值之间的平滑过渡:
# 平滑过渡示例
def smooth_transition(start_value, end_value, steps):
"""在两个数值之间进行平滑插值"""
return [start_value + (end_value - start_value) * i / steps
for i in range(steps + 1)]
# 应用到传感器数据生成
for i, acc_x in enumerate(smooth_transition(0, 9.8, 20)):
with open('smooth_data.txt', 'a') as f:
f.write(f"acceleration:{acc_x:.6f}:0.0:9.8\n")
f.write("delay:50\n")
应用案例
1. 游戏测试
- 模拟不同的设备姿态来测试重力感应游戏
- 批量测试设备旋转对游戏界面的影响
2. 导航应用测试
- 模拟复杂的行驶路线测试导航准确性
- 测试不同位置下的地图显示效果
3. 健康应用测试
- 模拟步行、跑步等运动状态
- 测试计步器和运动轨迹记录功能
注意事项
性能影响:频繁的传感器数据更新可能影响系统性能,请根据实际需求调整更新频率
应用权限:确保目标应用已获得相应的传感器使用权限
数据一致性:不同传感器的数据应保持物理上的一致性,避免冲突的数据组合
应用兼容性:部分老版本应用可能对某些传感器数据支持有限
机型兼容性:云手机传感器支持情况取决于所模拟的真实机型,部分传感器仅在特定机型下可用:
humidity(湿度传感器) - 大部分中低端机型不支持temperature(温度传感器) - 仅部分高端机型支持heart-rate(心率传感器) - 主要存在于三星Galaxy系列等特定机型tilt-detector(倾斜检测器) - 部分机型的陀螺仪实现可能不支持motion-detect(运动检测) - 依赖设备的运动协处理器hinge-angle0/1/2/3(铰链角度传感器) - 仅可折叠设备支持,如Samsung Galaxy Fold、华为Mate X等
建议:选择合适的机型模板,或在使用前验证当前云机实例所模拟的机型是否支持目标传感器
故障排除
常见问题
Q: 设置传感器数据后应用没有响应
A: 检查应用是否已获得传感器权限,或尝试重启应用以重新初始化传感器监听
Q: 数据更新不平滑,出现跳跃
A: 适当降低更新频率,或在数据间增加插值过渡
Q: 系统属性设置后传感器仿真不生效
A: 检查系统属性路径是否正确,确认数据文件存在且具有可读权限 (chmod 644),验证文件格式正确,可尝试重启目标应用
Q: 某些传感器数据设置后应用仍无响应
A: 可能是当前云机实例模拟的机型不支持该类型传感器。特别是湿度、温度、心率、铰链角度等传感器,仅在特定真实机型上存在,云机会根据所模拟的机型决定传感器支持情况。建议先使用基础传感器(加速度计、陀螺仪、磁力计)进行测试,或选择支持目标传感器的机型模板