Измерение скорости через iPhone SDK

Я должен реализовать собственное приложение для iPhone для измерения скорости телефона (в основном спидометр). Я знаю, что можно сделать так через CoreLocation API довольно легко, но я обеспокоен потреблением батареи, так как это должно быть измерением в реальном времени, которое могло использоваться для до нескольких часов за один раз. Мое понимание - то, что, в то время как Вы активно контролируете для событий от LocationManager (даже при том, что я на самом деле не забочусь о местоположении GPS) это интенсивно батареей.

Другая очевидная опция исследовать использовала бы акселерометры, чтобы попытаться вычислить скорость, но нет ничего в API, чтобы помочь Вам сделать так. На основе моего исследования это должно быть возможно сделать это, но кажется чрезвычайно сложным и подверженным ошибкам. Перевод от ускорения до скорости может быть хитрым для начала плюс акселерометр iPhone, данные могут быть "шумными". Я знаком с примером SDK, который демонстрирует использующую низкую / фильтрацию высоких частот, и т.д. - но я не видел хорошего примера нигде, который показывает вычисление скорости.

У кого-либо есть реальный опыт с этим, они могут совместно использовать? Код был бы фантастическим, но действительно я просто хочу знать, сделал ли кто-либо успешно это (для долговечного приложения) и что приближается, они взяли.

Править: У меня есть рабочий прототип, который использует LocationManager API. Это работает хорошо, но цикл обновления далек от идеала для измерения в реальном времени скорости. В зависимости от обстоятельств может потребоваться до 4-5 секунд иногда для обновления. Выполнение круиза в заданной скорости имеет тенденцию работать хорошо, но accel/decel имеют тенденцию отставать очень плохо с точки зрения взаимодействия с пользователем. Кроме того, я должен подать скорость в некоторые другие вычисления, которые я делаю, и точность не действительно, в чем я нуждаюсь.

Это кажется возможным на основе (очень немногих) другие приложения, которые я видел, особенно gMeter, который утверждает, что сделал нет смысла в GPS, но вычисляет скорость точно. Я действительно удивлен, что нет никаких ссылок или любого примера кода, который демонстрирует это где угодно, что я могу найти. Я понимаю, что это сложно, но конечно там существует что-то.

12
задан Brian Moeskau 12 January 2010 в 18:18
поделиться

5 ответов

Поскольку GPS и акселерометр имеют разные недостатки, ваш лучший вариант, вероятно, является комбинированным подходом - получите измерение от GPS каждую минуту или около того, добавьте изменения в реальном времени с акселерометра.

10
ответ дан 2 December 2019 в 05:15
поделиться

С практической точки зрения, вы не получите точную скорость от сил, действующих на акселерометр.

Используйте GPS с показаниями, полученными с интервалом в 1 минуту, и усыпляйте GPS.

Here is an example:

SpeedViewController.h

CLLocationManager *locManager;
CLLocationSpeed speed;
NSTimer *timer;

@property (nonantomic,retain) NSTimer *timer;

SpeedViewController.m

#define kRequiredAccuracy 500.0 //meters
#define kMaxAge 10.0 //seconds

- (void)startReadingLocation {
    [locManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    NSTimeInterval ageInSeconds = [newLocation.timestamp timeIntervalSinceNow];

    //ensure you have an accurate and non-cached reading
    if( newLocation.horizontalAccuracy > kRequiredAccuracy || fabs(ageInSeconds) > kMaxAge )
        return;

    //get current speed    
    currentSpeed = newLocation.speed;

    //this puts the GPS to sleep, saving power
    [locManager stopUpdatingLocation]; 

    //timer fires after 60 seconds, then stops
    self.timer = [NSTimer scheduledTimerWithTimeInterval:60.0 target:self selector:@selector(timeIntervalEnded:) userInfo:nil repeats:NO];
}

//this is a wrapper method to fit the required selector signature
- (void)timeIntervalEnded:(NSTimer*)timer {
    [self startReadingLocation];
}
10
ответ дан 2 December 2019 в 05:15
поделиться

Я не уверен, что вы далеко пойдете, пытаясь отследить скорость с помощью акселерометра. Для этого вам нужно будет убедиться, что вы зафиксировали КАЖДОЕ ускорение, т.к. любые пропущенные точки данных будут указывать на неправильную скорость (это, конечно, предполагает, что вы сможете преобразовать зарегистрированные значения акселерометра в стандартные единицы). Таким образом, вам придется постоянно запускать акселерометр, который сам по себе высасывает довольно много сока (и, опять же, вам не будут гарантированы все ускорения). Я бы порекомендовал использовать CoreLocation.

3
ответ дан 2 December 2019 в 05:15
поделиться

Ошибка в ускорении будет накапливаться со временем. Ваша лучшая ставка состоит в том, чтобы получить точную скорость GPS, может быть, раз в минуту или меньше:

distanceTravelled = sqrt( (position2.x-position1.x)^2 + (position2.y-position1.y)^2 )
velocity = distanceTravelled/timeBetweenGPSReadings

(где ^ 2 означает в квадрате )

, затем принимать частые измерения акселерометр:

newVelocity = oldVelocity + accelerometer*timeBetweenAccelerometerReadings
4
ответ дан 2 December 2019 в 05:15
поделиться

В то время как я не знаю API iPhone, я знаю что-то о GPS и инерциальной навигации. Это может быть полезно.

GPS-приемники, с которыми я работал, может обеспечить прямое измерение скорости от сигналов GPS, которые они получают. Эти измерения более точны, чем данные позиции даже. Я не знаю, предоставляет ли Apple API доступа или даже если Apple настроила их приемник для предоставления этих данных. Это было бы более эффективным путем для получения измерения скорости.

Следующий путь, учитывая, что у вас есть данные акселерометра и данные GPS, состоит в том, чтобы объединить их, как упоминалось ранее другими плакатами и комментариями. Использование GPS для периодически исправления накопленных межевых измерений от данных акселерометра очень хорошо работает на практике. Он обеспечивает преимущество более частых измерений акселерометра, а также точность измерений GPS. Фильтр Kalman обычно используется. Но, учитывая пределы точности и синхронизации вашей выбранной платформы, фильтр Kalman может быть переплетением и что-то проще для реализации и прогон должен работать нормально.

В любом случае, просто некоторые вещи, чтобы подумать.

2
ответ дан 2 December 2019 в 05:15
поделиться