智能手机android下的记步器的实现


随着智能手机的普及,各种应用也随之出现。我们实现了一个基于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 成长篇




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值