iOS 传感器(加速计 + 陀螺仪)

举报
福州司马懿 发表于 2021/11/19 05:45:14 2021/11/19
【摘要】  iOS中常用的传感器主要有以下2种  (1)加速计     加速计使用度量单位g,这是重力(gravity)的简称。1g是物体在地球的海平面上收到的下拉力(9.8米/秒)     加速计以相对于自由落体的方式度量加速度。   &...

 iOS中常用的传感器主要有以下2种

 (1)加速计

    加速计使用度量单位g,这是重力(gravity)的简称。1g是物体在地球的海平面上收到的下拉力(9.8米/秒)

    加速计以相对于自由落体的方式度量加速度。

    这意味着如果将iOS设备在能够持续自由落体的地方丢下,在下落过程中,其加速计测量到的加速度将为0g

    另一方面,放在左面上的设备的加速度计测量出的加速度为1g,且方向朝上。

 (2)陀螺仪

    陀螺仪将报告设备绕xyz轴的旋转速度,单位为弧度每秒

     2弧度等于1圈,所以陀螺仪返回读数2.0表示设备绕相应的轴每秒旋转一圈

 (3)两者的区别

    仅当设备的朝向相对于重力的方向发生变化时,加速计才能检测的到;而无论设备处于什么朝向,只要它在旋转,陀螺仪都能检测的到


主要代码如下,分别用了2种方式获取数据

(1)定时器(NSTimer)

(2)操作队列(NSOperationQueue)


  
  1. #import <CoreMotion/CoreMotion.h>
  2. #define ACCELEROMETER_UPDATE_INTERVAL 1.0
  3. #define GYRO_UPDATE_INTERVAL 1.0
  4. @interface ViewController () {
  5. CMMotionManager *motionManager;
  6. }
  7. @end
  8. @implementation ViewController
  9. - (void)viewDidLoad {
  10. [super viewDidLoad];
  11. // Do any additional setup after loading the view, typically from a nib.
  12. motionManager = [[CMMotionManager alloc] init];
  13. [self startAccelerometerSensor];
  14. [self startGyroSensor];
  15. [self startDeviceOrientationChangeListener];
  16. }
  17. //加速计
  18. -(void)startAccelerometerSensor {
  19. //更新时间间隔
  20. motionManager.accelerometerUpdateInterval = ACCELEROMETER_UPDATE_INTERVAL;
  21. //开始获取数据
  22. [motionManager startAccelerometerUpdates];
  23. //(1)使用”定时器“(NSTimer)获取数据
  24. [NSTimer scheduledTimerWithTimeInterval:ACCELEROMETER_UPDATE_INTERVAL target:self selector:@selector(accelerometerDidUpdate) userInfo:nil repeats:YES];
  25. //(2)将数据传递给“操作队列”(NSOperationQueue)
  26. NSOperationQueue *operationQueue = [NSOperationQueue currentQueue];
  27. [motionManager startAccelerometerUpdatesToQueue:operationQueue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
  28. CMAcceleration acceleration = accelerometerData.acceleration;
  29. NSLog(@"acceleration (%lf,%lf,%lf)", acceleration.x, acceleration.y, acceleration.z);
  30. }];
  31. //[motionManager stopAccelerometerUpdates];
  32. }
  33. - (void)accelerometerDidUpdate {
  34. CMAcceleration acceleration = motionManager.accelerometerData.acceleration;
  35. NSLog(@"acceleration (%lf,%lf,%lf)", acceleration.x, acceleration.y, acceleration.z);
  36. }
  37. //陀螺仪
  38. -(void)startGyroSensor {
  39. //首先需要判断陀螺仪是否可用,因为2010年以前的设备是没有“陀螺仪”的
  40. if(motionManager.gyroAvailable) {
  41. //更新时间间隔
  42. motionManager.gyroUpdateInterval = GYRO_UPDATE_INTERVAL;
  43. //开始获取数据
  44. [motionManager startGyroUpdates];
  45. //(1)使用”定时器“(NSTimer)获取数据
  46. [NSTimer scheduledTimerWithTimeInterval:GYRO_UPDATE_INTERVAL target:self selector:@selector(gyroDidUpdate) userInfo:nil repeats:YES];
  47. //(2)将数据传递给“操作队列”(NSOperationQueue)
  48. NSOperationQueue *operationQueue = [NSOperationQueue currentQueue];
  49. [motionManager startGyroUpdatesToQueue:operationQueue withHandler:^(CMGyroData * gyroData, NSError * error) {
  50. CMRotationRate rotationRate = gyroData.rotationRate;
  51. NSLog(@"gyro (%lf,%lf,%lf)", rotationRate.x, rotationRate.y, rotationRate.z);
  52. }];
  53. //[motionManager stopGyroUpdates];
  54. } else {
  55. NSLog(@"gyro not available");
  56. }
  57. }
  58. -(void)gyroDidUpdate {
  59. CMRotationRate rotationRate = motionManager.gyroData.rotationRate;
  60. NSLog(@"gyro (%lf,%lf,%lf)", rotationRate.x, rotationRate.y, rotationRate.z);
  61. }
需要注意的是:模拟器是无法对传感器进行测试的,所以请使用真机运行以上代码

文章来源: blog.csdn.net,作者:福州-司马懿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/chy555chy/article/details/51724267

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。