从本章开始将详细介绍每一个测试项。
1. Accelerometer Measurement Tests
这是所有 CTS Verifier 测试项里最容易的一个。简单点说就是依次测试设备的六个面的重力加速度。因为Android 设备外形绝大多数都是立方体,该测试项就是把设备按立方体的各个面放置一下,然后获取加速度的值于期望的值进行比较,在规定范围内(+-threshold)就算通过。
CTS Verifier 6.0_r9 Accelerometer Measurement Tests
下面来看具体的test case
测试前提条件:
STANDARD_GRAVITY(标准重力加速度)
Standard gravity (g) on Earth. This value is equivalent to 1G
Constant Value: 9.80665f
Threshold(阈值, 即允许误差)
+-1.95f m/s^2
代码:
private String verifyMeasurements(float ... expectations) throws Throwable {
Thread.sleep(500 /*ms*/);
TestSensorEnvironment environment = new TestSensorEnvironment(
getApplicationContext(),
Sensor.TYPE_ACCELEROMETER,
SensorManager.SENSOR_DELAY_FASTEST);
TestSensorOperation verifyMeasurements =
TestSensorOperation.createOperation(environment, 100 /* event count */);
verifyMeasurements.addVerification(new MeanVerification(
expectations,
new float[]{1.95f, 1.95f, 1.95f} /* m / s^2 */));
verifyMeasurements.execute(getCurrentTestNode());
return null;
}
public String testFaceUp() throws Throwable {
return verifyMeasurements(
R.string.snsr_accel_test_face_up,
0, 0, SensorManager.STANDARD_GRAVITY);
}
该项测试设备静止正面朝上时的x,y,z三轴加速度的值. CTS Verifier 会设置 Accelerometer Sensor 工作在 Fastested Data Rate (100Hz/200Hz, 具体频率由 SensorList Structure 上报的 minDelay 决定),然后收集100个 event,计算一下三个轴的平均值,再与 {0.00+-1.95, 0.00+-1.95, 9.80665+-1.95} 相比较。如果不在误差范围内则报错,反之则通过。
失败类型:
1) 轴错误;正面朝上静止放置时,设备的三轴加速度的值应该在{0.0, 0.0, 9.8}附近。如果出现类似{0.0, 9.8, 0.0}的值,说明要么sensor的axis remapping(sensor的三轴坐标系要跟设备的三轴坐标系一致) 做错了;要么设备摆放的方向错误;
2)mean value 错误;正面朝上静止放置时,测试结果提示某一轴的mean value > 1.95 (or < -1.95)。说明sensor offset 过大,需要进行校准。
3)没有数据;basic sensor knowledge,check your own code bro!
Accelerometer 校准一般分为两类,一类是在驱动(kernel driver)里做硬件校准或软件校准,另一类是在 HAL 里有算法来进行校准。因为Acceleremter是在静止时比较准确的sensor, 所以校准的目的之一是去掉静止时各个轴上产生的offset.
简单一点的校准算法就是,取 Accelerometer sensor 静止时50个数据的平均值,如{0.8, 1.2, 9.5},把它跟期望值{0.0, 0.0, 9.8}的差当作offset。然后在上报数据是去掉这个offset。
稍微复杂的校准算法,不仅要考虑各轴的noise, 还要计算增益误差(Gain Error),具体实现方式需要比较大的篇幅,这里不展开讲了。
Accelerometer Measurement Tests 里其他5项测试内容与FaceUp测试一样。