原有iOS计步器采用系统框架swift语言调用

/// 传感器

///

/// - Parameter callbcak: 步数steps+距离distance

func caculateSensor(callbcak:@escaping(_ steps:Int,_ distance:Float) ->()) {

if CMPedometer.isStepCountingAvailable() && CMPedometer.isDistanceAvailable() {

self.sensor.startUpdates(from: Date(), withHandler: { (pedometerData:CMPedometerData?, error:Error?) in

if pedometerData != nil {

if pedometerData?.numberOfSteps != nil && pedometerData?.distance != nil{

callbcak(pedometerData?.numberOfSteps as! Int,(pedometerData?.distance?.floatValue)!);

}

}

})

}

}

改为三轴传感器的计步器实现

图片.png

开启陀螺仪采集三轴数据

/**

* 开启陀螺仪

*/

-(void)startUpdateAccelerometer{

/* 设置采样的频率,单位是秒 */

NSTimeInterval updateInterval = 1/30.0; // 每秒采样30次 ()

/* 判断是否加速度传感器可用,如果可用则继续 */

if ([self.motionManager isAccelerometerAvailable] == YES) {

/* 给采样频率赋值,单位是秒 */

[self.motionManager setAccelerometerUpdateInterval:updateInterval];

/* 加速度传感器开始采样,每次采样结果在block中处理 */

[self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error)

{

CGFloat sqrtValue =sqrt(accelerometerData.acceleration.x*accelerometerData.acceleration.x+accelerometerData.acceleration.y*accelerometerData.acceleration.y+accelerometerData.acceleration.z*accelerometerData.acceleration.z); //采集到的三轴加速度矢量长度

[self detectorNewStep:sqrtValue]; //输入算法计算

}];

}

}

计步核心

/*

* 检测步子,并开始计步

* 1.传入sersor中的数据

* 2.如果检测到了波峰,并且符合时间差以及阈值的条件,则判定为1步

* 3.符合时间差条件,波峰波谷差值大于initialValue,则将该差值纳入阈值的计算中

* */

-(void)detectorNewStep:(float) value{

if (gravityOld == 0) {

gravityOld = value;//第一次记录

} else {

//如果是波峰

if ([self detectorPeak:value OldValue:gravityOld]) {

timeOfNow = [self nowTimeInterverl];//当前时间

//是否修改初始阀值(ThreadValue=2)两个波峰的时间差(一步时间)大于0.22s

if (timeOfNow - timeOfLastPeak >= 220

&& (peakOfWave - valleyOfStepMinWave >= initialValue)) {

ThreadValue = [self peak_Valley_thread:(peakOfWave - valleyOfWave)];//调用阀值计算

}

//是否步点 波峰-波谷>=动态阀值ThreadValue

if (timeOfNow - timeOfLastPeak >= 220 && (peakOfWave - valleyOfWave >= ThreadValue)) {

timeOfLastPeak = timeOfNow;;//记录波峰时间

/*

* 更新界面的处理,不涉及到算法

* 一般在通知更新界面之前,增加下面处理,为了处理无效运动:

* 1.连续记录10才开始计步

* 2.例如记录的9步用户停住超过3秒,则前面的记录失效,下次从头开始

* 3.连续记录了9步用户还在运动,之前的数据才有效

*

*/

motion_step ++;//步数

is_motion_step_add = true;//is_motion_step_add 是否步数增加(修改波谷最小值)

self.stepCallback(motion_step);//刷新页面数据

}

}

}

gravityOld = value;

}

波峰检测

/*

* 检测波峰

* 以下四个条件判断为波峰:

* 1.目前点为下降的趋势:isDirectionUp为false

* 2.之前的点为上升的趋势:lastStatus为true

* 3.到波峰为止,持续上升大于等于2次

* 4.波峰值大于20

* 记录波谷值

* 1.观察波形图,可以发现在出现步子的地方,波谷的下一个就是波峰,有比较明显的特征以及差值

* 2.所以要记录每次的波谷值,为了和下次的波峰做对比

* */

-(BOOL) detectorPeak:(float)newValue OldValue:(float)oldValue{

lastStatus = isDirectionUp;

if (newValue >= oldValue) {// 正在上升

isDirectionUp = YES;

continueUpCount++;

} else {// 下降

continueUpFormerCount = continueUpCount;

continueUpCount = 0;

isDirectionUp = NO;

}

// 此时下降,上一个点状态是上升 且 (继续上升的个数 >= 2 或者oldValue > 20)

if (!isDirectionUp && lastStatus

&& (continueUpFormerCount >= 2 || oldValue >= 20)) {// 波峰

peakOfWave = oldValue;

return YES;

} else if (!lastStatus && isDirectionUp) {// 波谷

if (valleyOfWave > oldValue || is_motion_step_add) {//选出波峰到来前的最低波谷值

is_motion_step_add = false;

valleyOfWave = oldValue;

}

return NO;

} else {

return NO;

}

}

阀值的计算

/*

* 阈值的计算

* 1.通过波峰波谷的差值计算阈值

* 2.记录4个值,存入tempValue[]数组中

* 3.在将数组传入函数averageValue中计算阈值

*/

