Какие диапазоны акселератора на айфоне?

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


person Jeffrey Berthiaume    schedule 06.04.2009    source источник


Ответы (3)


С iphonedevsdk.com:

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

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

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

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

person Michael Wales    schedule 06.04.2009

Приложение aGauge отображает эти необработанные данные, поступающие от акселерометра, когда вы перемещаете устройство. Это также может помочь вам найти порог «переворота» для вашего устройства.

person Community    schedule 28.06.2009

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

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 по горизонтальной/вертикальной осям, а затем переворачиваю его, я получаю такие значения, как:

хмин -1,271802

хмакс 1.180959

yмин -1,344477

умакс 1.108285

zмин -2,30713

змакс 2.325581

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

x -2.325581 to 2.307413

y -2.325581 to 2.307413

z -2.307413 to 2.325581

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

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

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

x = -1 при наклоне влево ( ‹| )

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

  • где ‹ — это направление экрана, а | это нижняя часть iPod

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

y ~ 1, если смотреть от себя (и вверх ногами)

person Jeffrey Berthiaume    schedule 06.04.2009
comment
Это должно быть в другом вопросе - person victor hugo; 28.06.2009