我似乎无法在网上找到任何关于此的文档,而我在谷歌上搜索的内容却给了我很多相互矛盾的信息......
3 回答
第一代和第二代 iPhone(我假设也是 iPod touch)中使用的加速度计以两种模式运行:+/- 2 g 和 +/- 8 g。(实际上,正如您所观察到的,它们报告的加速度有点超出标称范围。不过,精度并未超出该范围。)
Apple 在 +/- 2 g 模式下运行它们。有一个折衷:根据数据表,当前分辨率名义上为 0.018 g(尽管根据 AccelerometerGraph 的修改版本,我的第一代 iPhone 使用 0.018168604)。在 +/- 8 g 模式下,分辨率会粗糙四倍。
我认为苹果认为更精细的分辨率会比更宽的范围更有用。(我宁愿看到比 0.018 g 更精细的分辨率。所以我们俩都不完全满意。)
您无法使用 API 的任何已发布功能更改模式。由于它们将加速度作为双倍传递,因此理论上它们可以允许改变模式,并在重新调整 A/D 值时简单地查看模式,然后再报告加速度。(设置模式的明显位置是在设置应用程序以接收加速度计信息的调用中。)但是,为了向后兼容,操作系统必须在开始时将加速度计模式设置为 +/- 2 g应用。并且不允许任何后台进程设置加速度计模式。
当您移动设备时,aGauge 应用程序会显示来自加速度计的原始数据。它还可以帮助您找到设备的“翻转”阈值。
我创建了以下应用程序来尝试测试范围...
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
如果我拿起 iPod 并摆脱它,我会...
x -2.325581 到 2.307413
y -2.325581 到 2.307413
z -2.307413 至 2.325581
任何想法它正在测量什么?
我想出的最好的是:
纵轴
x = -1 如果向左倾斜 ( <| )
x = +1 如果一直向右倾斜 ( |> )
- 其中 < 是屏幕朝向的方式,| 是 iPod 的底部
y ~ -1 如果屏幕面向您,垂直于地板(“站立”)
y ~ 1 如果背对你(并且倒置)