服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS CoreMotion实现设备运动加速度计陀螺仪

iOS CoreMotion实现设备运动加速度计陀螺仪

2021-04-09 15:32蓝畔湖光 IOS

这篇文章主要介绍了iOS CoreMotion实现设备运动加速度计陀螺仪,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

用于处理加速度计,陀螺仪,计步器和与环境有关的事件。

core motion框架从ios设备的板载硬件(包括加速计,陀螺仪,计步器,磁力计和气压计)报告与运动和环境有关的数据。您可以使用此框架访问硬件生成的数据,以便您可以在应用程序中使用它。例如,游戏可能使用加速度计和陀螺仪数据来控制屏幕上的游戏行为。 这个框架的许多服务都可以访问硬件记录的原始值和这些值的处理版本。处理后的值不包括第三方因素对该数据的造成不利影响的情况。例如,处理的加速度计值仅反映由用户引起的加速度,而不是由重力引起的加速度。

在ios 10.0或之后版本的ios应用程序必须在其info.plist文件中包含使用说明key的描述,以告知用户获取所需的数据类型及获取数据类型的目的。未能包含这些key会导致应用程序崩溃。特别是访问运动和健身数据时,必须声明 nsmotionusagedescription

设备运动

设备运动服务提供了一种简单的方法,让您获取应用程序的运动相关数据。原始的加速度计和陀螺仪数据需要处理,以消除其他因素(如重力)的偏差。设备运动服务为您处理这些数据,为您提供可以立即使用的精确数据。例如,此服务为用户启动的加速度和重力引起的加速度提供单独的值。因此,此服务可让您专注于使用数据来操纵您的内容,而不是处理该数据。 设备运动服务使用可用的硬件来生成cmdevicemotion对象,其中包含以下信息:

  1. 设备在三维空间中相对于参考框架的方向(或姿态)
  2. 无偏的旋转速度
  3. 当前重力矢量
  4. 用户生成的加速度矢量(无重力)
  5. 当前的磁场矢量

加速计

iOS CoreMotion实现设备运动加速度计陀螺仪

该图为,加速度计沿x,y和z轴的速度变化

加速度计测量沿一个轴的速度变化。 所有的ios设备都有一个三轴加速度计,它在图1所示的三个轴中的每一个轴上提供加速度值。加速度计报告的值以重力加速度的增量进行测量,值1.0代表9.8米的加速度 每秒(每秒)在给定的方向。 取决于加速度的方向,加速度值可能是正值或负值。

陀螺仪

iOS CoreMotion实现设备运动加速度计陀螺仪

该图为,旋转反向速率对陀螺仪绕x,y和z轴的影响变化

陀螺仪测量设备围绕空间轴旋转的速率。 许多ios设备都有一个三轴陀螺仪,它可以在图1所示的三个轴中的每一个轴上提供旋转值。旋转值以给定轴每秒的弧度为单位进行测量。 根据旋转的方向,旋转值可以是正值或负值。

代码示例

push方式获取数据

加速度计

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cmmotionmanager *manager = [[cmmotionmanager alloc] init];
if ([manager isaccelerometeravailable] && ![manager isaccelerometeractive]){
  nsoperationqueue *queue = [[nsoperationqueue alloc] init]; 
  manager.accelerometerupdateinterval = 0.1;//设置信息更新频率(0.1s获取一次)
  [manager startaccelerometerupdatestoqueue:queue
                 withhandler:^(cmaccelerometerdata *accelerometerdata, nserror *error)
   {
     cmacceleration acceleration = accelerometerdata.acceleration;
     
     nslog(@"x = %.04f", acceleration.x);
     nslog(@"y = %.04f", acceleration.y);
     nslog(@"z = %.04f", acceleration.z);
 
   }];
}

陀螺仪

?
1
2
3
4
5
6
7
8
9
10
11
12
13
cmmotionmanager *manager = [[cmmotionmanager alloc] init]; 
  if ([manager isgyroavailable] && ![manager isgyroactive]){   
    nsoperationqueue *queue = [[nsoperationqueue alloc] init];
    manager.gyroupdateinterval = 0.1;//设置信息更新频率(0.1s获取一次)
    [manager startgyroupdatestoqueue:queue
               withhandler:^(cmgyrodata *gyrodata, nserror *error)
     {
      cmrotationrate rotationrate = gyrodata.rotationrate;
      nslog(@"x = %.04f", rotationrate.x);
      nslog(@"y = %.04f", rotationrate.y);
      nslog(@"z = %.04f", rotationrate.z);
     }];
  }

pull方式获取数据

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#define screen_width [uiscreen mainscreen].bounds.size.width
#define screen_height [uiscreen mainscreen].bounds.size.height
@interface viewcontroller ()
@property (strong, nonatomic) cmmotionmanager *motionmanager;
//ui
@property (strong, nonatomic) uibutton *starbutton;       //启动 motionmanager
@property (strong, nonatomic) uibutton *pullbutton;       //拉取数据
@property (strong, nonatomic) uibutton *stopbutton;       //停止 motionmanager
@end
 
