标签: core-motion

在iOS中,Core Location和Core Motion框架的磁场值有什么区别?

我有两种方法可以使用iOS设备的磁力计获得磁场(强度,x,y和z).

1)核心位置
使用CLHeading CLLocationManagerDelegate方法locationManager:didUpdateHeading:.这类似于Apple的Teslameter示例应用程序.

2)核心运动
用于CMMagneticFieldCMMotionManagermagnetometerData.magneticField.

问题:
a)两者有什么区别?我从两者中得到了不同的价值观.我原以为他们会返回相同的值.
当我从静止位置(面朝上放在桌子上)启动应用程序,然后将设备向上提升到空中时,差异最为显着.
b)如果存在差异,何时应使用Core Location标题中的磁场,何时应使用Core Motion的磁场?

注意:我也不确定Core Location和Core Motion的"磁场"是否涉及不同的磁场概念.
注意:我将强度计算为两种方法的(x ^ 2 + y ^ 2 + z ^ 2)的平方根.

core-location magnetometer ios core-motion

61
推荐指数
1
解决办法
2万
查看次数

CoreMotion在后台状态下更新

使用最新iOS设备中的M7芯片,当用户使用CMMotionActivityManager从静止到跑步,步行等时,可以通过编程方式获得通知.当Stava和Runkeeper 检测到用户没有通过M7移动时,它们都使用它来自动暂停GPS轮询(关闭GPS天线),然后在再次移动时重新启用GPS更新.当应用程序处于后台状态时,它可以执行此操作,这是此处的关键.

我在复制此功能时遇到的问题是,如果我在我的应用程序处于后台时关闭GPS更新,我将停止接收活动更新,并且无法再检测用户何时通过M7再次移动以重新打开GPS.

如果我让GPS一直运行,我会在整个应用程序处于后台时继续从Core Motion获取移动更新.

我假设他们没有玩白噪声或其他一些廉价的技巧来保持活跃.他们是怎么做到的?

core-location ios core-motion apple-m7

35
推荐指数
2
解决办法
2万
查看次数

iPhone - 了解iPhone旋转

我正试图理解这一点,试图在墙上敲我的头.见下图.

假设我有一张iPhone放在桌子上.此时,通过核心运动的旋转读数对于偏航,滚动和俯仰是0,0,0(图片A).

然后我将它滚动90度.现在它坐在桌子上,左侧是主页按钮.现在它读取0,0,0(图片B).

现在我把它偏转了180度.它现在坐在桌子右侧.左侧的主页按钮.它现在读取180,0,0(图片C).

如果我现在滚动它就会出现问题.假设我将它滚动-45度.我应该读180,-45,0但我正在读180,-45,180 ???? (图片D).

这是为什么?如果我从来没有改变过它,为什么它给我一个音高价值呢?如何通过其他角度的旋转来影响音高?谢谢.

在此输入图像描述

iphone core-motion

34
推荐指数
1
解决办法
1万
查看次数

检测用户是否正在开车

注意:此问题最初是在Apple在iOS SDK中引入运动检测硬件和相关API之前发布的.然而,这个问题的答案仍然有用.


我正在创建一个iPhone iOS应用程序,它涉及跟踪用户的跑步和/或步行.用户跑步和走路的记录结果保持诚实非常重要.我需要一种方法来捕捉可能在使用汽车时作弊(或意外地离开跟踪器)的用户.

要检查如果用户驾驶或乘坐一辆车我首先想到这两项检查,但也不能真正确定该用户是在汽车或没有(一个点).

  1. 使用以下方法检查用户的当前速度.如果用户的行进速度超过20-ahh MPH,那么我可以假设用户在车内:

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
          CLLocation *recentLocation = [locations lastObject];
          recentLocation.speed; //If speed is over 20 MPH, assume the user is not on their feet.
    
    Run Code Online (Sandbox Code Playgroud)

    但是,我不确定这是否真的是一个很好的检查,因为人们的记录比以前更快.这是一个很好的检查还是我应该使用其他东西?

  2. 使用Core Motion Framework提供的Accelerometer和Motion API确定用户加速的速度.如果用户加速超过一定的速率,那么我可以假设用户正在车辆中行驶.

