标签: core-motion

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
查看次数

在控制器内调用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
查看次数

提示动作和健身数据的权限

我希望在应用程序启动后立即提示用户访问Motion&Fitness数据(CoreMotion)的权限.

现在我正在尝试对数据执行"虚拟"查询以提示对a的权限 application:didFinishLaunchingWithOptions

CMMotionActivityManager *motionActivityManager=[[CMMotionActivityManager alloc]init];
    [motionActivityManager startActivityUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMMotionActivity *activity) {
        NSLog(@"Dummy query to prompt permission from user");

    }];
Run Code Online (Sandbox Code Playgroud)

但是发生的事情是应用程序启动并且它挂在启动画面上 - 如果我按下主页按钮然后应用程序尝试关闭,然后弹出权限提示.

有谁想过如何做到这一点?

objective-c ios core-motion appdelegate

7
推荐指数
2
解决办法
3147
查看次数

不寻常的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
查看次数

NSTimeInterval到unix时间戳

我从CMMotionManager获取 CMDeviceMotion对象.CMDeviceMotion的一个属性是时间戳,表示为NSTimeInterval(double).根据文档,这允许"亚毫秒"时间戳精度.

[motionManager startDeviceMotionUpdatesToQueue:motionQueue withHandler:^(CMDeviceMotion *motion, NSError *error) { 
  NSLog(@"Sample: %d Timestamp: %f ",counter,  motion.timestamp);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,NSTimeInterval是自上次设备启动以来计算的,对以原始形式使用它提出了重大挑战.

有没有人有一个工作代码将此NSTimeInterval转换为类似时间戳(UTC时区)的Unix?

谢谢!

timestamp nstimeinterval ios core-motion

6
推荐指数
1
解决办法
6164
查看次数

用核心运动计算精益角度

我的申请记录会话.当用户启动记录会话时,我开始从设备的CMMotionManager对象收集数据并将它们存储在CoreData上以便稍后处理和显示.我收集的数据包括gps数据,加速度计数据和陀螺仪数据.数据频率为10Hz.

目前,我正在努力用运动数据计算设备的倾斜角度.可以通过使用重力数据来计算设备的哪一侧着陆,但是我想要计算用户与地面之间的左右角度,而不管行进方向如何.

这个问题需要一些线性代数知识来解决.例如,对于某些点的计算,我必须计算计算平面上的3D线的方程.我正在研究这一天,而且它变得越来越复杂.我根本不擅长数学.一些与该问题相关的数学例子也很受欢迎.

iphone math linear-algebra ios core-motion

6
推荐指数
1
解决办法
4525
查看次数

iOS:同步来自相机和运动数据的帧

我正在尝试从相机和相关运动数据中捕获帧。对于同步,我使用时间戳。视频和动作被写入文件,然后进行处理。在那个过程中,我可以计算每个视频的运动帧偏移。

结果表明,相同时间戳的运动数据和视频数据相互偏移了不同的时间,从 0.2 秒到 0.3 秒不等。该偏移对于一个视频是恒定的,但因视频而异。如果每次都是相同的偏移量,我就可以减去一些校准值,但事实并非如此。

有没有一种同步时间戳的好方法?也许我没有正确记录它们?有没有更好的方法将它们带到相同的参考系?

CoreMotion 返回相对于系统正常运行时间的时间戳,因此我添加偏移量以获得 unix 时间:

uptimeOffset = [[NSDate date] timeIntervalSince1970] - 
                   [NSProcessInfo processInfo].systemUptime;

CMDeviceMotionHandler blk =
    ^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error){
        if(!error){
            motionTimestamp = motion.timestamp + uptimeOffset;
            ...
        }
    };

[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
                                                   toQueue:[NSOperationQueue currentQueue]
                                               withHandler:blk];
Run Code Online (Sandbox Code Playgroud)

为了获得高精度的帧时间戳,我使用了 AVCaptureVideoDataOutputSampleBufferDelegate。它也偏移到 unix 时间:

-(void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection
{
    CMTime frameTime = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);

    if(firstFrame)
    {
        firstFrameTime = CMTimeMake(frameTime.value, frameTime.timescale);
        startOfRecording = [[NSDate date] timeIntervalSince1970];
    }

    CMTime presentationTime = CMTimeSubtract(frameTime, firstFrameTime);
    float seconds = CMTimeGetSeconds(presentationTime);

    frameTimestamp …
Run Code Online (Sandbox Code Playgroud)

video synchronization avfoundation ios core-motion

6
推荐指数
1
解决办法
1002
查看次数

SWIFTUI 和 Core Motion

我正在尝试在 SWIFTUI 视图中显示加速度计数据。此代码可以打印到控制台,但我不明白如何将其放入视图中,以便我可以在 SWIFTUI 中使用它。

import SwiftUI
import CoreMotion


struct AccelerometerView: View {

    let motionManager = CMMotionManager()
    let queue = OperationQueue()


    var body: some View {

        VStack{
            Text("accelerate:").onAppear {
                print("ON APPEAR")
                self.motionManager.startDeviceMotionUpdates(to: self.queue) { (data: CMDeviceMotion?, error: Error?) in
                    guard let data = data else {
                        print("Error: \(error!)")
                        return
                    }
                    let attitude: CMAttitude = data.attitude

                    print("pitch: \(attitude.pitch)")
                    print("yaw: \(attitude.yaw)")
                    print("roll: \(attitude.roll)")
                }
            }//.onappear

            //Text("Pitch:\(attitude.pitch)")

        }//Vstack

    }//view
}//struct

struct AccelerometerView_Previews: PreviewProvider {
    static var previews: some View {
        AccelerometerView()
    }
}
Run Code Online (Sandbox Code Playgroud)

core-motion swiftui

6
推荐指数
1
解决办法
2940
查看次数