Как рассчитать скорость и расстояние от ускорения в iOS - PullRequest
0 голосов
/ 24 сентября 2018

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

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

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

Мой ViewController.h выглядит так:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIAccelerometerDelegate> {

    UIAccelerometer *accelerometer;

    long last_speed;
    long distance_travelled;

    long lastAccel;
    long long lastTime;

    IBOutlet UITextField* speedView;
    IBOutlet UITextField* distanceView;
}

@end

И мой ViewController.m выглядит следующим образом:

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    lastAccel = 0;
    last_speed = 0;
    distance_travelled = 0;
    lastTime = (long)(NSTimeInterval)([NSDate.date timeIntervalSince1970] * 1000.0);

    accelerometer = UIAccelerometer.sharedAccelerometer;
    accelerometer.updateInterval = 0.1;
    accelerometer.delegate = self;
}

- (void)accelerometer:(UIAccelerometer *)meter
        didAccelerate:(UIAcceleration *)acceleration
{
    long long currentTime = (long)(NSTimeInterval)([NSDate.date timeIntervalSince1970] * 1000.0);
    long long deltaTime = currentTime - lastTime;
    lastTime = currentTime;

    long accel_x = acceleration.x;
    long accel_y = acceleration.y;
    long accel_z = acceleration.z;

    long integrated_acceleration = sqrtl(accel_x*accel_x + accel_y*accel_y + accel_z*accel_z);

    long average_acceleration = (lastAccel + integrated_acceleration) / 2;

    long speed = last_speed + (average_acceleration * deltaTime);
    long average_speed = (speed + last_speed) / 2;
    distance_travelled = distance_travelled + (average_speed * deltaTime);

    last_speed = speed;
    lastAccel = integrated_acceleration;

    [speedView setText:[NSString stringWithFormat:@"%ld", speed]];
    [distanceView setText:[NSString stringWithFormat:@"%ld", distance_travelled]];
}

@end

Когда выполняется код, скорость и расстояние постоянно увеличиваются, а замедление (замедление) никогда не учитывается - поэтому даже когда я останавливаюсь,скорость и расстояние продолжают расти.

Даже по меркам «это будет немного неточно», это заходит слишком далеко!

Все мысли и мнения с благодарностью приняты (ну почти - я знаю что это не будет точно!)

1 Ответ

0 голосов
/ 24 сентября 2018

Вы не можете рассчитать скорость с помощью UIAccelerometer.

Пожалуйста, найдите ссылку для уточнения: Как рассчитать скорость с помощью акселерометра в IOS

...