这些假设是否正确?我想我真正的问题是:有没有更好的方法来检测用户是否在车内移动 - 如果是这样的话?.如果没有,那么这些检查是否适用于这种情况,或者这对那些实际上那么快的用户来说是否会烦恼?CoreMotion是适当的API吗?


编辑:新的iPhone 5S M7协处理器提供更准确的运动检测.任何人都可以解释如何使用新的M7 API吗?

objective-c core-location ios core-motion apple-m7

33
推荐指数
2
解决办法
3万
查看次数

查找iOS设备的法线向量

我想用CMAttitude来了解iPad/iPhone屏幕玻璃的正常向量(相对于地面).因此,我会得到以下矢量:

在此输入图像描述

请注意,这与方向不同,因为我不关心设备如何围绕z轴旋转.因此,如果我把iPad放在我的头顶朝下,它会读取(0,-1,0),即使我将它旋转到我头顶上方(如直升机),它仍将继续读取(0, - 1,0):

在此输入图像描述

我觉得这可能很简单,但由于我是四元数的新手,并且不完全理解设备运动的参考框架选项,所以它一整天都在躲避我.

ios gyroscope core-motion

26
推荐指数
1
解决办法
5220
查看次数

knocktounlock如何工作?

我试图找出knocktounlock.com如何能够在iPhone上检测到"敲门".我确信他们使用加速度计来实现这一点,但是我的所有尝试都会出现假标志(如果用户移动,跳跃等等,它有时会触发)

基本上,我希望能够检测到用户何时敲击/敲击/敲击他们的手机(并且能够将其与可能也会增加加速度计的东西区分开来).所以我正在寻找尖锐的高峰.该设备将放在口袋中,因此设备的移动不会太多.

我尝试过高/低通(不确定是否会有更好的选择)

这与此重复:通过加速计检测iPhone上的任何硬点但是它没有收到任何答案.

任何帮助/建议都会很棒!谢谢.

编辑:在我接受下面的答案之前寻找更多的想法.我确实收到了Knocktounlock的回复,他们使用四阶导数(jounce)来获得更好的值,然后进行分析.这很有趣.

math objective-c accelerometer ios core-motion

26
推荐指数
2
解决办法
4371
查看次数

CMMotionActivityManager - 在应用程序暂停或在后台接收动画活动更新

我一直在测试新的Motion Activity Manager API(CMMotionActivityManager).我想创建一个应用程序,可以startActivityUpdatesToQueue在应用程序未在前台运行时接收和处理动作更新.当应用程序处于前台时,我正确接收运动更新(静止,行走,跑步,汽车,未知),但一旦进入后台(因此被暂停),应用程序就不再接收动作更新.

CMMotionActivityManager类参考:"此方法异步启动运动数据的跟踪.在调用此方法时,运动活动管理器在指定的队列上执行处理程序块,报告对设备有效的当前运动.之后,运动活动管理器仅在运动数据发生变化时执行处理程序块.处理程序块在尽力而为的基础上执行,并且在您的应用程序暂停时不会发送更新.如果在您的应用程序被暂停时到达更新,则上次更新将在您的应用程序发送时它会恢复执行.要获取暂停应用程序时发生的所有更新,请使用该queryActivityStartingFromDate:toDate:toQueue:withHandler:方法."

我想要一种方法来保持我的应用程序在后台运行并接收运动数据(实时).现在,保持应用程序在后台运行的唯一方法是使用后台服务,但"动态更新"不在允许的后台服务列表中:

App Store评论指南:"多任务应用程序只能将后台服务用于其预期用途:VoIP,音频播放,位置,任务完成,本地通知等." 我不想一直有位置更新(GPS)(以节省电池).如果我保留连续的位置更新,但关闭GPS,该应用程序将被暂停.

