2011-11-12 21 views
2

私は別のプロジェクトへの補助として書いたロギングアプリケーションで、加速度計データをCoreData SQLデータベースに記録しようとしています。アプリケーションは簡単です:それはf = 100Hzの頻度でコアデータで作成された構造に加速度データを記録します。Accelerometer iOS上のデータポイントが見つかりません(Objective C)

いくつかのテストケースでは、データベースに実際の周波数が5Hzに近いか、0.1Hzで低くなっていることを除いて、すべてが素晴らしいです。

私はセットアップをしたドキュメントごとの加速度計:

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

その後、コールバックに、私は単純にコアデータに新しい行にそれをログ:

- (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]; 

任意のアイデアを理由の欠如データ?

私はコアの位置からずっと高い周波数を得ています。私は管理されたエンティティに新しい行を挿入することは費用がかかることを知っています - しかし、私は100分の1のスケールでそれをイメージすることはできません!

答えて

0

この作業は...私にはバグのようです。 updateIntervalを希望の時間の1/10に設定する必要があります。私。 100Hzリフレッシュレートの場合は1./1000に設定し、100Hzデータを取得します。奇妙な。

0

updateIntervalドキュメントはこの

このプロパティは秒単位で測定されたと言います。このプロパティの値は、特定の最小値と最大値に制限された です。最大値は、ハードウェアがサポートする最大周波数によって決まる です。 には、 のタイムリーな方法でデバイスオリエンテーションイベントを配信できるように、システムは に基づいて適切な最小値を決定します。

また、デバイスが静的である場合、レートが大幅に低下することもあります。ガイドイベント処理は

最も アプリケーションは、より大きな間隔で十分に動作することができるがあなたは、100 Hzの更新レートに相当する、10ミリ秒 (MS)のように小さいことが報告間隔を設定することができると言うものの。すぐに デリゲートオブジェクトを割り当てると、加速度計は データを送信し始めます。その後、代理人は要求された 更新間隔でデータを受け取ります。

だからそうは思われません。データをバッチでデータベースに書き込んで、それが何か変わるかどうかを確認することができます。 0.1 Hzという低いレートは、書き込み時間の問題のようには思われませんが、コールバックを記録しようとしましたか?また、アプリがフォアグラウンドにあるときはこれがありますか?

また、試みることができる:代わりに

accelerometer.updateInterval = 1/100; 

accelerometer.updateInterval = 0.01; 

を、それは、最も近い整数に丸めることができよう(0または1 ...)

+0

私がテストしていたとき、私は実際に= 0.01で実装しました。私はここにコピーするときに1/100と書いたので、それが原因だとは思わない。 デバッグ中に間隔を記録して実行しました。私は約8-9HzでNSLog更新を見ていて、updateIntervalを0.01に設定しました。 おそらく私はバッチ更新を試み、それがトリックをするかどうかを見ていきます。私はそれを試した後、ここに投稿します!新しいデータベースエントリを作成すると、10000000nsほどのコストがかかる可能性があります。 – Steve

+0

データベース書き込みのタイミングを取ったり、バックグラウンドスレッドに入れてみてください。彼らが比較的重要な時間を取らないことが確認された場合、これはバグ報告の価値があると思います... – jbat100

0

1つの原因は、可能性がありますつまり、updateInterval1/100と設定すると、両方の数値が整数なので、0になります。分割する前に少なくとも1つを浮動小数点にします。1.0/100

コアデータ操作が遅すぎて要求された速度に追いつかない可能性があります。 UIAccelerationオブジェクトを配列に格納し、更新頻度が増えるかどうかを確認することをお勧めします。そうした場合、処理速度を上げるために何かを見つけ出す必要があります(たとえば、コアデータではなくファイルに書き込むなど)。

+0

ありがとうございます。私は実際にコードで0.01を使用していて、ここにコピー中に変更しました。私は上記の説明を更新しました。 – Steve

関連する問題