随着智能手机的普及,各种应用也随之出现。我们实现了一个基于android的记步器,可以对一些需要锻炼的人有个好的提醒,并建立了后台服务器,把用户的锻炼的信息上传到网络上,随时查看。
开发界面如下图所示:
可以填入传感器的数据采集间隔,提高测量精度,经过我们的测试,一般人在100ms就可以了。我们 采用了多种传感器作为记步的依据,在上图系统中,由于是模拟器,只有一中传感器,就是3轴传感器。它可以采集的数据就是3个轴的加速度,获取加速度传感器的代码如下所示
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
Bundle bundle = intent.getExtras();
mFrequency = bundle.getLong("frequency");
mSensorManager.registerListener(mWalkingListener,
mSensorManager.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST);
System.out.println("onCreate");
super.onStart(intent, startId);
}
他会将mWalkingListener作为触发器,即传感器数据发生改变的时候,会调用这个Listener的onChange方法。
package ustc.CountStep;
import ustc.CountStep.Service.WalkingService;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class WalkingListener implements SensorEventListener {
WalkingService mWalkingService;
long mInterval;
long mCurrentTime;
public WalkingListener(WalkingService walkingService) {
mWalkingService = walkingService;
mCurrentTime = System.currentTimeMillis();
mInterval = walkingService.getFrequency();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
if((System.currentTimeMillis() - mCurrentTime) > mInterval){
mCurrentTime = System.currentTimeMillis();
Intent mIntent = new Intent();
mIntent.setAction("ustc.CountStep");
mIntent.putExtra("x", event.values[SensorManager.DATA_X]);
mIntent.putExtra("y", event.values[SensorManager.DATA_Y]);
mIntent.putExtra("z", event.values[SensorManager.DATA_Z]);
mWalkingService.sendBroadcast(mIntent);
}
// System.out.println("SensorChanged");
// System.out.println(event.values[SensorManager.DATA_X]);
// System.out.println(event.values[SensorManager.DATA_Y]);
// System.out.println(event.values[SensorManager.DATA_Z]);
}
}
加速度传感器的使用可以参考博文http://book.51cto.com/art/201010/231866.htm
下面我们来看下如何通过加速度传感器测量步数,下面给出两组数据
第一组,手机握在手中时,3轴的数据改变
3种颜色代表3个轴的数据改变,这种有序的改变可以通过傅立叶变换很容易的得到周期。通过周期,我们就可以计算出人走路的步数。
第二组,装在口袋里的时候,加速度表现出以下状态,我们采集了一个不是很规律的数据
可以看出,在这种情况下,虽然有周期,但不是非常明显,无法找到好的的方法获取周期。我们采用了一中机器学习方法,通过大量收集
训练集,通过计算得到一个好的结果。在有规律的步伐中,我们已经得到了一个可以接受的结果。
我们还在改进算法,希望能够支持在蹲下或者其他情况下尽量做到准确的判断步伐。
参加 第二届 Google 暑期大学生博客分享大赛 - 2011 Android 成长篇