搜索
bottom↓
回复: 30

计步器(pedometer)算法(转载)希望有更好的算法有人提出

  [复制链接]

出0入0汤圆

发表于 2014-11-1 10:15:30 | 显示全部楼层 |阅读模式
本帖最后由 liupeng08305 于 2014-11-1 10:17 编辑

基于3轴加速度计ADXL345的全功能计步器设计
简介
计步器是一种颇受欢迎的日常锻炼进度监控器,可以激励人们挑战自己,增强体质,帮助瘦身。早期设计利用加重的机械开关检测步伐,并带有一个简单的计数器。晃动这些装置时,可以听到有一个金属球来回滑动,或者一个摆锤左右摆动敲击挡块。
如今,先进的计步器利用MEMS(微机电系统)惯性传感器和复杂的软件来精确检测真实的步伐。MEMS惯性传感器可以更准确地检测步伐,误检率更低。MEMS惯性传感器具有低成本、小尺寸和低功耗的特点,因此越来越多的便携式消费电子设备开始集成计步器功能,如音乐播放器和手机等。ADI公司的3轴加速度计ADXL335, ADXL345和 ADXL346小巧纤薄,功耗极低,非常适合这种应用。
本文以对步伐特征的研究为基础,描述一个采用3轴
图1. 各轴的定义
让我们考虑步行的特性。图2描绘了一个步伐,我们将其定义为单位步行周期,图中显示了步行周期各阶段与竖向和前向加速度变化之间的关系。

图2. 步行阶段与加速度模式
图3显示了与一名跑步者的竖向、前向和侧向加速度相对应的x、y和z轴测量结果的典型图样。无论如何穿戴计步器,总有至少一个轴具有相对较大的周期性加速度变化,因此峰值检测和针对所有三个轴上的加速度的动态阈值决策算法对于检测单位步行或跑步周期至关重要。

图3. 从一名跑步者测得的x、y和z轴加速度的典型图样
 
算法
步伐参数
数字滤波器:首先,为使图3所示的信号波形变得平滑,需要一个数字滤波器。可以使用四个寄存器和一个求和单元,如图4所示。当然,可以使用更多寄存器以使加速度数据更加平滑,但响应时间会变慢。

图4. 数字滤波器
图5显示了来自一名步行者所戴计步器的最活跃轴的滤波数据。对于跑步者,峰峰值会更高。

图5. 最活跃轴的滤波数据
动态阈值和动态精度:系统持续更新3轴加速度的最大值和最小值,每采样50次更新一次。平均值(Max + Min)/2称为“动态阈值”。接下来的50次采样利用此阈值判断个体是否迈出步伐。由于此阈值每50次采样更新一次,因此它是动态的。这种选择具有自适应性,并且足够快。除动态阈值外,还利用动态精度来执行进一步滤波,如图6所示。

图6. 动态阈值和动态精度
利用一个线性移位寄存器和动态阈值判断个体是否有效地迈出一步。该线性移位寄存器含有2个寄存器:sample_new寄存器和sample_old寄存器。这些寄存器中的数据分别称为sample_new和sample_old。当新采样数据到来时,sample_new无条件移入sample_old寄存器。然而,sample_result是否移入sample_new寄存器取决于下述条件:如果加速度变化大于预定义精度,则最新的采样结果sample_result移入sample_new寄存器,否则sample_new寄存器保持不变。因此,移位寄存器组可以消除高频噪声,从而保证结果更加精确。
步伐迈出的条件定义为:当加速度曲线跨过动态阈值下方时,加速度曲线的斜率为负值(sample_new < sample_old)。 .
峰值检测:步伐计数器根据x、y、z三轴中加速度变化最大的一个轴计算步数。如果加速度变化太小,步伐计数器将忽略。
步伐计数器利用此算法可以很好地工作,但有时显得太敏感。当计步器因为步行或跑步之外的原因而非常迅速或非常缓慢地振动时,步伐计数器也会认为它是步伐。为了找到真正的有节奏的步伐,必须排除这种无效振动。利用“时间窗口”和“计数规则”可以解决这个问题。
“时间窗口”用于排除无效振动。假设人们最快的跑步速度为每秒5步,最慢的步行速度为每2秒1步。这样,两个有效步伐的时间间隔在时间窗口[0.2 s - 2.0 s]之内,时间间隔超出该时间窗口的所有步伐都应被排除。
ADXL345的用户可选输出数据速率特性有助于实现时间窗口。表1列出了TA = 25°C, VS = 2.5 V, and VDD I/O = 1.8 V时的可配置数据速率(以及功耗)。
表1. 数据速率和功耗
输出数据 速率 (Hz)        带宽 (Hz)        速率 代码        IDD (µA)
3200        1600        1111        146
1600        800        1110        100
800        400        1101        145
400        200        1100        145
200        100        1011        145
100        50        1010        145
50        25        1001        100
25        12.5        1000        65
12.5        6.25        0111        55
6.25        3.125        0110        40
 
