标签: core-motion

iphone - 核心动作(相对旋转)

有没有办法从核心运动中获得相对旋转?

我需要的是:它在一个轴和哪个方向上旋转多少(+符号=逆时针, - =顺时针,根据右手规则).

我找到了属性rotationRate,但我现在确定如何从中提取角度,因为这给了我每秒弧度.

我在最后几天做了各种各样的事情,但没有什么能给我稳定的价值观.我曾尝试使用NSTimer进行核心运动数据的定时采样,并计算两个样本之间的差异,因此我会调整自上次采样以来旋转了多少,但有时会给我疯狂的数字,如13600度即使iPhone正在桌子上休息.

有关如何实现这一点的任何想法?

谢谢

iphone core-motion

5
推荐指数
1
解决办法
3681
查看次数

iOS5:CLHeading读数的更新率低 - >切换到CoreMotion是有问题的

使用iOS5,Compass原始数据读取的更新频率CLHeading显着下降.这使得我的增强现实应用程序无法使用,因为它依赖于原始指南针数据的近实时读取.

因此我现在正试图切换到CoreMotion.这提供了更频繁更新的磁力计数据:

cmManager = [[CMMotionManager alloc] init];    
[cmManager startMagnetometerUpdates];
Run Code Online (Sandbox Code Playgroud)

然后我可以magneticField在游戏中随时访问数据:

CMMagneticField magneticField = cmManager.magnetometerData.magneticField;
Run Code Online (Sandbox Code Playgroud)

CMMagneticField遇到的问题如下:数据位于CLHeadingx/y/z数据的不同单位.

我想将CMMagneticFieldx/y/z数据转换为与CLHeading/CLHeadingComponentValue相同的单位 - 以便能够使用我现有的AR代码.

这里有几点读物:

7.3     /  17.64 /  -39.58          CLHeadingComponentValue X/Y/Z
-103.12 /  88.51 /  -20.05          CMMagneticField 
Run Code Online (Sandbox Code Playgroud)
-10.81  /  -34.9 /  -18.6          CLHeadingComponentValue X/Y/Z
-121.00 /   33.29 /  3.1           CMMagneticField    
Run Code Online (Sandbox Code Playgroud)
-20.8  /  -38.0 /   -4.0          CLHeadingComponentValue X/Y/Z
-132.9 /   32.2 /  14.4           CMMagneticField
Run Code Online (Sandbox Code Playgroud)

objective-c magnetometer core-motion ios5 compass-geolocation

5
推荐指数
1
解决办法
685
查看次数

如何围绕Y轴旋转相对于用户如何握住设备?

我记得WWDC上有一个谈话,显示OpenGL ES中的茶壶,随着设备的移动而旋转.看来茶壶在太空中静止不动.

当应用程序启动时,茶壶开始处于特定位置.然后当设备旋转时,茶壶也旋转到空间静止不动.

在这次演讲中,他们提到我们必须获得"参考框架",例如在应用程序启动时,它告诉我们用户最初如何持有设备.

例如,这里是加速度计轴:

加速度计

我想知道围绕Y轴的旋转,但是相对于用户如何握住设备.因此,当用户将其保持直立并围绕Y旋转时,我需要知道旋转值.

我认为关键是从读数中消除重力?另外我的目标是带有陀螺仪的iPhone 4/4S,但我认为CoreMotion会自动对它们进行传感器融合.

我怎么能弄清楚用户围绕Y轴旋转设备的程度?

iphone accelerometer ios gyroscope core-motion

5
推荐指数
1
解决办法
2735
查看次数

快速移动后漂移偏航角

在我目前的项目中,我遇到了Core Motion的CMAttitude提供的四元数问题.我把iPhone 5(iOS 6.0.1)放在一个定义良好的起始位置.然后我开始快速移动设备,就像在快速起搏游戏中一样.当我在10-30秒后返回到起始位置时,报告的偏航角与起始位置相差10-20度(大部分时间≈11°).

我使用旧的(可悲的是不再可用的)Core Motion Teapot样本来验证效果.用于记录的欧拉角直接从CMAttitude读取:

开始位置 15秒后同一个地方

        NSLog(@"pitch: %f, roll: %f, yaw: %f",  attitude.pitch * 180 / M_PI, attitude.roll * 180 / M_PI, attitude.yaw * 180 / M_PI);
Run Code Online (Sandbox Code Playgroud)

我在不同工厂的不同时间生产的两种不同的iPhone 5设备上发现了这一点.但真的很奇怪的是,运行iOS 5.1.1的iPhone 4正在按预期工作.在我看来,这是一个iOS错误,我已经提交了一个错误报告,但另一方面,我很难想象没有人偶然发现它.我怀疑它可能与重新设计的Core Motion API有关.从版本5开始,磁力计(罗盘)也被考虑用于传感器融合.控制台显示来自locationd的偏差估计被提供给CoreMotion:

locationd[41] <Notice>: GYTT inserted: bias,-0.196419,1.749323,-1.828088,variance,0.002644,0.004651,0.002527,temperature,31.554688
Run Code Online (Sandbox Code Playgroud)

我的问题:使用Device Motion时是否有机会阻止磁力计读数?我尝试停用位置服务,但它不会影响Core Motion.如果不可能,替代/解决方法是什么,基于加速度计的重力估算?

PS:由于我们面对的是基于四元模型,这是不是与万向锁

