手机传感器中的加速度传感器

期末做的是计步器APP,所以对加速度传感做了些研究哈哈,下面我就讲讲我学习的一下东西。

1、什么是加速度传感器?

首先传感器,顾名思义,就是将对象的变化感受传达给设备的一种工具,在Android中使用加速度传感器可以帮助我们识别手机的姿态及运动状态。经常听到的有方向传感器,重力感应器,加速度传感器,心率传感器等等。不同版本系统安卓机支持的传感器会不同,所以开发时要选择支持加速度传感器的安卓系统版本。

2、 加速度的求取

由于手机会固定受到地球重力加速度,因此传感器的读数是受此影响后的数值。
假如我们的手机是垂直摆放,机头朝上。那么x,z轴均无加速度,y轴上会固定受到地球重力加速度的影响。
此时,由于y轴向上为正方向,因此重力加速度为负值,y轴的加速度就为:
ay=a−(−g)=a+9.81
因此竖直静止时,三轴的加速度近似于:
(ax,ay,az)=(0,9.81,0)
反之在垂直摆放,机头朝下(倒立摆放)时。y轴方向是向下的,因此这时地球加速度为+9.81。这种情况下y轴的加速度:
ay=a−g=a−9.81
静止时有近似值:
(ax,ay,az)=(0,−9.81,0)

3、使用加速度传感器与其他传感器的方法大致相同,通过调用系统API就可以实现。分为以下几步:

1.获取SensorManager
2.使用SensorManager获取加速度传感器
3.创建自定义的传感器监听函数,并注册
4.相对应的,在合适位置实现注销监听器的调用

4、献上我的学习代码

public class MainActivity extends Activity{
private static final String TAG = “SensorTest”;
private Sensor mAccelerometer;
private TestSensorListener mSensorListener;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();

// 初始化传感器

mSensorListener = new TestSensorListener();
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
{
super.onResume();

// 注册传感器监听函数

mAccelerometer, SensorManager.SENSOR_DELAY_UI); }

@Override
protected void onPause()
{
super.onPause();
{
mSensorInfoA = (TextView) findViewById(R.id.sensor_info_a);
}

class TestSensorListener implements SensorEventListener {
@Overridepublic void onSensorChanged(SensorEvent event)
{

// 读取加速度传感器数值,values数组0,1,2分别对应x,y,z轴的加速度

Log.i(TAG, “onSensorChanged: ” + event.values[0] + “, ” + event.values[1] + “, ” + event.values[2]);
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy)

{
Log.i(TAG, “onAccuracyChanged”);
}
}
}

5计步器

计步器需要手机硬件加速度传感器的支持,而计步器的开发可以用手机自己的传感器也可以用Google内置
计步器开发。这里我选择自己的手机传感器。

6、传感器运行后计步器的工作原理

使用这个传感器时会检测传感器的变化,得到传感器三轴的值(x,y,z)然后计算他们的平均值,这样做的目的是为了平衡在某一个方向数值过大造成的数据误差,然后将该值与上一时间点的值进行比较,判断是否为波峰或波谷,如果是就相应的保存下来。

如果检测到了波峰,并且符合时间差以及阈值的条件,则判定位1步,如果符合时间差条件,波峰波谷差值大于initialValue,则将该差值纳入阈值的计算中。同时为防止微小震动对计步的影响,我们将计步分为3个状态——准备计时、计时中、计步中。注意:这里要设计的更加符合实际的运动情况,让软件会分辨有效和无效的步数!!!

所谓“计时中”是在3.5秒内每隔0.7秒对步数进行一次判断,看步数是否仍然在增长,如果不在增长说明之前是无效的震动并没有走路,得到的步数不计入总步数中;反之则将这3.5秒内的步数加入总步数中。

之后进入“计步中”状态进行持续计步,并且每隔2秒去判断一次当前步数和2秒前的步数是否相同,如果相同则说明步数不在增长,计步结束。

为了更直观的理解,附上一张图(原谅我的盗图)

7、实现代码MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener,ensorEventListener {

private SensorManager sManager;
private Sensor mSensorAccelerometer;
private TextView tv_step;
private Button btn_start;
private int step = 0;   //步数
private double oriValue = 0;  //原始值
private double lstValue = 0;  //上次的值
private double curValue = 0;  //当前值
private boolean motiveState = true;   //是否处于运动状态
private boolean processState = false;   //标记当前是否已经在计步@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sManager = (SensorManager) getSystemService(SENSOR_SERVICE);mSensorAccelerometer = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);sManager.registerListener(this, mSensorAccelerometer, SensorManager.SENSOR_DELAY_UI);bindViews();
}private void bindViews() {tv_step = (TextView) findViewById(R.id.tv_step);btn_start = (Button) findViewById(R.id.btn_start);btn_start.setOnClickListener(this);
}@Override
public void onSensorChanged(SensorEvent event) {double range = 1;   //设定一个精度范围float[] value = event.values;curValue = magnitude(value[0], value[1], value[2]);   //计算当前的模//向上加速的状态if (motiveState == true) {if (curValue >= lstValue) lstValue = curValue;else {//检测到一次峰值if (Math.abs(curValue - lstValue) > range) {oriValue = curValue;motiveState = false;}}}//向下加速的状态if (motiveState == false) {if (curValue <= lstValue) lstValue = curValue;else {if (Math.abs(curValue - lstValue) > range) {//检测到一次峰值oriValue = curValue;if (processState == true) {step++;  //步数 + 1if (processState == true) {tv_step.setText(step + "");    //读数更新}}motiveState = true;}}}
}@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}@Override
public void onClick(View v) {step = 0;tv_step.setText("0");if (processState == true) {btn_start.setText("开始");processState = false;} else {btn_start.setText("停止");processState = true;}
}//向量求模
public double magnitude(float x, float y, float z) {double magnitude = 0;magnitude = Math.sqrt(x * x + y * y + z * z);return magnitude;
}@Override
protected void onDestroy() {super.onDestroy();sManager.unregisterListener(this);
}

}