-(float)peak_Valley_thread:(float)value{

float tempThread = ThreadValue;

if (tempValue.count < 4) {

tempValue[tempCount] = @(value);

tempCount++;

} else {

tempThread = [self averageValue:tempValue Num:4];

for (int i = 1; i < 4; i++) {

tempValue[i-1] = tempValue[i];

}

tempValue[3] = @(value);

}

return tempThread;

}

/* 梯度化阈值

* 1.计算数组的均值

* 2.通过均值将阈值梯度化在一个范围里

* */

-(float)averageValue:(NSMutableArray *)value Num:(int)n{

float ave = 0;

for (int i = 0; i < n; i++) {

ave += [value[i] floatValue];

}

ave = ave / 4.0;

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.28;

else if (ave >= 3 && ave < 4)

ave = (float) 1.98;

else {

ave = (float) initialValue;//initialValue = 1.1 最低波峰波谷差。

}

return ave;

}

计步器算法的c语言代码,基于三轴传感器的计步器代码实现-iOS相关推荐

  1. 基于三轴加速度传感器的计步算法

    基于三轴加速度传感器计步算法 By Sky.J 2018.08.08 概述 今天主要是想要分享利用三轴加速度传感器计步的一个算法步骤. 数据分析--->模型 这里拿到的是ADI公司的测试数据,可 ...

  2. 【翻译】利用加速度求解位置的算法——三轴传感器

    cposture 一个小白的技术成长之路 [翻译]利用加速度求解位置的算法--三轴传感器 http://www.cnblogs.com/cposture/p/4378922.html 摘要      ...

  3. 利用加速度求解位置的算法——三轴传感器

    转载的一篇文章,跟自己做过的一个车载项目类似,也算是标记一下吧. ---------------------------------------分割线------------------------- ...

  4. DA14580开发板与lis2ds12三轴传感器数据显示实现

    目录 第一:DA14580芯片 第二:DA14580 开发例程目录和SDK目录结构 第三:了解SDK例程代码 第四:蓝牙profile和应用的角色和分工 第五:应用开发框架 第六:LIS2DS12三轴 ...

  5. 基础实验——三轴传感器

    基础实验--三轴传感器 MMA7660FC 测速原理 加速度传感器实验 所选设备 基本案例 示例代码:制作水平仪 加速度传感器是一种能够测量加速度的传感器.通常由质量块.阻尼器.弹性元件.敏感元件和适 ...

  6. STM32驱动ADXL345三轴传感器

    简介:STM32F103C8T6驱动ADXL345三轴倾斜度传感器源码介绍. 开发平台:KEIL ARM MCU型号:STM32F103C8T6 传感器型号:ADXL345 特别提示:驱动内可能使用了 ...

  7. matlab强化学习DDPG算法改编/菜鸟理解2——航天器三轴姿态稳定器学习算例

    目录 写在前面 matlab强化学习库简介 航天器三轴姿态稳定器介绍 算法流程 代码/simulink 结果展示与分析 一些心得 写在最后 写在前面 %写在前面: 本人大四狗一名,不是计算机专业,所以 ...

  8. matlab各种潮流计算代码,基于MATLAB的潮流计算源程序代码

    <基于MATLAB的潮流计算源程序代码>由会员分享,可在线阅读,更多相关<基于MATLAB的潮流计算源程序代码(7页珍藏版)>请在人人文库网上搜索. 1.*电力系统直角坐标系下 ...

  9. python3爬虫项目代码_三个python爬虫项目实例代码

    这篇文章主要介绍了三个python爬虫项目实例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 爬取内涵段子: #encoding=utf-8 i ...

最新文章

  1. java配置mq环境变量_RocketMQ学习-01安装及环境配置
  2. Java String.format() : 字符串格式化
  3. 【Qt】QModbusRequest类
  4. FFmpeg从入门到精通:SEI那些事
  5. Oracle数据库的备份
  6. LeetCode 1940. 排序数组之间的最长公共子序列(二分查找)
  7. JEECG_3.7 权限开发视频正式发布
  8. 机器学习实战 梯度上升 数学推导_机器学习全路线经典书籍
  9. 2018年,这100家AI公司值得关注!CB Insights选出AI 100第二季
  10. 【matlab】直方图均衡化
  11. 关于ios7的适配问题
  12. 学生选课管理信息系统
  13. 计算机网络 —— 冲突域和广播域
  14. 如何恢复误删的注册表
  15. 基础测绘数据分类标准
  16. 代码练习——数组_实战
  17. Gephi安装教程——1
  18. 如何无损合并video.m4s与audio.m4s为mp4文件
  19. 水库大坝安全监测监控系统平台axure分析+辽阳市水库大坝安全检测平台+志豪未来科技有限公司+陈志豪
  20. 2021年秋季PAT乙级题解(C语言)

热门文章

  1. DyGLIP:跨摄像头多目标跟踪的动态图模型
  2. 根据日期和随机数生成32位的16进制随机数
  3. android 自动接电话
  4. 一套开源的自动化立体仓库WMS系统,源码分享
  5. python创意项目设计方案-基于MicroPython软件相结合的无线设计方案
  6. pd.columns和pd.columns.tolist
  7. 程序员痛心流涕自述:“因为把自己代码给了别人,我亲手断送了自己的前程”
  8. Swift ——协议
  9. EMC经典问答85问(1-5问)
  10. 《PR基础教程入门篇-学习笔记》-012