此算法使用50 Hz数据速率(20 ms)。采用interval的寄存器记录两步之间的数据更新次数。如果间隔值在10与100之间,则说明两步之间的时间在有效窗口之内;否则,时间间隔在时间窗口之外,步伐无效。
“计数规则” 用于确定步伐是否是一个节奏模式的一部分。步伐计数器有两个工作状态:搜索规则和确认规则。步伐计数器以搜索规则模式开始工作。假设经过四个连续有效步伐之后,发现存在某种规则(in regulation),那么步伐计数器就会刷新和显示结果,并进入“确认规则”工作模式。在这种模式下工作时,每经过一个有效步伐,步伐计数器就会更新一次。但是,如果发现哪怕一个无效步伐,步伐计数器就会返回搜索规则模式,重新搜索四个连续有效步伐。
图7显示了步伐参数的算法流程图。

图7. 步伐参数算法流程图
距离参数
根据上述算法计算步伐参数之后,我们可以使用公式1获得距离参数。
         距离 = 步数 × 每步距离        (1)
每步距离取决于用户的速度和身高。如果用户身材较高或以较快速度跑步,步长就会较长。参考设计每2秒更新一次距离、速度和卡路里参数。因此,我们使用每2秒计数到的步数判断当前跨步长度。表2显示了用于判断当前跨步长度的实验数据。
表2. 跨步长度与速度(每2秒步数)和身高的关系
每2秒步数        跨步(m/s)
0~2        身高/5
2~3        身高/4
3~4        身高/3
4~5        身高/2
5~6        身高/1.2
6~8        身高
>=8        1.2 ×身高
 