@implementation viewcontroller
#pragma mark - 懒加载
- (cmmotionmanager *)motionmanager{ 
  if (!_motionmanager) {   
    _motionmanager = [[cmmotionmanager alloc] init];
    _motionmanager.accelerometerupdateinterval = 0.1;
    _motionmanager.gyroupdateinterval = 0.1;
  }
  return _motionmanager;
}
 
 
- (uibutton *)starbutton{ 
  if (!_starbutton) {   
    _starbutton = [[uibutton alloc]initwithframe:cgrectmake(50, 100, 50, 50)];
    [_starbutton settitle:@"启动" forstate:uicontrolstatenormal];
    [_starbutton addtarget:self action:@selector(startmotion) forcontrolevents:uicontroleventtouchupinside];
  }
  return _starbutton;
}
 
- (uibutton *)pullbutton{ 
  if (!_pullbutton) {   
    _pullbutton = [[uibutton alloc]initwithframe:cgrectmake(screen_width/2-50, 100, 100, 50)];
    [_pullbutton settitle:@"拉取数据" forstate:uicontrolstatenormal];
    [_pullbutton addtarget:self action:@selector(pullmotiondata) forcontrolevents:uicontroleventtouchupinside];
  }
  return _pullbutton;
}
 
- (uibutton *)stopbutton{ 
  if (!_stopbutton) {   
    _stopbutton = [[uibutton alloc]initwithframe:cgrectmake(screen_width-100, 100, 50, 50)];
    [_stopbutton settitle:@"停止" forstate:uicontrolstatenormal];
    [_stopbutton addtarget:self action:@selector(stopmotion) forcontrolevents:uicontroleventtouchupinside];
  }
  return _stopbutton;
}
 
 
#pragma mark - 生命周期处理
- (void)viewdidload {
  [self.view addsubview:self.starbutton];
  [self.view addsubview:self.pullbutton];
  [self.view addsubview:self.stopbutton];
}
 
#pragma mark - pull
- (void)startmotion{
  if (self.motionmanager.isaccelerometeractive == no) {
    [self.motionmanager startaccelerometerupdates];
  }
  if (self.motionmanager.isgyroactive == no){
    [self.motionmanager startgyroupdates];
  }
}
 
- (void)pullmotiondata{ 
  //陀螺仪拉取数据
  cmgyrodata *gyrodata = [self.motionmanager gyrodata];
  cmrotationrate rotationrate = gyrodata.rotationrate;
  nslog(@"x = %.04f", rotationrate.x);
  nslog(@"y = %.04f", rotationrate.y);
  nslog(@"z = %.04f", rotationrate.z);
  
  //加速度计拉取数据
  cmaccelerometerdata *data = [self.motionmanager accelerometerdata];
  cmacceleration acceleration = data.acceleration;
  nslog(@"x = %.04f", acceleration.x);
  nslog(@"y = %.04f", acceleration.y);
  nslog(@"z = %.04f", acceleration.z);
}
 
- (void)stopmotion{ 
  //陀螺仪
  if (self.motionmanager.isgyroactive == yes) {
    [self.motionmanager stopgyroupdates];
  }
  //加速度计
  if (self.motionmanager.isaccelerometeractive == yes) {
    [self.motionmanager stopaccelerometerupdates];
  }
}
@end


device motion 拓展功能

iOS CoreMotion实现设备运动加速度计陀螺仪

?
1
2
3
4
5
6
7
8
9
10
11
cmmotionmanager *manager = [[cmmotionmanager alloc] init];
  
if ([manager isdevicemotionavailable] && ![manager isdevicemotionactive]){
 
  manager.devicemotionupdateinterval = 0.01f;
  [manager startdevicemotionupdatestoqueue:[nsoperationqueue mainqueue]
               withhandler:^(cmdevicemotion *data, nserror *error) {
                 double rotation = atan2(data.gravity.x, data.gravity.y) - m_pi;
                 self.imageview.transform = cgaffinetransformmakerotation(rotation);
               }];
}

加速度计拓展功能

iOS CoreMotion实现设备运动加速度计陀螺仪

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cmmotionmanager *manager = [[cmmotionmanager alloc] init];
manager.accelerometerupdateinterval = 0.1;
  
if ([manager isaccelerometeravailable] && ![manager isaccelerometeractive]){
    
  nsoperationqueue *queue = [[nsoperationqueue alloc] init];
  [manager startaccelerometerupdatestoqueue:queue
                 withhandler:^(cmaccelerometerdata *accelerometerdata, nserror *error)
   {
     cmacceleration acceleration = accelerometerdata.acceleration;
       
     if (acceleration.x < -2.0) {
       dispatch_async(dispatch_get_main_queue(), ^{
         [self.navigationcontroller popviewcontrolleranimated:yes];
       });
     }
   }];
}

上述代码, demo地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://juejin.im/post/5a33733351882506cf0eedfb

延伸 · 阅读

精彩推荐
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03