2009-04-06 44 views

Trả lời

5

Từ iphonedevsdk.com:

Các gia tốc sử dụng trong lần đầu tiên và iPhone thế hệ thứ hai (và tôi cũng giả sử các chạm iPod) hoạt động ở hai chế độ: +/- 2 g và +/- 8 g. (Trên thực tế, khi bạn quan sát, họ gia tốc báo cáo hơi bên ngoài phạm vi danh nghĩa. Độ chính xác không phải là spec'ed bên ngoài phạm vi đó, mặc dù.)

của Apple hoạt động chúng trong +/- 2 g chế độ . Có một sự cân bằng: Độ phân giải hiện tại là là 0,008 g, theo biểu dữ liệu (mặc dù iPhone thế hệ đầu tiên của chúng tôi sử dụng 0,016868604, theo một phiên bản sửa đổi của AccelerometerGraph). Ở chế độ +/- 8 g, độ phân giải sẽ gấp bốn lần cruder.

Tôi cho rằng Apple đã quyết định rằng độ phân giải tốt hơn sẽ hữu ích hơn phạm vi rộng hơn. (Tôi thà thấy độ phân giải tốt hơn là độ phân giải hơn 0,018 g. Vì vậy, không phải của chúng tôi hoàn toàn hài lòng.)

Bạn không thể thay đổi chế độ bằng bất kỳ tính năng nào được xuất bản của API. Kể từ khi chúng chuyển động tăng tốc thành , chúng có thể cho phép thay đổi chế độ và chỉ cần xem chế độ khi đổi lại giá trị A/D, trước khi tăng tốc. (Số nơi rõ ràng để đặt chế độ sẽ là trong cuộc gọi thiết lập ứng dụng để nhận thông tin gia tốc .) Tuy nhiên, đối với tính tương thích lạc hậu, HĐH sẽ phải đặt chế độ gia tốc thành +/- 2 g ở đầu ứng dụng. Và không có quy trình nền nào có thể được phép đặt chế độ gia tốc .

1

tôi tạo ra các ứng dụng sau đây để thử để kiểm tra các dãy ...

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]; 
} 

Vấn đề là, khi tôi xoay iPod của tôi dọc theo trục ngang/dọc và sau đó lật lại thật kỹ, có giá trị như:

xmin -1,271802

xmax 1,180959

ymin -1,344477

ymax 1,108285

zmin -2,30713

Zmax 2,325581

Nhược bằng tôi lấy iPod và lắc heck ra khỏi nó, tôi nhận được ...

x -2,325581 để 2,307413

y -2,325581 để 2,307413

z -2,307413 để 2,325581

Bất cứ ý tưởng gì nó đo?

Điều tốt nhất tôi đã đi lên với là:

dọc trục

x = -1 nếu nghiêng bên trái (< |)

x = 1 nếu nghiêng tất cả các cách ở bên phải (|>)

  • nơi cách mà màn hình đối mặt và | được dưới cùng của iPod

y ~ -1 nếu màn hình đang đối mặt với bạn, vuông góc với sàn ("đứng lên")

y ~ 1 nếu phải đối mặt với đi từ bạn (và lộn ngược)

+0

Điều này phải nằm trong một câu hỏi khác –

2

Ứng dụng aGauge hiển thị dữ liệu thô này đến từ gia tốc kế khi bạn di chuyển thiết bị. Nó cũng có thể giúp bạn tìm ra ngưỡng "lật" cho thiết bị của bạn.

Các vấn đề liên quan