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 应用程序