2秒的时间间隔可以利用采样数精确算出。以50 Hz数据速率为例,处理器可以每100次采样发送一次相应的指令。处理器利用一个名为m_nLastPedometer的变量记录每个2秒间隔开始时的步数,并利用一个名为m_nPedometerValue的变量记录每个2秒间隔结束时的步数。这样,每2秒步数等于m_nPedometerValue与m_nLastPedometer之差。
虽然数据速率为50 Hz,但ADXL345的片内FIFO使得处理器无需每20 ms读取一次数据,极大地减轻了主处理器的负担。该缓冲器支持四种工作模式:旁路、FIFO、流和触发。在FIFO模式下,x、y、z轴的测量数据存储在FIFO中。当FIFO中的采样数与FIFO_CTL寄存器采样数位规定的数量相等时,水印中断置1。如前所述,人们的跑步速度最快可达每秒5步,因此每0.2秒刷新一次结果即可保证实时显示,从而处理器只需每0.2秒通过水印中断唤醒一次并从ADXL345读取数据。FIFO的其它功能也都非常有用。利用触发模式,FIFO可以告诉我们中断之前发生了什么。由于所述解决方案没有使用FIFO的其它功能,因此笔者将不展开讨论。 本文来自电子发烧友网(http://www.elecfans.com)
速度参数
速度 = 距离/时间,而每2秒步数和跨步长度均可根据上述算法计算,因此可以使用公式2获得速度参数。

         速度 = 每2秒步数 × 跨步/2 s        (2)
卡路里参数
我们无法精确计算卡路里的消耗速率。决定其消耗速率的一些因素包括体重、健身强度、运动水平和新陈代谢。不过,我们可以使用常规近似法进行估计。表3显示了卡路里消耗与跑步速度的典型关系。
表3. 卡路里消耗与跑步速度的关系
跑步速度 (km/h)        卡路里消耗(C/kg/h)
8        10
12        15
16        20
20        25
 
由表3可以得到公式(3)。
         卡路里(C/kg/h) = 1.25 × 跑步速度(km/h)        (3)
以上所用的速度参数单位为m/s,将km/h转换为m/s可得公式4。
         卡路里(C/kg/h) = 1.25 × 速度(m/s) × 3600/1000        (4)
卡路里参数随同距离和速度参数每2秒更新一次。为了考虑运动者的体重,我们可以将公式4转换为公式5。体重(kg)为用户输入量,一个小时等于1800个2秒间隔。
         卡路里(C/2 s) = 4.5 × 速度 × 体重/1800        (5)
如果用户在步行或跑步之后休息,则步数和距离将不变化,速度应为0,此时的卡路里消耗可以利用公式6计算(休息时的卡路里消耗约为1 C/kg/h)。
         卡路里(C/2 s) = 1 × 体重/1800        (6)
最后,我们可以将所有2秒间隔的卡路里相加,获得总卡路里消耗量。
硬件连接
ADXL345易于连接到任何使用I2C®或SPI数字通信协议的处理器。图8给出了演示设备的原理示意图,它采用3V电池供电。ADXL345的/CS引脚连接到板上的VS,以选择I2C模式。利用一个低成本精密模拟微控制器ADuC7024从ADXL345读取数据,执行算法,并通过UART将结果发送至PC。SDA和SCL分别为I2C总线的数据和时钟引脚,从ADXL345连接到ADuC7024的对应引脚。ADXL345的两个中断引脚连接到ADuC7024的IRQ输入,以产生各种中断信号并唤醒处理器。

图8. 硬件系统的原理示意图
用户界面
用户界面显示测试数据,并对操作员的指令做出响应。用户界面(UI)运行之后,串行端口应打开,通信链路应启动,随后演示程序将持续运行。图9显示了用户佩戴计步器步行或跑步时的测试情况。用户可以输入其体重和身高数据,距离、速度和卡路里参数将根据这些数据进行计算。

图9. 用户佩戴计步器步行或跑步时的测试情况
结论
ADXL345是一款出色的加速度计,非常适合计步器应用。它具有小巧纤薄的特点,采用3 mm × 5 mm × 0.95 mm塑封封装,利用它开发的计步器已经出现在医疗仪器和高档消费电子设备中。它在测量模式下的功耗仅40 µA,待机模式下为0.1 µA,堪称电池供电产品的理想之选。嵌入式FIFO极大地减轻了主处理器的负荷,使功耗显著降低。此外,可以利用可选的输出数据速率进行定时,从而取代处理器中的定时器。13位分辨率可以检测非常小的峰峰值变化,为开发高精度计步器创造了条件。最后,它具有三轴输出功能,结合上述算法,用户可以将计步器戴在身上几乎任何部位。
几点建议:如果应用对成本极其敏感,或者模拟输出加速度计更适合,建议使用ADXL335,它是一款完整的小尺寸、薄型、低功耗、三轴加速度计,提供经过信号调理的电压输出。如果PCB尺寸至关重要,建议使用ADXL346,这款低功耗器件的内置功能甚至比ADXL345还多,采用小巧纤薄的3 mm × 3 mm × 0.95 mm塑封封装,电源电压范围为1.7 V至2.75 V。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-11-1 10:32:29 | 显示全部楼层
可以参考一本 日本人写的PIC入门书籍  里头好像也有用三轴加速度计步计应用的  

出0入0汤圆

发表于 2014-11-1 10:38:07 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2014-11-1 10:48:37 | 显示全部楼层
十几年前就见过最简单的计步器,,,一个小摆锤(类似小行程开关上的金属压片),一坨牛屎ic,一个段式屏,一个垃圾纽扣电池,了事,,,哪有lz的那么高大上!

出0入0汤圆

 楼主| 发表于 2014-11-1 10:49:43 | 显示全部楼层
我目前用这个算法戴在手上大概85%的精度,不知道有没有办法提高

出0入0汤圆

 楼主| 发表于 2014-11-1 10:51:41 | 显示全部楼层
tangcangeng 发表于 2014-11-1 10:32
可以参考一本 日本人写的PIC入门书籍  里头好像也有用三轴加速度计步计应用的   ...

麻烦帮忙找下书名,先谢谢啦

出0入0汤圆

发表于 2014-11-1 11:54:50 | 显示全部楼层
不错,mark!

出0入0汤圆

发表于 2014-11-1 13:38:10 | 显示全部楼层
很不错的东西啊,觉得非常有想法

出0入0汤圆

发表于 2014-11-1 14:03:40 | 显示全部楼层
感谢楼主分享

出0入17汤圆

发表于 2014-11-1 14:14:49 | 显示全部楼层
liupeng08305 发表于 2014-11-1 10:49
我目前用这个算法戴在手上大概85%的精度,不知道有没有办法提高

戴在腰上,准确度会比较高。

带手上就要考虑手的摇摆,就不是这个模型了。

出0入0汤圆

发表于 2014-11-1 14:27:21 | 显示全部楼层
收藏了,有机会深入拜读

出0入0汤圆

发表于 2014-11-1 14:40:43 | 显示全部楼层
mark,算法不懂,看下

出0入0汤圆

发表于 2014-11-1 15:09:15 | 显示全部楼层
学习,多谢楼主分享

出0入0汤圆

发表于 2014-11-1 15:38:23 | 显示全部楼层
mark!我也有一款,但是不方便公开!

出0入10汤圆

发表于 2014-11-1 15:49:28 | 显示全部楼层
liupeng08305 发表于 2014-11-1 10:49
我目前用这个算法戴在手上大概85%的精度,不知道有没有办法提高


我也做过,最高达到100%,一般是相差2~4步,没有心思去看楼主的算法。
http://v.youku.com/v_show/id_XNzgxMjM1NTQ0.html

出0入0汤圆

发表于 2014-11-1 15:50:51 | 显示全部楼层
鞋上的应该最准确。

出0入0汤圆

 楼主| 发表于 2014-11-1 17:55:40 | 显示全部楼层
wicy001 发表于 2014-11-1 14:14
戴在腰上,准确度会比较高。

带手上就要考虑手的摇摆,就不是这个模型了。

这个测试的时候是戴在手上测试的,能不能给个参考模型参考一下!

出0入0汤圆

 楼主| 发表于 2014-11-1 17:57:25 | 显示全部楼层
10xjzheng 发表于 2014-11-1 15:49
我也做过,最高达到100%,一般是相差2~4步,没有心思去看楼主的算法。
http://v.youku.com/v_show/id_XNz ...

这个算法是转载的,希望可以把算法的思想提出来大家交流一下!

出0入0汤圆

发表于 2014-11-1 18:04:52 | 显示全部楼层
不错,很有启发!楼主有心了!

出0入0汤圆

发表于 2014-11-1 23:19:58 | 显示全部楼层
谢谢楼主分享

出0入17汤圆

发表于 2014-11-2 07:53:44 | 显示全部楼层
liupeng08305 发表于 2014-11-1 17:55
这个测试的时候是戴在手上测试的,能不能给个参考模型参考一下!

参考下这个文章吧
http://wenku.baidu.com/link?url= ... VGx1AiNvuNyYLL8ieDi

还可以去各加速度传感器的官网看看,说不定有意想不到的收获。

出0入0汤圆

 楼主| 发表于 2014-11-3 11:21:15 | 显示全部楼层
wicy001 发表于 2014-11-2 07:53
参考下这个文章吧
http://wenku.baidu.com/link?url=Ip7ut5uSqAR6EoSPslNW87js8eaySfxYzqKBcrovMOpxL_SCd ...

感谢

出0入24汤圆

发表于 2016-1-18 09:54:08 | 显示全部楼层
Mark!学习了

出0入42汤圆

发表于 2016-1-18 14:11:15 | 显示全部楼层
liupeng08305 发表于 2014-11-1 10:49
我目前用这个算法戴在手上大概85%的精度,不知道有没有办法提高

这个是ADI的人出的算法吧,它这个本身就不适合戴在手上吧。这个应该是戴在身上比较准,戴在手上你能找到敏感轴吗?

出0入42汤圆

发表于 2016-1-18 14:22:31 | 显示全部楼层
10xjzheng 发表于 2014-11-1 15:49
我也做过,最高达到100%,一般是相差2~4步,没有心思去看楼主的算法。
http://v.youku.com/v_show/id_XNz ...

你这个算法跑两步试试,是否有走的那么准确 ?

出0入10汤圆

发表于 2016-1-18 19:45:42 | 显示全部楼层
liyang121316 发表于 2016-1-18 14:22
你这个算法跑两步试试,是否有走的那么准确 ?

跑步也是2~4步的误差

出0入42汤圆

发表于 2016-1-18 19:53:13 | 显示全部楼层
10xjzheng 发表于 2016-1-18 19:45
跑步也是2~4步的误差

那你的算法比小米手环的强悍多了。

出0入0汤圆

发表于 2016-1-21 06:58:14 | 显示全部楼层
一直很好奇是怎么做的,终于看到原理了

出0入0汤圆

发表于 2017-8-21 16:34:21 | 显示全部楼层
10xjzheng 发表于 2016-1-18 19:45
跑步也是2~4步的误差

手跑和走不这么规范呢?不同人走路跑步习惯不一样

出0入10汤圆

发表于 2017-8-21 18:22:04 | 显示全部楼层
qinhuan7 发表于 2017-8-21 16:34
手跑和走不这么规范呢?不同人走路跑步习惯不一样

没有,算法还是有一点鲁棒性的,主要是检测像正弦波一样的波形,大概变下都没有问题。
最近看到这篇文章还是挺好的,可以看看,帖主可以的话,帮助置顶下。
http://www.aosabook.org/en/500L/ ... the-real-world.html

出0入10汤圆

发表于 2017-8-21 18:23:42 | 显示全部楼层
qinhuan7 发表于 2017-8-21 16:34
手跑和走不这么规范呢?不同人走路跑步习惯不一样

算法还是有一点鲁棒性的,都是一上一下类似正弦波的波形。
这篇可以看看,我还没有看:
http://www.aosabook.org/en/500L/ ... the-real-world.html
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 23:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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