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

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

我觉得这可能很简单,但由于我是四元数的新手,并且不完全理解设备运动的参考框架选项,所以它一整天都在躲避我.
请忍受我的长期问题,我想尽可能清楚.
我想要做的是,当使用相机拍摄照片时获得姿态(滚动倾斜和偏航),然后将姿态值保存到nsuserdefaults.保存后,方向会改变,然后通过不断比较姿态值(保存和当前)来尝试使手机处于相同的姿势.
出于界面的目的,用户界面在屏幕上具有3个点(每个姿态参数一个),其指导拍摄照片的正确方向.达到正确的态度后,屏幕上会显示匹配标志.
我一直在寻找滚动,俯仰和偏航值:
CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion;
myRoll = radiansToDegrees(atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z)) ;
myPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z));
myYaw = radiansToDegrees(2*(quat.x*quat.y + quat.w*quat.z));
Run Code Online (Sandbox Code Playgroud)
当我注意到偏航值存在一些差异时,我搜索并可以从这里找到:链接,那个
来自四元数的偏航,俯仰和滚动,你将遇到同样的问题,就好像你只使用偏航,俯仰和滚转一样.你必须使用四元无处不在你的代码,而忘记了偏航,俯仰和滚转
所以现在我想我必须再次对所有内容进行编码...请你能够如此友好地指出我为此目的使用Quaternion的示例代码吗?
这是我正在处理的代码:
在ViewController.m中,在图像中:didFinishSavingWithError:
[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion;
double tempYaw = radiansToDegrees(asin(2*(quat.x*quat.y + quat.w*quat.z)));
double tempRoll = radiansToDegrees(atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z)) ;
double tempPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + …Run Code Online (Sandbox Code Playgroud) 在我目前的项目中,我遇到了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示例重现问题.偏航图可以重复地远离原点.