OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 3185|回复: 25

计步算法的看过来....

[复制链接]

  离线 

3

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2014-2-24
在线时间
191 小时
发表于 2016-10-14 22:40:56 | 显示全部楼层 |阅读模式
正点原子公众号

国庆之后,想学一下计步算法,忙了几天,分享下自己的算法与芯片内置的算法比较,如果各位有好的算法介绍的也分享一下吧.....
1、手机内部加速度波形分析;
2、MPU6050内部计步输出;
3、自己编写的算法,其实也就是参考网上的;
4、......

     有比较才有伤害...手机输出的波形可以帮你改善算法,毕竟手机上APP计步的数据也是从这里输出的。

1、手机内部加速度的波形。
     本人手机moto g2,是个战斗机。手机加速度输出数据范围均为±9.81g,手机平放屏幕朝上,X、Y和Z轴分别如下图。
手机示意图.jpg

    下面都是左手拿手机(手机背面朝手心),不同拿法走动得到的波形图(数据已经线性放大18倍),黄色曲线为Z轴,绿色曲线为X轴,红色曲线为Y轴。
     1) 手机摆动Y轴(手机右侧朝地面):

手机Y轴平行地面

手机Y轴平行地面

    2) 手机摆动X轴(手机顶端朝地面):

手机顶端平行地面

手机顶端平行地面

  3) 手机摆动Z轴(背面朝地面):

手机背面平行地面

手机背面平行地面



    下面是DMP读取3个轴的加速度,经过滤波后的波形如下,黄色曲线为Z轴,绿色曲线为X轴,红色曲线为Y轴:
    1) 摆动Y轴:

MPU6050-摆动Y轴

MPU6050-摆动Y轴

    2)摆动X轴:

MPU6050-摆动X轴

MPU6050-摆动X轴

   3)摆动Z轴:

MPU6050-摆动Z轴

MPU6050-摆动Z轴


2、MPU6050的DMP可以直接输出行走的步数,用到的函数有:
    dmp_set_pedometer_walk_time(); //设置行走时间
    dmp_get_pedometer_walk_time(); //获取行走时间
    dmp_set_pedometer_step_count();//设置步数
    dmp_get_pedometer_step_count();//获取步数
    这里我直接获取步数,其他函数怎么用和有什么用看DMP官方使用手册: MPU6050-DMP官方使用手册.pdf (190.73 KB, 下载次数: 472)
回复

使用道具 举报

  离线 

3

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2014-2-24
在线时间
191 小时
 楼主| 发表于 2016-11-22 17:21:40 | 显示全部楼层

RE: 计步算法的看过来....

从上位机上截取我的计步算法...
   注:输入的数据一定要进行滤波再送把数据进去....
   附件 app.zip (1.06 KB, 下载次数: 491)
回复 支持 反对

使用道具 举报

  离线 

13

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2016-1-4
在线时间
82 小时
发表于 2016-10-19 14:29:06 | 显示全部楼层
顶一个,赞
回复 支持 反对

使用道具 举报

  离线 

13

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
477
金钱
477
注册时间
2016-1-4
在线时间
82 小时
发表于 2016-11-12 13:38:20 | 显示全部楼层
大赞one个
回复 支持 反对

使用道具 举报

  离线 

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-9-8
在线时间
21 小时
发表于 2016-11-20 16:33:05 | 显示全部楼层
最近也在做这个,我用单片机处理加速度数据,但是那个阈值设的不好,计步不太准。楼主能分享下你的代码么?
回复 支持 反对

使用道具 举报

  离线 

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-9-8
在线时间
21 小时
发表于 2016-11-20 16:34:32 | 显示全部楼层
最近也在做计步。我用单片机处理数据的,但是效果不太好,能分享代码么
回复 支持 反对

使用道具 举报

  离线 

3

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2014-2-24
在线时间
191 小时
 楼主| 发表于 2016-11-22 17:23:39 | 显示全部楼层
