android 加速传感器计步,哪位大哥哥有 安卓手机加速度传感器的计步器源码,,...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
现在 好一点的 都有陀螺仪,系统实现了计步
没有的,那个计算出来的 不是很准。
根据波动的阈值范围来判定,
代码 贴给你 注释也很清楚了
抱歉,您的贴子超过5000字,建议您精简或分段后再提交
删了一部分废弃的方法
public class StepDcretor implements SensorEventListener {
//存放三轴数据
float[] oriValues = new float[3];
final int valueNum = 4;
//用于存放计算阈值的波峰波谷差值
float[] tempValue = new float[valueNum];
int tempCount = 0;
//是否上升的标志位
boolean isDirectionUp = false;
//持续上升次数
int continueUpCount = 0;
//上一点的持续上升的次数,为了记录波峰的上升次数
int continueUpFormerCount = 0;
//上一点的状态,上升还是下降
boolean lastStatus = false;
//波峰值
float peakOfWave = 0;
//波谷值
float valleyOfWave = 0;
//此次波峰的时间
long timeOfThisPeak = 0;
//上次波峰的时间
long timeOfLastPeak = 0;
//当前的时间
long timeOfNow = 0;
//当前传感器的值
float gravityNew = 0;
//上次传感器的值
float gravityOld = 0;
//动态阈值需要动态的数据,这个值用于这些动态数据的阈值
final float initialValue = (float) 1.7;
//初始阈值
float ThreadValue = (float) 2.0;
private final String TAG = "StepDcretor";
/**
* 0-准备计时 1-计时中 2-准备为正常计步计时 3-正常计步中
*/
private int CountTimeState = 0;
public static int CURRENT_SETP = 0;
public static int TEMP_STEP = 0;
private int lastStep = -1;
// 加速计的三个维度数值
public static float[] gravity = new float[3];
public static float[] linear_acceleration = new float[3];
//用三个维度算出的平均值
public static float average = 0;
private Timer timer;
// 倒计时4秒,4秒内不会显示计步,用于屏蔽细微波动
private long duration = 4000;
private TimeCount time;
OnSensorChangeListener onSensorChangeListener;
public interface OnSensorChangeListener {
void onChange();
}
public StepDcretor(Context context) {
super();
}
public void onAccuracyChanged(Sensor arg0, int arg1) {
}
public OnSensorChangeListener getOnSensorChangeListener() {
return onSensorChangeListener;
}
public void setOnSensorChangeListener(
OnSensorChangeListener onSensorChangeListener) {
this.onSensorChangeListener = onSensorChangeListener;
}
public void onSensorChanged(SensorEvent event) {
Sensor sensor = event.sensor;
synchronized (this) {
if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
calc_step(event);
}
}
}
synchronized private void calc_step(SensorEvent event) {
average = (float) Math.sqrt(Math.pow(event.values[0], 2)
+ Math.pow(event.values[1], 2) + Math.pow(event.values[2], 2));
DetectorNewStep(average);
}
/*
* 检测步子,并开始计步
* 1.传入sersor中的数据
* 2.如果检测到了波峰,并且符合时间差以及阈值的条件,则判定为1步
* 3.符合时间差条件,波峰波谷差值大于initialValue,则将该差值纳入阈值的计算中
* */
public void DetectorNewStep(float values) {
if (gravityOld == 0) {
gravityOld = values;
} else {
if (DetectorPeak(values, gravityOld)) {
timeOfLastPeak = timeOfThisPeak;
timeOfNow = System.currentTimeMillis();
if (timeOfNow - timeOfLastPeak >= 200
&& (peakOfWave - valleyOfWave >= ThreadValue) && timeOfNow - timeOfLastPeak <= 2000) {
timeOfThisPeak = timeOfNow;
//更新界面的处理,不涉及到算法
preStep();
}
if (timeOfNow - timeOfLastPeak >= 200
&& (peakOfWave - valleyOfWave >= initialValue)) {
timeOfThisPeak = timeOfNow;
ThreadValue = Peak_Valley_Thread(peakOfWave - valleyOfWave);
}
}
}
gravityOld = values;
}
private void preStep() {
if (CountTimeState == 0) {
// 开启计时器
time = new TimeCount(duration, 700);
time.start();
CountTimeState = 1;
Log.v(TAG, "开启计时器");
} else if (CountTimeState == 1) {
TEMP_STEP++;
Log.v(TAG, "计步中 TEMP_STEP:" + TEMP_STEP);
} else if (CountTimeState == 3) {
CURRENT_SETP++;
if (onSensorChangeListener != null) {
onSensorChangeListener.onChange();
}
}
}
/*
* 检测波峰
* 以下四个条件判断为波峰:
* 1.目前点为下降的趋势:isDirectionUp为false
* 2.之前的点为上升的趋势:lastStatus为true
* 3.到波峰为止,持续上升大于等于2次
* 4.波峰值大于1.2g,小于2g
* 记录波谷值
* 1.观察波形图,可以发现在出现步子的地方,波谷的下一个就是波峰,有比较明显的特征以及差值
* 2.所以要记录每次的波谷值,为了和下次的波峰做对比
* */
public boolean DetectorPeak(float newValue, float oldValue) {
lastStatus = isDirectionUp;
if (newValue >= oldValue) {
isDirectionUp = true;
continueUpCount++;
} else {
continueUpFormerCount = continueUpCount;
continueUpCount = 0;
isDirectionUp = false;
}
if (!isDirectionUp && lastStatus
&& (continueUpFormerCount >= 2 && (oldValue >= 11.76 && oldValue < 19.6))) {
peakOfWave = oldValue;
return true;
} else if (!lastStatus && isDirectionUp) {
valleyOfWave = oldValue;
return false;
} else {
return false;
}
}
/*
* 阈值的计算
* 1.通过波峰波谷的差值计算阈值
* 2.记录4个值,存入tempValue[]数组中
* 3.在将数组传入函数averageValue中计算阈值
* */
public float Peak_Valley_Thread(float value) {
float tempThread = ThreadValue;
if (tempCount < valueNum) {
tempValue[tempCount] = value;
tempCount++;
} else {
tempThread = averageValue(tempValue, valueNum);
for (int i = 1; i < valueNum; i++) {
tempValue[i - 1] = tempValue[i];
}
tempValue[valueNum - 1] = value;
}
return tempThread;
}
/*
* 梯度化阈值
* 1.计算数组的均值
* 2.通过均值将阈值梯度化在一个范围里
* */
public float averageValue(float value[], int n) {
float ave = 0;
for (int i = 0; i < n; i++) {
ave += value[i];
}
ave = ave / valueNum;
if (ave >= 8)
ave = (float) 4.3;
else if (ave >= 7 && ave < 8)
ave = (float) 3.3;
else if (ave >= 4 && ave < 7)
ave = (float) 2.3;
else if (ave >= 3 && ave < 4)
ave = (float) 2.0;
else {
ave = (float) 1.3;
}
return ave;
}
class TimeCount extends CountDownTimer {
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
// 如果计时器正常结束,则开始计步
time.cancel();
CURRENT_SETP += TEMP_STEP;
lastStep = -1;
// CountTimeState = 2;
Log.v(TAG, "计时正常结束");
timer = new Timer(true);
TimerTask task = new TimerTask() {
public void run() {
if (lastStep == CURRENT_SETP) {
timer.cancel();
CountTimeState = 0;
lastStep = -1;
TEMP_STEP = 0;
Log.v(TAG, "停止计步:" + CURRENT_SETP);
} else {
lastStep = CURRENT_SETP;
}
}
};
timer.schedule(task, 0, 3000);
CountTimeState = 3;
}
@Override
public void onTick(long millisUntilFinished) {
if (lastStep == TEMP_STEP) {
Log.v(TAG, "onTick 计时停止");
time.cancel();
CountTimeState = 0;
lastStep = -1;
TEMP_STEP = 0;
} else {
lastStep = TEMP_STEP;
}
}
}
//废弃的算法
// private void oldCalStep(SensorEvent event) {
// // 用低通滤波器分离出重力加速度
// gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
// gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
// gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
//
}
android 加速传感器计步,哪位大哥哥有 安卓手机加速度传感器的计步器源码,,...相关推荐
- android 快传 源码_安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端...
适用范围:安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端 演示地址:(以截图为准) 运行环境:Android+PC+web 其他说明: 本项目是一个基于安卓的类似茄子 ...
- JavaScript实现按位运算符乘以无符号数multiplyUnsigned算法(附完整源码)
JavaScript实现按位运算符乘以无符号数multiplyUnsigned算法(附完整源码) multiplyUnsigned.js完整源代码 multiplyUnsigned.js完整源代码 e ...
- Android安卓成品项目 购物商城系统源码apk
Android安卓成品项目 购物商城系统源码apk 安卓源码,成品项目,单机不联网项目,包含项目报告 登录注册,展示和修改个人信息,全部商家列表,讨论功能,添加购物车,联系,付款,查看订单记录,账户充 ...
- android计步器开源,开源Android项目pedometer计步器源码
[实例简介] 开源Android项目计步器源码,打开软件后,手握手机,可根据你走路时胳膊摆的次数准确测试出你走了多少步,有意思吧,而且这个项目的源码是开源的,分iPhone版和Android版,此为a ...
- java计算机毕业设计ssm基于大数据的汽车流量监控cvej1(附源码、数据库)
java计算机毕业设计ssm基于大数据的汽车流量监控cvej1(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...
- android做拨号程序代码,Android开发手机拨号程序实现实例源码介绍
Android开发手机拨号程序实现实例源码介绍,在上一篇文章中,我们实现了第一个程序:helloWorld,并成功测试完成.还给大家介绍了Android项目结构和说明.现在写一个手机拨号程序: 首先, ...
- web前端期末大作业:文化网站设计——中国风文化html源码(6个页面) HTML+CSS+JavaScript...
web前端期末大作业:文化网站设计--中国风文化html源码(6个页面) HTML+CSS+JavaScript 期末作业HTML代码 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到 ...
- 酷派android是什么系统版本,酷派大神X7的手机系统是什么?能升级安卓5.0吗?
酷派大神X7的手机系统是什么 大神X7搭载了最新的Cool UI 6.0(基于Android 4.4.2)系统界面. 大神X7采用了Super AMOLED材质的屏幕,尺寸为5.2英寸,分辨率为主流的 ...
- 手机加速度传感器在Android横竖屏切换中的应用
文章目录 如何判断手机的横竖屏 使用加速度计实现 接口使用 使用加速度计和磁力计获取手机倾斜角度 加速度传感器在Android横竖屏切换中的应用 如何判断手机的横竖屏 这个问题依赖与手机上的传感器 一 ...
最新文章
- (C++)第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。
- Oracle后台进程
- 小的人工智能企业应如何解决算力服务器
- memcached python客户端编写实践
- 871 最低加油次数
- ABAP程序性能优化
- Hibernate执行原理总结
- 100% .NET Control_自动完成Combobox的XComBo控件(VB.NET)
- 将不确定变为确定~真的是SqlDataReader引起的超时?
- 生成chm文档工具- Sandcastle -摘自网络
- python倒三角形_python写个三角形的问题
- 在矩池云上使用A6000/3090跑ikatago说明
- 终极人机大战要来了?AI打星际2即将直播,DeepMind暴雪发出神秘预告
- Biztalk2009安装全过程截图,x64平台需要手动更改运行模式
- 2021年全国电子设计竞赛题目
- Hadoop的特性和版本
- oracle vm 强制关机,[已解决]Virtualbox安装archlinux过程中客户机和宿主机全部卡死...
- 【JZOJ 3397】雨天的尾巴
- 《人工智能及其应用》练习题
- Microsoft.Office.Interop.Excel # Microsoft Excel xx.0 Object Library 引用
热门文章
- Linux系统SPI驱动总结(一)
- 理解:L1正则先验分布是Laplace分布,L2正则先验分布是Gaussian分布
- 【Source教程】游戏SDK工具的下载安装与使用方法
- tomcat启动时错误:Failed to start component [StandardEngine[Catalina].StandardHost[localhost].错误
- 计算机语言都是相通的,各类编程语言是不是都有互通的部分?
- 写个脚本,一键打开软件文档(Windows)
- IT服务目录简介及其如何搭建
- Power bi 3.8 分区图
- 搞不懂DMP是什么?看这里就够了
- 深入理解计算机基础——ECH