Каковы диапазоны работы акселератора на iPhone?


Я, кажется, не могу найти никакой документации в интернете об этом, и то, что я гуглю, дает мне много противоречивой информации...

3 5

3 ответа:

Из iphonedevsdk.com :

Акселерометры, используемые в первом и айфоны второго поколения (и я предположим также, что iPod touch) работают в двух режимах: + / - 2 г и + / - 8 г. (На самом деле, как вы заметили, они сообщить об ускорениях несколько снаружи номинальный диапазон. Точность-нет правда, за пределами этого диапазона.)

Яблоко управляет ими в + / - 2 г режим. Существует компромисс: текущий разрешение номинально составляет 0,018 г, согласно справочнику (хотя мой iPhone первого поколения использует 0.018168604, согласно модифицированной версии акселерометра). В Режим + / - 8 g, разрешение будет в четыре раза грубее.

Я предполагаю, что Apple решила, что тоньше разрешение было бы более полезным, чем широкий диапазон. (Я бы предпочел видеть лучше разрешение чем 0.018 g. Так что ни один из нас это полностью устраивает.)

Вы не можете изменить режим с помощью любого опубликованная функция API. С они проходят ускорение как двойной, они теоретически могли бы позволить изменение режима, и просто посмотрите на режим при масштабировании значения A/D, прежде чем сообщить об ускорении. (Этот очевидным местом для установки режима будет в вызове, который устанавливает приложение для получения акселерометра информация.) Однако, для отсталых Совместимость, ОС должна была бы установите режим акселерометра на + / - 2 g в начале приложения. И никакого фона. процессы можно было бы позволить установить режим акселерометра.

Приложение a измерений показывает Это данных, поступающих от акселерометра при перемещении устройства. Он также может помочь вам найти порог" флип " для вашего устройства.

Я создал следующее приложение, чтобы попытаться протестировать диапазоны...

UIAccelerometer *objAccelerometer;
UILabel *lblxmin, *lblxmax, *lblymin, *lblymax, *lblzmin, *lblzmax;
UILabel *lblxnow, *lblynow, *lblznow;

float xmin = 0.0, xmax = 0.0, ymin = 0.0, ymax = 0.0, zmin = 0.0, zmax = 0.0, xnow = 0.0, ynow = 0.0, znow = 0.0;

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {   
    //NSLog (@"%f, %f, %f", acceleration.x, acceleration.y, acceleration.z);
    xnow = acceleration.x;
    ynow = acceleration.y;
    znow = acceleration.z;
    if (xnow < xmin) { xmin = xnow; }
    if (ynow < ymin) { ymin = ynow; }
    if (znow < zmin) { zmin = znow; }

    if (xnow > xmax) { xmax = xnow; }
    if (ynow > ymax) { ymax = ynow; }
    if (znow > zmax) { zmax = znow; }

    lblxmin.text = [NSString stringWithFormat:@"%f", xmin];
    lblymin.text = [NSString stringWithFormat:@"%f", ymin];
    lblzmin.text = [NSString stringWithFormat:@"%f", zmin];

    lblxmax.text = [NSString stringWithFormat:@"%f", xmax];
    lblymax.text = [NSString stringWithFormat:@"%f", ymax];
    lblzmax.text = [NSString stringWithFormat:@"%f", zmax];

    lblxnow.text = [NSString stringWithFormat:@"%f", xnow];
    lblynow.text = [NSString stringWithFormat:@"%f", ynow];
    lblznow.text = [NSString stringWithFormat:@"%f", znow];

}

-(void) invokeAccelerometer {   
    objAccelerometer = [UIAccelerometer sharedAccelerometer];
    objAccelerometer.delegate = self;
    objAccelerometer.updateInterval = (1.0 / 10.0);
}

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    lblxmin = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 40)];
    lblxnow = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 100, 40)];
    lblxmax = [[UILabel alloc] initWithFrame:CGRectMake(200, 10, 100, 40)];

    lblymin = [[UILabel alloc] initWithFrame:CGRectMake(10, 60, 100, 40)];
    lblynow = [[UILabel alloc] initWithFrame:CGRectMake(100, 60, 100, 40)];
    lblymax = [[UILabel alloc] initWithFrame:CGRectMake(200, 60, 100, 40)];

    lblzmin = [[UILabel alloc] initWithFrame:CGRectMake(10, 110, 100, 40)];
    lblznow = [[UILabel alloc] initWithFrame:CGRectMake(100, 110, 100, 40)];
    lblzmax = [[UILabel alloc] initWithFrame:CGRectMake(200, 110, 100, 40)];

    [self.view addSubview:lblxmin];
    [self.view addSubview:lblxnow];
    [self.view addSubview:lblxmax];

    [self.view addSubview:lblymin];
    [self.view addSubview:lblynow];
    [self.view addSubview:lblymax];

    [self.view addSubview:lblzmin];
    [self.view addSubview:lblznow];
    [self.view addSubview:lblzmax];

    [self invokeAccelerometer];

    [super viewDidLoad];
}

Проблема в том, что когда я поворачиваю свой iPod вдоль горизонтальной/вертикальной осей, а затем переворачиваю его, я получаю такие значения, как:

Xmin -1.271802

Xmax 1.180959

Ymin -1.344477

Ymax 1.108285

Zmin -2.30713

Zmax 2.325581

Если я возьму айпод и вытряхну из него все дерьмо, я получу...

X -2325581 - 2.307413

Y -2.325581 к 2.307413

Z -2.307413 - 2.325581

Есть идеи, что он измеряет?

Лучшее, что я придумал, это:

Вертикальная ось

X = -1 при наклоне влево (

X = +1 при наклоне вправо ( | > )

  • где

Y ~ -1, если экран обращен к вам, перпендикулярно полу ("стоя")

Y ~ 1, если смотреть в сторону от вас (и вверх вниз)