xrq1995 发表于 2016-11-20 16:34
最近也在做计步。我用单片机处理数据的,但是效果不太好,能分享代码么

已共享在2楼
回复 支持 反对

使用道具 举报

  离线 

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-9-8
在线时间
21 小时
发表于 2016-11-23 11:08:29 | 显示全部楼层
小小怪 发表于 2016-11-22 17:21
从上位机上截取我的计步算法...
   注:输入的数据一定要进行滤波再送把数据进去....
   附件

只有一个 .c 文件呀         
nowPos = (unsigned int)powf(sqrtf(axis0) + sqrtf(axis1) + sqrtf(axis2), 0.5);这个就看不懂了
回复 支持 反对

使用道具 举报

  离线 

3

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2014-2-24
在线时间
191 小时
 楼主| 发表于 2016-11-23 13:09:49 | 显示全部楼层
xrq1995 发表于 2016-11-23 11:08
只有一个 .c 文件呀         
nowPos = (unsigned int)powf(sqrtf(axis0) + sqrtf(axis1) + sqrtf(axis2), 0.5 ...

这是数学函数,添加#include "math.h"
回复 支持 反对

使用道具 举报

  离线 

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-9-8
在线时间
21 小时
发表于 2016-11-23 18:25:15 | 显示全部楼层
xrq1995 发表于 2016-11-23 11:08
只有一个 .c 文件呀         
nowPos = (unsigned int)powf(sqrtf(axis0) + sqrtf(axis1) + sqrtf(axis2), 0.5 ...

看懂了。可以直接移植到Stm32上么? 滤波是用卡曼儿滤波么?
回复 支持 反对

使用道具 举报

  离线 

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-9-8
在线时间
21 小时
发表于 2016-11-24 10:58:39 | 显示全部楼层

你用的 加速度量程 是正负2g吗?  dmp的波形是用什么软件得到的
回复 支持 反对

使用道具 举报

  离线 

3

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2014-2-24
在线时间
191 小时
 楼主| 发表于 2016-11-29 09:43:08 | 显示全部楼层
xrq1995 发表于 2016-11-24 10:58
你用的 加速度量程 是正负2g吗?  dmp的波形是用什么软件得到的

用满量程,波形数据可以找个上位机什么的,比如匿名的。我写的这个软件依赖java环境,响应有些慢,就不发出了
回复 支持 反对

使用道具 举报

  离线 

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-9-8
在线时间
21 小时
发表于 2016-12-1 10:36:41 | 显示全部楼层
小小怪 发表于 2016-11-29 09:43
用满量程,波形数据可以找个上位机什么的,比如匿名的。我写的这个软件依赖java环境,响应有些慢,就不发 ...

我也在Java。好巧。我用匿名得到波形了也是满量程的。
你的程序里有     timeDiff = GetTime() - lastTime;          GetTime()这个函数怎么实现呀?
回复 支持 反对

使用道具 举报

  离线 

3

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2014-2-24
在线时间
191 小时
 楼主| 发表于 2016-12-2 12:28:33 | 显示全部楼层
xrq1995 发表于 2016-12-1 10:36
我也在Java。好巧。我用匿名得到波形了也是满量程的。
你的程序里有     timeDiff = GetTime() - lastTi ...

GetTime()是系统运行时间,可由系统滴答时钟或者定时器得到时间阀门timeDiff。
回复 支持 反对

使用道具 举报

  离线 

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-9-8
在线时间
21 小时
发表于 2016-12-9 11:34:38 来自手机 | 显示全部楼层
好的,最近在准备期末考试。
回复 支持 反对

使用道具 举报

  离线 

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-9-8
在线时间
21 小时
发表于 2017-2-12 10:33:34 | 显示全部楼层
Gettimes 是下位机的系统运行时间吧
回复 支持 反对

使用道具 举报

  离线 

3

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2014-2-24
在线时间
191 小时
 楼主| 发表于 2017-2-12 12:59:37 | 显示全部楼层
xrq1995 发表于 2017-2-12 10:33
Gettimes 是下位机的系统运行时间吧

单片机解析数据就是单片机的时间
回复 支持 反对

使用道具 举报

  离线 

4

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-9-8
在线时间
21 小时
发表于 2017-2-12 15:16:57 | 显示全部楼层
小小怪 发表于 2017-2-12 12:59
单片机解析数据就是单片机的时间

昂,好的,你进度咋样
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

Rank: 1

积分
7
金钱
7
注册时间
2017-4-10
在线时间
0 小时
发表于 2017-4-10 17:07:14 | 显示全部楼层
小小怪 发表于 2016-11-22 17:21
从上位机上截取我的计步算法...
   注:输入的数据一定要进行滤波再送把数据进去....
   附件

你好,请问你这上位机记步是用是什么软件写的?
回复 支持 反对

使用道具 举报

  离线 

3

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2014-2-24
在线时间
191 小时
 楼主| 发表于 2017-4-10 20:34:14 | 显示全部楼层
731265863 发表于 2017-4-10 17:07
你好,请问你这上位机记步是用是什么软件写的?

processing 3.x是个挺不错的软件
回复 支持 反对

使用道具 举报

  离线 

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-11
在线时间
28 小时
发表于 2017-4-12 14:28:06 | 显示全部楼层
本帖最后由 ygxdh 于 2017-4-12 14:30 编辑
小小怪 发表于 2016-11-22 17:21
从上位机上截取我的计步算法...
   注:输入的数据一定要进行滤波再送把数据进去....
   附件

楼主,您好。我参考你给的压缩包里的算法。但是为什么我计的步数始终是0呢?  大家能不能帮小白看一下呢,谢谢啦?这是我编写的程序 ADX345计步数.zip (5.06 MB, 下载次数: 156)

STEP总是0

STEP总是0
回复 支持 反对

使用道具 举报

  离线 

3

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
512
金钱
512
注册时间
2014-2-24
在线时间
191 小时
 楼主| 发表于 2017-4-12 20:15:42 | 显示全部楼层
本帖最后由 小小怪 于 2017-4-12 20:20 编辑
ygxdh 发表于 2017-4-12 14:28
楼主,您好。我参考你给的压缩包里的算法。但是为什么我计的步数始终是0呢?  大家能不能帮小白看一下呢 ...

程序我就不看了,建议调试步骤:
1. 你正常摆动的时候看下X,Y,Z的范围
2. 然后适当修改#define P_P_DIFF          1000 ,这个阈值

PS:确保数据正常后再调,另外我送进计步函数的是经过滤波后的加速度值,不是角度哦,所以这个P_P_DIFF我定为1000

先要逼自己会看程序,不然没进步。 我等你们调试个自动阈值的出来

回复 支持 反对

使用道具 举报

  离线 

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-3-11
在线时间
28 小时
发表于 2017-4-12 20:58:30 | 显示全部楼层
小小怪 发表于 2017-4-12 20:15
程序我就不看了,建议调试步骤:
1. 你正常摆动的时候看下X,Y,Z的范围
2. 然后适当修改#define P_P_D ...

好的,谢谢楼主
回复 支持 反对

使用道具 举报

  离线 

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2017-4-20
在线时间
19 小时
发表于 2017-8-1 10:03:08 | 显示全部楼层
就需要这样的额楼主
回复 支持 反对

使用道具 举报

  离线 

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2017-4-20
在线时间
19 小时
发表于 2017-8-19 09:36:44 | 显示全部楼层
为楼主点赞啊
回复 支持 反对

使用道具 举报

  离线 

6

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2017-8-21
在线时间
35 小时
发表于 2017-8-21 16:17:52 | 显示全部楼层
楼主nowPos = (unsigned int)powf(sqrtf(axis0) + sqrtf(axis1) + sqrtf(axis2), 0.5)这个函数写错了,你这里连开了两次根号。不知道你这个还有什么别的注意的问题没,我用了下发现步数一直为0
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-18 16:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */