标签: core-motion

从CMRotationMatrix得到俯仰,偏航,滚动

我有一个CMRotationMatrix*rot,我想得到矩阵中的俯仰,偏航,滚动.任何想法我怎么能这样做?

谢谢

opengl-es ios core-motion

8
推荐指数
1
解决办法
7484
查看次数

是什么取代了iOS 5弃用的加速度计:didAccelerate?

嗯......我落后于时代并尝试将一些旧代码移植到新应用程序并且不推荐使用加速器委派.必须有一个替代品.请指出我的文档并让我开始.

deprecated accelerate-framework core-motion ios5

8
推荐指数
1
解决办法
9004
查看次数

如何在用户拒绝健身数据时收到通知?

我可以检查用户是否授权的健身数据使用-[CMMotionActivityManager queryActivityStartingFromDate:toDate:toQueue:withHandler:],并检查错误(CMErrorNotAuthorizedCMErrorMotionActivityNotAuthorized在处理程序).

如果用户进入隐私设置并拒绝我的应用程序,该应用程序将被终止,当我重新启动它时,一切正常.

如果用户转到隐私设置并全局拒绝健身数据,则应用程序不会被杀死,使用上述方法检查不会报告任何错误!

我必须针对iOS 8,所以我无法使用+[CMSensorRecorder isAuthorizedForRecording].

你有解决这个问题的可靠方法吗?拥有一个很好的位置授权API 非常烦人,但不适合这个!

authorization ios core-motion

8
推荐指数
1
解决办法
201
查看次数

Core Motion在后台?

当应用程序处于后台时,Core Motion框架是否可以正常工作?

iphone ios core-motion

7
推荐指数
1
解决办法
2309
查看次数

如何检测M7是否存在,又称它是iPhone 5S还是更新?

试图找到一种检测M7存在的方法.

如果M7不存在,查询CMStepCounter或CMMotionActivity类是否毫无意义?我的猜测是,在拥有iOS 7.0的非M7型号上,这些类可以获得数据,但效率并不高,而且使用的电池更多.

粗暴的方式是:

struct utsname systemInfo;

uname(&systemInfo);

model =  [[NSString alloc] initWithCString:systemInfo.machine
                                      encoding:NSUTF8StringEncoding];

version =  [[NSString alloc] initWithString:[[UIDevice currentDevice] systemVersion]];


if ([model compare:@"iPhone6,1"]) {

}
Run Code Online (Sandbox Code Playgroud)

sdk ios core-motion apple-m7

7
推荐指数
1
解决办法
2092
查看次数

使用四元数代替滚动,俯仰和偏航来跟踪设备运动

请忍受我的长期问题,我想尽可能清楚.

我想要做的是,当使用相机拍摄照片时获得姿态(滚动倾斜和偏航),然后将姿态值保存到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)

iphone objective-c quaternions ios core-motion

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

在控制器内调用startDeviceMotionUpdatesToQueue时,我得到了OSSpinLockLock

在我的根控制器中,我有一个属性 CMMotionManager

@property (strong, nonatomic) CMMotionManager *MManager;
Run Code Online (Sandbox Code Playgroud)

在它的吸气器中我做懒惰的实例化.当控制器的视图加载时,我调用此方法

- (void)reloadAccelerometer {
    NSLog(@"Away we go");
    self.MManager.deviceMotionUpdateInterval = 10.0/60.0;
    [self.MManager startDeviceMotionUpdatesToQueue:self.queue withHandler:^(CMDeviceMotion *motion, NSError *error) {
        NSLog(@"Y values is: %f", motion.userAcceleration.y);
    }];
}
Run Code Online (Sandbox Code Playgroud)

我看到"离开我们去" NSLog然后立即应用程序崩溃,我得到这个线程日志

libsystem_platform.dylib`spin_lock$VARIANT$mp:
0x39a87814:  movs   r1, #1

libsystem_platform.dylib`OSSpinLockLock$VARIANT$mp + 2:
0x39a87816:  ldrex  r2, [r0]
0x39a8781a:  cmp    r2, #0
0x39a8781c:  it     ne
0x39a8781e:  bne.w  0x39a893ec                ; _OSSpinLockLockSlow$shim
0x39a87822:  strex  r2, r1, [r0]
0x39a87826:  cmp    r2, #0
0x39a87828:  bne    0x39a87816                ; OSSpinLockLock$VARIANT$mp + 2
0x39a8782a:  dmb    ish
0x39a8782e:  bx     lr …
Run Code Online (Sandbox Code Playgroud)

objective-c ios core-motion

7
推荐指数
1
解决办法
1692
查看次数

当方向锁定打开且应用程序仅支持纵向时,如何检测设备方向

我遇到的问题是,当用户使用我们的应用程序拍照时AVCaptureSession,我无法确定他们是以纵向还是横向模式拍摄照片.我们的应用程序仅支持Portrait,我在使用手机时保持方向锁定,因此我正在尝试构建一个解决方案,假设其他人也可以这样做.

