iOS 上的加速度计丢失数据点(目标 C)

Posted

技术标签:

【中文标题】iOS 上的加速度计丢失数据点(目标 C)【英文标题】:Accelerometer Missed data points on iOS (Objective C) 【发布时间】:2011-11-12 17:02:28 【问题描述】:

我正在尝试在一个日志应用程序中将加速度计数据记录到 CoreData sql 数据库中,以帮助另一个项目。该应用程序很简单:它将加速度数据以 f=100Hz 的频率记录到 Core Data 中创建的结构中。

一切都很好,除了我在数据库中获得的真实频率接近 5Hz 或在某些测试用例中低至 0.1Hz。

我已经按照文档设置了加速度计:

// Accelerometer
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
accelerometer.updateInterval = 1./100; // T = 1/f. f=100Hz.
accelerometer.delegate = self;

然后在回调中,我只需将其记录到 Core Data 中的新行:

- (void)accelerometer:(UIAccelerometer *)accelerometer
        didAccelerate:(UIAcceleration *)acceleration
    AccelerometerData *dataPoint = [NSEntityDescription insertNewObjectForEntityForName:@"AccelerometerData" inManagedObjectContext:self.managedObjectContext];
    [self.session addAccelerometerDataObject:dataPoint];
    dataPoint.x = [NSNumber numberWithDouble:acceleration.x];
    dataPoint.y = [NSNumber numberWithDouble:acceleration.y];
    dataPoint.z = [NSNumber numberWithDouble:acceleration.z];
    dataPoint.timestamp = [NSNumber numberWithDouble:acceleration.timestamp];

知道为什么缺少数据吗?

我从核心位置获得了更高的频率。我知道将新行插入托管实体很昂贵 - 但我无法想象它的规模是 1/100 秒!

【问题讨论】:

【参考方案1】:

一个可能的原因是,如果您将updateInterval 设置为1/100,它将是0,因为这两个数字都是整数。在除法之前至少使其中之一成为浮点数,例如1.0 / 100.

另一种可能是核心数据操作太慢而无法跟上请求的速率。我建议您尝试将 UIAcceleration 对象简单地存储在一个数组中,看看更新频率是否增加。如果是这样,你需要想办法加快速度(例如,简单地写入文件,而不是核心数据)。

【讨论】:

谢谢。我实际上在代码中使用了 0.01 并在复制到此处时对其进行了更改。我已经更新了上面的描述。【参考方案2】:

updateInterval 文档说明了这一点

此属性以秒为单位。这个属性的价值是 限制在一定的最小值和最大值。最大值为 由硬件支持的最大频率决定。到 确保它可以及时传递设备方向事件 时尚,系统确定适当的最小值基于 它的需求。

也可能是设备静止时速度会大大减慢。虽然事件处理指南说

您可以将报告间隔设置为小至 10 毫秒 (毫秒),这对应于 100 Hz 的更新率,虽然大多数 应用程序可以以更大的间隔充分运行。尽快 当您分配委托对象时,加速度计开始发送 它的数据。此后,您的代表将按要求接收数据 更新间隔。

所以看起来不太可能。您可能希望将数据分批写入数据库,看看是否会发生变化。低至 0.1 Hz 的速率似乎不是写入时间问题,但是,您是否尝试过记录回调?另外,这是您的应用在前台时吗?

你也可以试试:

accelerometer.updateInterval = 0.01;

而不是

accelerometer.updateInterval = 1/100;

因为它可能会舍入到最接近的 int(0 或 1...)

【讨论】:

我在测试时实际上在 = 0.01 时实现了它。复制到这里时我重写为 1/100,所以我认为这不是原因。我确实记录了间隔并在调试期间运行它。我看到 NSLog 更新频率约为 8-9 Hz,updateInterval 设置为 0.01。也许我会尝试批量更新,看看是否能解决问题。试用后我会在这里发帖!编写一个新的数据库条目的成本可能高达 10000000ns,这似乎很奇怪! 尝试定时数据库写入,或将它们置于后台线程中。如果确认它们花费的时间相对微不足道,我认为这值得报告错误...【参考方案3】:

得到这个工作......不过对我来说似乎是一个错误。我必须将 updateInterval 设置为所需时间的 1/10。 IE。对于 100Hz 的刷新率,我将其设置为 1./1000,我得到 100Hz 的数据。奇怪。

【讨论】:

以上是关于iOS 上的加速度计丢失数据点(目标 C)的主要内容,如果未能解决你的问题,请参考以下文章

如何从目标 C 更改 CBAdvertisementDataLocalNameKey 值?

通过蓝牙将实时加速度计数据从 WatchOS 共享到 iOS 应用程序

iOS 上的 fft numpy 风格以非两个数据长度的幂加速

将 iPhone 加速度计设置为 ±8g 模式

读书笔记iOS-加速计与陀螺仪

Xcodebuild 编译加速,Cocoapods 二进制化实践