有没有办法从核心运动中获得相对旋转?
我需要的是:它在一个轴和哪个方向上旋转多少(+符号=逆时针, - =顺时针,根据右手规则).
我找到了属性rotationRate,但我现在确定如何从中提取角度,因为这给了我每秒弧度.
我在最后几天做了各种各样的事情,但没有什么能给我稳定的价值观.我曾尝试使用NSTimer进行核心运动数据的定时采样,并计算两个样本之间的差异,因此我会调整自上次采样以来旋转了多少,但有时会给我疯狂的数字,如13600度即使iPhone正在桌子上休息.
有关如何实现这一点的任何想法?
谢谢
使用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
我记得WWDC上有一个谈话,显示OpenGL ES中的茶壶,随着设备的移动而旋转.看来茶壶在太空中静止不动.
当应用程序启动时,茶壶开始处于特定位置.然后当设备旋转时,茶壶也旋转到空间静止不动.
在这次演讲中,他们提到我们必须获得"参考框架",例如在应用程序启动时,它告诉我们用户最初如何持有设备.
例如,这里是加速度计轴:

我想知道围绕Y轴的旋转,但是相对于用户如何握住设备.因此,当用户将其保持直立并围绕Y旋转时,我需要知道旋转值.
我认为关键是从读数中消除重力?另外我的目标是带有陀螺仪的iPhone 4/4S,但我认为CoreMotion会自动对它们进行传感器融合.
我怎么能弄清楚用户围绕Y轴旋转设备的程度?
在我目前的项目中,我遇到了Core Motion的CMAttitude提供的四元数问题.我把iPhone 5(iOS 6.0.1)放在一个定义良好的起始位置.然后我开始快速移动设备,就像在快速起搏游戏中一样.当我在10-30秒后返回到起始位置时,报告的偏航角与起始位置相差10-20度(大部分时间≈11°).
我使用旧的(可悲的是不再可用的)Core Motion Teapot样本来验证效果.用于记录的欧拉角直接从CMAttitude读取:

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示例重现问题.偏航图可以重复地远离原点.
我使用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意味着什么?我在文档中找不到任何内容.
当应用程序在后台运行/设备处于睡眠模式时,我需要加速器更新.一些应用程序这样做,我无法使其工作.为此,我在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.有人给我一个暗示吗?谢谢.
有没有人用模拟器成功测试过任何新的CoreMotion API?似乎需要M7的那些不起作用.我试过在运行iOS 7的新模拟器上调用这些函数
(BOOL)isActivityAvailable
Run Code Online (Sandbox Code Playgroud)
和
(BOOL)isStepCountingAvailable
Run Code Online (Sandbox Code Playgroud)
但是两个函数调用都返回false.
我想知道是否有人可以向我展示如何实施CMStepCounter的示例.(我查看了文档,但仍然对如何实现有点困惑).
我想在每次采取步骤时更新我的视图上的UILabel.我也希望让应用程序在关闭时继续计算步数.
我对iOS比较新,任何帮助都会非常感激:)!
谢谢,瑞恩
我想获得授权状态CMMotionActivityManager.对于日历和位置等其他服务,我们在API中有一些属性,它们为我们提供了这些类的用户授权状态.我如何获得CMMotionActivityManager课程的授权状态?
我发现有关此主题(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) core-motion ×10
ios ×6
iphone ×5
objective-c ×4
apple-m7 ×2
gyroscope ×2
counter ×1
ios5 ×1
ios6 ×1
ios7 ×1
magnetometer ×1