如何确定某段时间之内玩手机次数及其他各种通过传感器&GPS数据可进行的分析

采集数据的方式及来源

准备工数据:

可通过传感器获取到的数据及GPS数据

可以通过GPS获取到的数据
GPS点对应的采集时间,GPS点精度

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{

//获取到的locations这个是刷新时间内获取到的定位点的数据,建议便利数组取到精度最好的那个点(精度值也就说GPS的误差范围,当精度值越小的时候说明这个点的定位范围越小,约准确)
 double minHorizonAcc = -1;
    for (CLLocation * loc in locations) {
        NSLog(@"=====精度为:%lf",loc.horizontalAccuracy);
        if (minHorizonAcc == -1) {
            minHorizonAcc = loc.horizontalAccuracy;
            bestLocation = loc;
        }else {
            if(loc.horizontalAccuracy <= minHorizonAcc) {
                bestLocation = loc;
            }
        }
    }

    //在返回的GPS点上还有一个叫做speed的速度  这个速度默认没有速度的时候返回-1,但是当你有速度的时候他需要1-3秒左右的时间才会返回你有的速度而不会是马上
float speed = bestLocation.speed;
//如何确定GPS某两个点之间的移动距离
    distance = [GPS1 distanceFromLocation:GPS2];
}

通过传感器可以获取到的数据

CMDeviceMotion *motion = [CMDeviceMotion alloc] init];
//加速度值
motion.userAcceleratio—xyz轴分别有对应的加速度
motion.rotationRate —xyz轴有对应的角速度
motion.attitude —xyz对应的欧拉角

发生的行为

1.某段时间之内如何知道玩手机次数

对于处理这个问题考虑了两个方面计算玩手机.1是打电话,2是手机发生角度变化,所以要在1的情况下时避免重复计算玩手机次数.
打电话可以通过距离传感器来计算,触碰手机可以通过欧拉角电话来判断. 但是当1发生的时候,2也会发生,这个时候请作出判断
打电话很好判断
1很好判断 距离感应器就可以做到
2其实是可以通过欧拉角来判断的,iOS中的欧拉角对应在xyz轴上进行变化,我们要判断的是手机在你手上和水平的夹角值,这儿值是一个变化值在0-90之间 划重点:这是变化值 值得是和水平的夹角 这个要用到获取到的motion.attitude.yaw值进行判断. 看角度超过多少算是玩手机,这个临界值你可以自行测试

2.如何判断在运动过程中是否停止

其实大多数人第一反应都是判断几个点之间的位移量变化但是还有个更巧妙的方法,前边我们拿到GPS某个点的 数据时候是有速度的
如果两个点之间的速度小于我们规定的一个阀值,通过设置不同的阀值我们可以知道不同情况下速度的变化程度,就可以分析出来很多东西,比如用速度的变化可以区分出来出行的方式.

3.如何判断我的运动轨迹

不通过高德等定位软件,如何拿到我的运动轨迹呢,手机的方向都是针对手机朝向的,如果我手机不对着我的前进方向怎么办呢?其实这个也可以处理.我们前边通过传感器拿到了角速度和欧拉角,角速度通过计算是可以反转城地球所在的磁场方向的 反转的方法

             float xr = -v.pitch;
            float yr = v.roll;

            double cosXr = cos(xr);
            double cosYr = cos(yr);
            double sinYr = sin(yr);
            double tanXr = tan(xr);

            tmpV.rotationRateX = (float) (v.rotationRateX + v.rotationRateY * sinYr * tanXr + v.rotationRateZ * cosYr * tanXr);
            tmpV.rotationRateY = (float) (v.rotationRateY  * cosYr - v.rotationRateZ * sinYr);
            tmpV.rotationRateZ = (float) (v.rotationRateY * sinYr / cosXr + v.rotationRateZ * cosYr / cosXr);

建议

个人建议可以适当的舍弃一些获取到的数据或者对前后两个时间点获取到的数据进行一个对比看下变化范围,如果明显超出正常范围那肯定某个点的数据偏差很大可以生气. 阈值的话看你自己情况需要去调整

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值