我查看了使用[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]但是当Orientation Lock打开时,没有收到任何通知.我知道此功能是可行的,因为当我的手机启用了方向锁定时,基本相机应用和Google环聊应用中的相机可以检测到旋转(取消和Flash按钮上的动画很明显).

我最好使用加速度计并检测手机旋转的角度?一个老的答案,检测iPhone的屏幕方向,很明显检测到这种方式的角度很容易做到(显然适应使用Core Motion而不是UIAccelerometer的答案),但我很好奇是否有另一种方法可以做它.

objective-c accelerometer ios core-motion uideviceorientation

7
推荐指数
1
解决办法
934
查看次数

不寻常的CoreMotion Sensorfusion数据

我正在开发一个收集CoreMotion数据的应用程序,我正在使用现有的应用程序商店应用程序作为参考,以确保我正确地收集数据.

在大多数情况下,一切都是等价的,但我在某些测试中看到了一些奇怪的数据.问题出现在滚动,俯仰和偏航值上,然而,来自加速度计,陀螺仪和磁力计的原始数据是等效的...

下面的图表绘制了从100Hz的装备上的5个设备收集的数据:

  1. iPhone 5(iOS 10.0.2)
  2. iPhone 5(iOS 10.0.2)
  3. iPhone 5(iOS 10.0.2)
  4. iPhone 5s(iOS 10.0.2)
  5. iPhone 6s(iOS 10.0.2)

首先,从SensorLog收集的数据: 传感器日志数据 其次,从我的应用收集的数据: 我的应用数据 第三,从我的应用程序收集的数据,但这次@ 10Hz: 在此输入图像描述

观察:

  • 问题似乎仅限于iPhone 5和5s 更新:在6s也出现了问题
  • SensorLog能够正确记录值(尽管我已经看到它生成'坏'数据的一个实例),这似乎消除了硬件限制(以前的iPhone 4s测试也可以)
  • iPhone 6s在所有测试中表现都很好更新:不再是这种情况
  • 我的应用程序可能会受到频率的影响,因为结果显示@ 10Hz,1 iPhone 5还可以,但@ 100Hz都没有
  • 原始数据在所有设备中都是等效的,因此不清楚为什么某些设备的传感器融合数据已关闭
  • 使用Quaternions不能解决问题,因为它们来自相同的原始数据
  • 在某些情况下,"坏"数据似乎跟随好数据,但振幅太大,如下所示

放大图块:

放大图表

并在上图中覆盖手动拉伸的滚动数据:

叠加滚动

码:

func start(_ interval: TimeInterval = 0.1) {
    self.interval = interval

    logTimer = Timer.new(every: interval, {
        self.motionData.currentRecord = self.motionDataRecord
        self.motionData.createCoreDataRecord()
        NotificationCenter.default.post(name: .motionHelperDidUpdateData, object: nil)
    })
    logTimer.start()

    startCoreLocation()
    startAccelerometer()
    startDeviceMotion()
    startGyroscope()
    startMagnetometer()
}

func startCoreLocation() { …
Run Code Online (Sandbox Code Playgroud)

ios core-motion swift

7
推荐指数
1
解决办法
346
查看次数

CoreMotion - 在iPhone上横向移动,自下而上

我正在制作一个能够在风景中制作全景视频的应用程序.在横向上,它支持两个方向:从左到右,从下到上.

因此,当用户从左向右移动手机或向右旋转时,我想从左向右移动箭头.当垂直向上移动设备时,也希望将箭头从底部移到顶部.在具有全景选项的原生iPhone相机应用程序中,我们可以看到正确的模拟,

我的问题是1)我怎么知道用户正在从左到右或从右到左移动手机.因为像iPhone全景,我想在用户搬回时停止录制.

另外2)我怎么知道用户正在垂直向上移动手机


补充:2017年11月10日:我确实在AppStore中看到了一个名为Spincle的应用程序.从左向右旋转设备时,它会移动箭头以拍摄360度图像.我只是设法使用俯仰和滚动来实现这一点(参见下面的代码).但是,如果我们将设备放在地板或屋顶上,这将无法工作.

import UIKit
import CoreMotion
class ViewController: UIViewController {
    private let motionManager = CMMotionManager()
    let arrowView = UIView()
    func startMotion() {
        var initialAttitude: CMAttitude?
        motionManager.deviceMotionUpdateInterval = 1
        let queue = OperationQueue.current!
        let statusBarOrientation = UIApplication.shared.statusBarOrientation
        motionManager.startDeviceMotionUpdates(using: CMAttitudeReferenceFrame.xArbitraryZVertical, to: queue) { (motiondata, err) in
            guard let data = motiondata else { return }
            if initialAttitude == nil {
                initialAttitude = data.attitude
            } else {
                let attitude = data.attitude
                // translate the attitude
                attitude.multiply(byInverseOf: initialAttitude!)
                // calculate pitch …
Run Code Online (Sandbox Code Playgroud)

accelerometer ios core-motion swift

7
推荐指数
1
解决办法
509
查看次数