【问题标题】:iOS calculate g-forceiOS 计算重力
【发布时间】:2014-04-19 04:28:42
【问题描述】:

很简单,我需要在我的项目中制作一个标签,说明来自加速度计的当前 g 力。我找到了一些代码,但我不知道将它放在我的代码中的哪个位置。我猜我需要将其放入无效声明中,但我不确定。请指出我正确的方向。

sx = acceleration.x * kFilteringFactor + sx * (1.0 - kFilteringFactor);
sy = acceleration.y * kFilteringFactor + sy * (1.0 - kFilteringFactor);
sz = acceleration.z * kFilteringFactor + sz * (1.0 - kFilteringFactor);

float aValue = sqrt(sx*sx+sy*sy+sz*sz);

[gforcelabel setText:[NSString stringWithFormat:@"%.2f",aValue]];

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    我不会再为 UIAccelerometerDelegate 烦恼了,因为此时您不太可能需要保持与 iOS 5 以下的任何内容的兼容性。正如在另一个答案中链接的那样,您需要改用 Core Motion,特别是 CMMotionManager ,在 iOS 5 及更高版本中可用。它也很容易使用,您所要做的就是创建一个运动管理器的实例(您只能拥有一个),设置它的更新间隔(可选),然后开始监控指定的运动事件。

    if (!self.manager) {
        self.manager = [CMMotionManager new];
    }
    
    if (self.manager.isAccelerometerActive) {
        [self.manager stopAccelerometerUpdates];
    }
    
    NSOperationQueue *queue = [NSOperationQueue new];
    
    [self.manager setAccelerometerUpdateInterval:1.0 / 30.0]; // 30 Updates Per Second
    [self.manager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        NSLog(@"X: %f         Y: %f         Z: %f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
    }];
    

    我提供的代码创建了一个新的操作队列来处理加速度计更新,如果你想从块内更新 UI,你必须先回到主线程。如果您没有在块内进行任何繁重的处理,而只需要更新 UI(就像您所做的那样),您可以简单地传递 [NSOperationQueue mainQueue],而不是创建新队列。

    还值得注意的是,运动管理器不仅可以监控加速度数据,它还具有磁力计、陀螺仪和设备运动的更新块。信息可以在the documentation找到

    【讨论】:

    • 好的,那么我如何将信息发送到标签,我是否必须为它设置一个单独的类。另外我猜我必须导入核心运动框架吗?
    • @msweet168 查看我提供的代码中的 NSLog() 语句。它显示了如何访问每个轴的单独加速度数据。只需对这些代码执行与您当前在帖子中的代码相同的数学运算,就可以了。不,你不需要额外的课程。旁注:将[NSOperationQueue new] 替换为[NSOperationQueue mainQueue]
    • 我就是这样发送给标签的?
    • @msweet168 正确,只需将您的acceleration.x 等替换为accelerometerData.acceleration.x 等,然后将标签的文本设置为aValue 的格式字符串即可。
    • 好的,我将把它放在我的 -(void)viewdidload 方法中。那应该可以正常工作吧?
    【解决方案2】:

    UIAccelerometer 在 iOS 5.0 中已弃用。您应该改用Core Motion Library

    如果我们假设您的目标是 iOS 5.0,那么您上面列出的代码将存在于实现 UIAccelerometerDelegate Protocol 的视图控制器中。具体来说,您将定义以下协议方法并将您的代码移动到该方法的主体内:

    - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
    

    【讨论】:

      【解决方案3】:

      我知道该怎么做...

      Viewcontroller.h

       IBOutlet UILabel *currentg;
      IBOutlet UILabel *avgAccelLabel;
      
      
      
      float avgAccel;
      float currentAccel;
      int accelCount;
      
      float accelX;
      float accelY;
      float accelZ;
      
      UIAccelerometer *accelerometer;
      

      Viewcontroller.m

      //Use a basic low-pass filter to only keep the gravity in the accelerometer values
      accelX = acceleration.x; //* kFilteringFactor + accelX * (1.0 - kFilteringFactor);
      accelY = acceleration.y; //* kFilteringFactor + accelY * (1.0 - kFilteringFactor);
      accelZ = acceleration.z; //* kFilteringFactor + accelZ * (1.0 - kFilteringFactor);
      
      //calculate acceleration resultant
      float accel = sqrt((ABS(accelX)*ABS(accelX))+(ABS(accelY)*ABS(accelY))+           (ABS(accelZ)*ABS(accelZ)));
      
      //keep track of average accel
      avgAccel = ((avgAccel * accelCount) + accel)/(accelCount + 1);
      currentAccel = (accel); 
      
      accelCount++;
      
      
      //display avg accel
      NSString *avgAccelString = [NSString stringWithFormat:@"%.2f%@", avgAccel, @""];
      avgAccelLabel.text = avgAccelString;
      
      NSString *currentAccellString = [NSString stringWithFormat:@"%.2f%@",currentAccel, @"" ];
      currentg.text = currentAccellString;
      

      查看已加载

       self.accelerometer = [UIAccelerometer sharedAccelerometer];
      self.accelerometer.updateInterval = 0.4;
      self.accelerometer.delegate = self;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 2017-06-04
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        相关资源
        最近更新 更多