编辑: 经过一些测量后,似乎很明显只有偏航受到影响.无论起始位置如何,俯仰和滚转都会在偏差(<= 1°)内显示偏差.CMDeviceMotion.gravity看起来也很干净.

编辑(2): 我可以使用附加到最近的XCode版本的MotionGraphs示例重现问题.偏航图可以重复地远离原点.

iphone gyroscope core-motion ios6

5
推荐指数
1
解决办法
2676
查看次数

Core Motion 102错误是什么意思?

我使用Core Motion的传感器融合来获得朝北的运动更新:

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:motionQueue withHandler:motionHandler]
Run Code Online (Sandbox Code Playgroud)

在极少数情况下,只能在选定的客户设备(运行iOS 6.0.2的iPhone 4S)上重现我在motionHandler中收到此错误:

Error Domain=CMErrorDomain Code=102 "The operation couldn’t be completed. (CMErrorDomain error 102.)
Run Code Online (Sandbox Code Playgroud)

此外,似乎我之后没有获得任何有效的deviceMotion更新.有谁知道这个错误102意味着什么?我在文档中找不到任何内容.

iphone ios core-motion

5
推荐指数
1
解决办法
3922
查看次数

iOS Coremotion加速器在后台/睡眠模式下更新

当应用程序在后台运行/设备处于睡眠模式时,我需要加速器更新.一些应用程序这样做,我无法使其工作.为此,我在appdelegate和我调用的applicationDidEnterBackground中有一个CoreMotion属性

-(void) startAccelerationUpdates
{

    self.motionManager.deviceMotionUpdateInterval = 0.01;
    [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
                                       withHandler:^(CMDeviceMotion *motion, NSError *error){
         dispatch_async(dispatch_get_main_queue(), ^{
         NSLog(@"acceleration x %f", motion.userAcceleration.x);
         NSLog(@"acceleration y %f", motion.userAcceleration.y);
         NSLog(@"acceleration z %f", motion.userAcceleration.z);
         }
         );
         }
    ];
}
Run Code Online (Sandbox Code Playgroud)

在app plist中,我将所需的后台模式放到App寄存器中以进行位置更新.当我将设备置于睡眠模式或后台时,日志中不会显示任何更新.当应用程序处于活动状态时,coremotion会启动loggin.有人给我一个暗示吗?谢谢.

objective-c accelerometer ios core-motion

5
推荐指数
1
解决办法
2792
查看次数

在iOS 7的iphone模拟器上测试CoreMotion API(需要M7)

有没有人用模拟器成功测试过任何新的CoreMotion API?似乎需要M7的那些不起作用.我试过在运行iOS 7的新模拟器上调用这些函数

(BOOL)isActivityAvailable
Run Code Online (Sandbox Code Playgroud)

(BOOL)isStepCountingAvailable
Run Code Online (Sandbox Code Playgroud)

但是两个函数调用都返回false.

core-motion ios7 apple-m7

5
推荐指数
1
解决办法
2564
查看次数

如何实现CMStepCounter CoreMotion - M7芯片

我想知道是否有人可以向我展示如何实施CMStepCounter的示例.(我查看了文档,但仍然对如何实现有点困惑).

我想在每次采取步骤时更新我的​​视图上的UILabel.我也希望让应用程序在关闭时继续计算步数.

我对iOS比较新,任何帮助都会非常感激:)!

谢谢,瑞恩

counter objective-c ios core-motion apple-m7

5
推荐指数
1
解决办法
4225
查看次数

CMMotionactivitymanager authorizationstatus

我想获得授权状态CMMotionActivityManager.对于日历和位置等其他服务,我们在API中有一些属性,它们为我们提供了这些类的用户授权状态.我如何获得CMMotionActivityManager课程的授权状态?

iphone ios core-motion cmmotionmanager

5
推荐指数
2
解决办法
3585
查看次数

CMPedometer(CoreMotion)实时更新

我发现有关此主题(CMPedometer)的资源非常有限。我想知道这里是否有人设法使它正常工作。我的代码非常简单,并且具有比我想做的更多的功能。基本上,步数计数器不会使用户执行的每一步都递增。

它实际上是在跟踪用户执行的每个步骤,但更新速度如此之慢,我不知道为什么。我什至尝试使用NSTimer发出每半秒更新标签的请求。我想尝试让步数计数器在用户迈出一步时进行更新。这是我的代码...

#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>

@interface ViewController ()

@property (nonatomic, strong) CMPedometer    *pedometer;
@property (nonatomic, weak) IBOutlet UILabel *startDateLabel;
@property (nonatomic, weak) IBOutlet UILabel *endDateLabel;
@property (nonatomic, weak) IBOutlet UILabel *stepsLabel;
@property (nonatomic, weak) IBOutlet UILabel *distanceLabel;
@property (nonatomic, weak) IBOutlet UILabel *ascendedLabel;
@property (nonatomic, weak) IBOutlet UILabel *descendedLabel;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    if ([CMPedometer isStepCountingAvailable]) {
        self.pedometer = [[CMPedometer alloc] init];
        [NSTimer scheduledTimerWithTimeInterval:0.5f
                                         target:self
                                       selector:@selector(recursiveQuery)
                                       userInfo:nil
                                        repeats:YES];
    } else {
        NSLog(@"Nothing available");
        self.startDateLabel.text = …
Run Code Online (Sandbox Code Playgroud)

objective-c ios core-motion

5
推荐指数
1
解决办法
1924
查看次数