iOS跑步软件开发-从无到有

点击上方“iOS开发”,选择“置顶公众号”

关键时刻,第一时间送达!


前言


经过两个多月的开发与调试,全民星跑1.0.1终于上线了,首先要感谢曲总和雷建民的技术支持.全民星跑作为一个以跑步计步为主要功能的软件,骚栋在开发过程中实在是遇到了不少的坑,这篇博客会分为加速仪计步和跑步计步两个模块来说明,不过有一点我想先声明,因为人力资源有限,所以可能在计步的逻辑上跟不上咕咚或者是Keep这些大厂,望各位看官见谅 . 


功能规划


一个App如何统计一个人的运动?这里主要有两种方式,一种是使用陀螺仪(或是加速仪)获取手机各个方向的加速度来统计用户的运动,另外一种就是通过GPS定位地图来统计用户的运动.在我的做的应用里面也是两种方案都采用了.接下来,我们分别讲解每一种方式是如何使用的.



陀螺仪简介以及原始数据获取


陀螺仪又叫角速度传感器,是不同于加速度计(G-sensor)的,他的测量物理量是偏转、倾斜时的转动角速度。在手机上,仅用加速度计没办法测量或重构出完整的3D动作,测不到转动的动作的,G-sensor只能检测轴向的线性动作。但陀螺仪则可以对转动、偏转的动作做很好的测量,这样就可以精确分析判断出使用者的实际动作。而后根据动作,可以对手机做相应的操作!

上面是概念部分.但是在说陀螺仪使用之前,我们要谈一谈两个框架,一个是CoreMotion框架,另外一个是HealthKit框架,好多刚搞跑步软件的童鞋都会有这样的疑问,这两个框架根据不同的回调方法获取到用户的运动信息,那么它们有什么不同呢?其实CoreMotion框架获取的是陀螺仪的加速度,然后通过加速度来计算用户的运动情况.这是实时更新的,而HealthKit框架是从苹果自带的健康软件中获取到数据,并不是实时的更新,这个就需要我们根据App的需求来酌情处理了.



对于HealthKit框架这里就不过啰嗦了.下面我们就来说明陀螺仪是如何使用的.我们使用的框架是CoreMotion这个iOS原生框架,那么这个框架在实际开发中是如何使用的呢?


我们先导入在需要的地方导入CoreMotion这框架.


#import <CoreMotion/CoreMotion.h>


在初始化阶段,不管你要获取的是什么数据,首先需要做的就是创建一个CMMotionManager对象.


motionManager = [[CMMotionManager alloc] init]; 


所有的操作都会由这个manager接管。后面的初始化操作相当直观,


if (!motionManager.accelerometerAvailable) {  

// fail code // 检查传感器到底在设备上是否可用  

}  

motionManager.accelerometerUpdateInterval = 0.01; // 告诉manager,更新频率是100Hz  

[motionManager startAccelerometerUpdates]; // 开始更新,后台线程开始运行。这是pull方式。 


我在项目中是使用block回调的方式来获取数据的.代码如下所示.


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

{  

// Your code here  

}]; 


接下来就是获取x,y,z轴三个方法的加速度数据了。如下所示.


                //三个方向加速度值

                double x = accelerometerData.acceleration.x;

                double y = accelerometerData.acceleration.y;

                double z = accelerometerData.acceleration.z;


这样我们就拿到了x,y,z轴三个方法加速度的原始数据了.


陀螺仪的数据处理


那么,拿到数据之后我们该如何处理呢?获取原始数据的操作很简单,但是我们还需要做最重要的部分,那就是处理原始数据,有的童鞋就会问,为什么要处理这些数据每一次获取数据,难道手机不都是在动吗?实际上确实如此,但是我们需要的是最大程度上来估算用户的运动步数,如果一个用户在不断晃动手机,那么我们还需要把这种数据计算进来吗?这时候就需要我们把这种数据给过滤掉,来减少数据的误差.提高数据的精确性.


首先我们创建一个数据Model.Model的属性有震动幅度的系数(通过x,y,z轴三个方法加速度来获取,),Model对象的获取时间.Model获取时间的格式化时间.Model获取的位置.代码如下所示.


#import <Foundation/Foundation.h>


@interface StepModel : NSObject


@property(nonatomic,strong) NSDate *date;


@property(nonatomic,assign) int record_no;


@property(nonatomic, strong) NSString *record_time;


//g是一个震动幅度的系数,通过一定的判断条件来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值