请让我知道如何让我的应用在后台运行并接收动作活动更新.必须有办法做到这一点:我尝试过Strava应用程序......即使应用程序在后台,当用户暂停运行时它会关闭GPS.当用户恢复运行时,它会自动打开GPS(所有这一切都在应用程序处于后台)...这可能意味着应用程序在后台运行并且即使在GPS关闭时也会主动接收动作活动更新.

先感谢您!

core-motion ios7

24
推荐指数
1
解决办法
6157
查看次数

简单的iPhone动作检测

我需要检测陀螺仪/加速度计何时被激活一定量.基本上是检测设备何时移动.我对Core Motion一无所知.

也许有人可以指导我参加初学者教程或其他什么.

提前致谢.

iphone xcode objective-c core-motion

21
推荐指数
1
解决办法
2万
查看次数

如何创建新的CMAttitude参考框架以使重力位于Y轴上

我希望能够更改设备运动管理器参考框架(用于陀螺仪),以便我的重力矢量在Y轴上.

通常,当您启动Device Motion Manager更新时,您只能使手机的z轴与重力对齐.

您可以更改此项以使用磁力计使x轴与磁北极或真北极对齐.有了这个,我的X轴指向北方,我的Z轴指向下方.

我想要做的是让我的Y轴(负)指向下方(使其与重力对齐)并使我的X轴指向真正的磁极.

我想要的结果是,当我的手机静止在垂直(纵向)方向时,手机的右侧将与北极对齐,我的所有读数(滚动,俯仰,偏航)将读为0.然后使用如果我在X轴上旋转手机,音高会改变,如果我绕Y轴旋转,偏航会改变.

到目前为止,我知道我可以设置自己的参考框架,如果我乘以先前存储的态度的倒数,(就像我可以手动设置我的手机这种方向,保存这种态度,并简单地将新态度乘以逆这个存储的一个和我的所有读数将完全像我想要的那些).

但是手动设置它不是一个选项,所以我如何以编程方式进行此操作?

我不认为有一个函数来创建我自己的态度参考框架,或者如果至少有一个函数将态度乘以旋转矩阵,那么我可以解决这个问题.(因为我只是将所有态度乘以90度的音高变化).

我希望我能清楚地解释清楚,

我将不胜感激任何建议.谢谢

PD:这些是iPhone Orientation坐标:

在此输入图像描述

iphone xcode gyroscope core-motion

19
推荐指数
1
解决办法
8971
查看次数

使用Core Motion和CMAccelerometer数据检测某人何时开始行走

我正在尝试检测三种动作:当用户开始步行,慢跑或跑步时.然后我想知道何时停止.我成功地检测到有人在走路,慢跑或跑步时使用以下代码:

- (void)update:(CMAccelerometerData *)accelData {

    [(id) self setAcceleration:accelData.acceleration];

    NSTimeInterval secondsSinceLastUpdate = -([self.lastUpdateTime timeIntervalSinceNow]);

    if (labs(_acceleration.x) >= 0.10000) {
        NSLog(@"walking: %f",_acceleration.x);
    }
    else if (labs(_acceleration.x) > 2.0) {
        NSLog(@"jogging: %f",_acceleration.x);
    }
    else if (labs(_acceleration.x) > 4.0) {
        NSLog(@"sprinting: %f",_acceleration.x);
    }
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是双重的:

1)每次有动作时都会多次调用更新,这可能是因为它经常检查当用户开始行走时(即_acceleration.x> = .1000)它再次调用更新时仍然> = .1000.

示例日志:

    2014-02-22 12:14:20.728 myApp[5039:60b] walking: 1.029846
    2014-02-22 12:14:20.748 myApp[5039:60b] walking: 1.071777
    2014-02-22 12:14:20.768 myApp[5039:60b] walking: 1.067749
Run Code Online (Sandbox Code Playgroud)

2)我很难弄清楚如何检测用户何时停止.有没有人就如何实施"停止检测"提出建议

objective-c ios core-motion apple-m7

19
推荐指数
4
解决办法
2万
查看次数