如何使用 deviceMotion 姿态值(滚动、俯仰和偏航)来检测运动

Posted

技术标签:

【中文标题】如何使用 deviceMotion 姿态值(滚动、俯仰和偏航)来检测运动【英文标题】:How to use deviceMotion attitude values (roll,pitch and yaw) to detect a motion 【发布时间】:2013-05-17 06:30:17 【问题描述】:

我在我的应用程序中使用 coreMotion 来检测 ios 设备的运动。我知道如何从coreMotion 获取不同传感器的数据。我从deviceMotion 获得如下滚动、俯仰和偏航数据:

 float pitch =  (180/M_PI)*self.manager.deviceMotion.attitude.pitch];
 float roll = (180/M_PI)*self.manager.deviceMotion.attitude.roll];
 float yaw = (180/M_PI)*self.manager.deviceMotion.attitude.yaw];

如何使用这些数据来检测运动?为此我需要进行哪些计算?

【问题讨论】:

先生,您想用这些值做什么?如果您试图在设备移动时监控这些值,则可以将它们显示为标签。 【参考方案1】:

姿态值需要设备运动更新启动为:

startDevicemotionUpdates

要在设备移动时监控姿态值,请使用要在标签中显示的姿态值:

[self.cmMotionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMDeviceMotion *devMotion, NSError *error) 

float pitch =  (180/M_PI)*self.manager.devMotion.attitude.pitch];
float roll = (180/M_PI)*self.manager.devMotion.attitude.roll];
float yaw = (180/M_PI)*self.manager.devMotion.attitude.yaw];

self.rollLabel.text = [NSString stringWithFormat:@"%f", roll];
self.pitchLabel.text = [NSString stringWithFormat:@"%f",pitch];
self.yawLabel.text = [NSString stringWithFormat:@"%f",yaw];

另外最好不要使用横滚、俯仰和偏航(又名欧拉角)。使用四元数或旋转矩阵以获得更好的准确性。欧拉角倾向于处于一种称为万向节锁定的情况,这会导致数据不可靠。

请查看此链接了解如何使用四元数,并将该值转换为横滚、俯仰和偏航值:SO link

【讨论】:

以上是关于如何使用 deviceMotion 姿态值(滚动、俯仰和偏航)来检测运动的主要内容,如果未能解决你的问题,请参考以下文章

deviceMotion.userAcceleration加速度方向

如何使用 OpenCV 绘制 3D 坐标轴以进行人脸姿态估计?

iOS CoreMotion CMAttitude 相对于北极

如何以秒为单位确定CMDeviceMotion的年龄

什么是工业机器人的姿态?

ios重力感应失效—deviceMotion及deviceOrientation事件不触发