作者:马梦文
原文链接:https://blog.csdn.net/qq_41195409/article/details/80715748

浅谈加速度传感器及其在计步器中的应用相关推荐

  1. 数学在计算机科学上的应用文献,浅谈数学在计算机科学及应用中的作用

    论文编号:SXJY040论文字数:5690,页数:06 浅谈数学在计算机科学及应用中的作用 [摘要]:数学作为伴随人类历史发展长期积累的智慧结晶,是学习和运用科学技术的语言,代表着人类智慧的最高成就. ...

  2. 计算机科学技术的教育应用论文,浅谈计算机科学技术在计算机教学中的应用论文...

    计算机科学,研究计算机及其周围各种现象和规律的科学,亦即研究计算机系统结构.程序系统(即软件).人工智能以及计算本身的性质和问题的学科.计算机科学是一门包含各种各样与计算和信息处理相关主题的系统学科, ...

  3. 工作中应用计算机,浅谈计算机在我国计工作中的应用与发展.doc

    浅谈计算机在我国计工作中的应用与发展 <计算机的过去现在与未来>课程论文 浅谈计算机在我国会计工作中的 应用与发展 姓名学号学院会计学院日期2010-10-30 评分页 项目权重实际分数选 ...

  4. java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...

    Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String str ...

  5. 数学知识与计算机科学中的应用,浅谈计算机科学技术在数学思想中的应用

    浅谈计算机科学技术在数学思想中的应用 随着科学技术水平的不断提升和科学技术不断地影响着人们生活和工作的方方面面,计算机在我们生活中的普及度越来越高,对 (本文共1页) 阅读全文>> 随着互 ...

  6. 小学教育如何利用计算机思维,浅谈如何在中小学编程教学中培养学生的计算思维...

    浅谈如何在中小学编程教学中培养学生的计算思维 伍成伟 四川省 泸县二中城西学校 四川 泸州 646100 摘要:思维是人类所具有的高级认识活动,思维是人对外界输入信息与脑内储存知识经验进行一系列复杂的 ...

  7. 浅谈数学在计算机科学中的应用,浅谈计算机科学技术在数学思想中的应用(原稿)...

    <浅谈计算机科学技术在数学思想中的应用(原稿).doc>由会员分享,可免费在线阅读全文,更多与<浅谈计算机科学技术在数学思想中的应用(原稿)>相关文档资源请在帮帮文库(www. ...

  8. 用计算机画画的意义,浅谈电脑绘画在美术教学中的意义.doc

    浅谈电脑绘画在美术教学中的意义 精品论文 参考文献 浅谈电脑绘画在美术教学中的意义 梁亮(绵阳市绵阳中学英才学校绵阳621000) [内容提要]随着人类社会的发展,科技不断进步,艺术领域也在不断进步, ...

  9. 《浅谈条形码技术在连锁超市中的应用》论文笔记(二)

    一.基本信息 标题:浅谈条形码技术在连锁超市中的应用 时间:2016 来源:品牌(西京学院) 关键词:条形码技术; 连锁超市; 条码的应用; 二.研究内容 1.问题定义: 条形码作为一项以计算机技术和 ...

最新文章

  1. tp5权限管理代码_权限系统控制到按钮级别开源推荐 Spring BootShiroVue
  2. 方法论、方法论——程序员的阿喀琉斯之踵
  3. 统计字符串中的英文字母的个数C++代码实现
  4. 使用react、antd组件报错TypeError: _this.formRef.current.validateFields is not a function
  5. 爬虫项目三:爬取选课信息
  6. 字符串转命令行字符图片
  7. zabbix的邮件报警
  8. java实现n选m组合数_求组合数m_n
  9. get和post方式提交中文乱码问题解决方案
  10. 面试小能手速成,接口测试脚本如何编写?其实很简单
  11. python 输出log_python:logging模块(记录打印日志)
  12. Java中反射的理解
  13. 编译原理实验c语言cfg文法,编译原理实验指导终稿.pdf
  14. rxbus 源码_从 RxBus 这辆兰博基尼深入进去
  15. 软路由初次尝试者的折腾指南
  16. 《私募股权基金投资基础知识》---第二章
  17. 计算机安装xp蓝屏怎么办,重装xp系统一直蓝屏重启循环怎么回事
  18. vlan是什么?如何划分vlan?如何实现vlan?使用vlan的优点!
  19. iOS小知识: 使用bugly上报自定义错误信息进行数据监控
  20. 云服务器Linux 安装SVN

热门文章

  1. 动态规划——单向 DSP
  2. JS案例:前端Iframe及Worker通信解决思路
  3. 21. DNS 配置和端口检测
  4. STM32芯片型号的命名解读
  5. 必修三计算机选修三知识点,数学必修三重要知识点汇总
  6. 发布四大战略举措,亚马逊云科技看准了中国云市场的哪些新机会?
  7. 国产汽车级可编程线性霍尔传感器CHA611,可以替代Allegro的A1363系列产品,解决汽车级芯片缺货难题
  8. 直线与圆位置关系的c语言,直线与圆的位置关系教学设计范文
  9. 常见鸟的种类及特点_常见鸟的种类有哪些
  10. catia 数控加工仿真 界面属性设置