Акселерометр Пропущенные точки данных на iOS (Задача C) - PullRequest
2 голосов
/ 12 ноября 2011

Я пытаюсь записать данные акселерометра в базу данных CoreData sql в приложении для ведения журналов, которое я написал для помощи другому проекту.Приложение простое: оно записывает данные ускорения в структуру, созданную в Core Data с частотой f = 100 Гц.

Все отлично, за исключением того, что я получаю реальную частоту в базе данных ближе к 5 Гц или к низкой при 0,1 Гц в некоторых тестовых случаях.

Я настроил акселерометр согласно документации:

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

Есть идеи, почему не хватает данных?

Я получаю гораздо более высокие частоты из Core Location.Я знаю, что вставка новой строки в управляемый объект обходится дорого, но я не могу представить ее в масштабе 1/100 секунды!

Ответы [ 3 ]

0 голосов
/ 12 ноября 2011

Одной из возможных причин может быть то, что если вы установите updateInterval в качестве 1/100, это будет 0, так как оба числа являются целыми числами.Сделайте хотя бы одну из них с плавающей запятой перед делением, например 1.0 / 100.

Другая возможность состоит в том, что операции с базовыми данными слишком медленные, чтобы не отставать от запрошенной скорости.Я бы посоветовал вам попытаться просто сохранить объекты UIAcceleration в массиве и посмотреть, увеличивается ли частота обновления.Если это произойдет, вам нужно что-то придумать, чтобы ускорить процесс (например, просто записать в файл, а не в Core Data).

0 голосов
/ 26 ноября 2011

Понял, что работает ... мне кажется, что это ошибка.Я должен установить updateInterval на 1/10 желаемого времени.Т.е. для частоты обновления 100 Гц я установил ее на 1./1000 и получил данные 100 Гц.Странно.

0 голосов
/ 12 ноября 2011

Документация updateInterval гласит:

Это свойство измеряется в секундах.Значение этого свойства ограничено определенными минимальными и максимальными значениями.Максимальное значение определяется максимальной частотой, поддерживаемой аппаратным обеспечением.Чтобы обеспечить своевременную доставку событий ориентации устройства, система определяет соответствующее минимальное значение в зависимости от своих потребностей.

Возможно также, что скорость значительно замедляется, когда устройствостатичный.Хотя в руководстве по обработке событий сказано:

Вы можете установить интервал создания отчетов, равный 10 миллисекундам (мс), что соответствует частоте обновления 100 Гц, хотя большинство приложений могут работать в достаточной степени при большеминтервал.Как только вы назначаете свой объект делегата, акселерометр начинает отправлять ему данные.После этого ваш делегат получает данные с запрошенным интервалом обновления.

Так что это кажется маловероятным.Возможно, вы захотите записать свои данные в вашу базу данных в пакетном режиме и посмотреть, если это что-то изменит.Тем не менее, частота до 0,1 Гц не кажется проблемой времени записи, вы пытались записать обратный вызов?Кроме того, это когда ваше приложение находится на переднем плане?

Вы также можете попробовать:

accelerometer.updateInterval = 0.01;

вместо

accelerometer.updateInterval = 1/100;

, поскольку оно может быть округлено доближайший int (0 или 1 ...)

...