Каковы диапазоны ускорителя на iPhone? - PullRequest
5 голосов
/ 06 апреля 2009

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

Ответы [ 3 ]

6 голосов
/ 06 апреля 2009

С iphonedevsdk.com :

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

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

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

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

2 голосов
/ 28 июня 2009

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

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

xmin -1.271802

xmax 1,180959

Имин -1,344477

ymax 1.108285

Змин -2,30713

zmax 2.325581

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

x -2,325581 до 2,307413

у -2,325581 до 2,307413

z -2.307413 до 2.325581

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

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

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

x = -1, если наклонен влево (<|) </p>

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

  • , где <- это экран, и | это нижняя часть iPod </li>

y ~ -1, если экран направлен на вас, перпендикулярно полу («стоя»)

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

...