iOS开发- CMMotionManager 开发


iOS 中常见传感器如下所示:

类型作用
环境光传感器感应光照强度
距离传感器感应靠近设备屏幕的物体
磁力计传感器感应周边磁场
内部温度传感器感应设备内部温度(非公开)
湿度传感器感应设备是否进水(非微电子传感器)
陀螺仪感应持握方式
加速计感应设备运动

其中陀螺仪、加速计和磁力计的数据获取均依赖于 CMMotionManager。

一、CMMotionManager

CMMotionManager 是 Core Motion 库的核心类,负责获取和处理手机的运动信息,它可以获取的数据有

  • 加速度,标识设备在三维空间中的瞬时加速度
  • 陀螺仪,标识设备在三个主轴上的瞬时旋转
  • 磁场信息,标识设备相对于地球磁场的方位
  • 设备运动数据,标识关键的运动相关属性,包括设备用户引起的加速度、姿态、旋转速率、相对于校准磁场的方位以及相对于重力的方位等,这些数据均来自于 Core Motion 的传感器融合算法,从这一个数据接口即可获取以上三种数据,因此使用较为广泛

CMMotionManager 有 “push” 和 “pull” 两种方式获取数据,push 方式实时获取数据,采样频率高,pull 方式仅在需要数据时采集数据,Apple 更加推荐这种方式获取数据。

1.1 push方式

将 CMMotionManager 采集频率 interval 设置好以后,CMMotionManager 会在一个操作队列里从特定的 block 返回实时数据更新,这里以设备运动数据 DeviceMotion 为例,代码如下

   let motionManager = CMMotionManager()
   motionManager.gyroUpdateInterval = 0.01
        motionManager.startGyroUpdates(to: OperationQueue.main) {[weak self] gyroData, error in
            guard let self = self else { return }
            guard error == nil else { return }
            guard let gyroData = gyroData else { return }
            let x = gyroData.rotationRate.x
            let y = gyroData.rotationRate.y
            let z = gyroData.rotationRate.z
        }

首先要注意尽可能在 app 中只创建一个 CMMotionManager 对象,多个 CMMotionManager 对象会影响从加速计和陀螺仪接受数据的速率。其次,在启动接收设备传感器信息前要检查传感器是否硬件可达,可以用
deviceMotionAvailable 检测硬件是否正常,用 deviceMotionActive 检测当前 CMMotionManager 是否正在提供数据更新。

暂停更新也很容易,直接调用 stopXXXUpdates 即可。

1.2pull 方式

仍以 DevideMotion 为例,pull 方式代码如下

 let motionManager = CMMotionManager()
motionManager.gyroUpdateInterval = 0.01
motionManager.startGyroUpdates()
let x = motionManager.gyroData?.rotationRate.x
let y = motionManager.gyroData?.rotationRate.y
let z = motionManager.gyroData?.rotationRate.z

但是这样的方式获取的数据实时性不高,第一次获取可能没有数据,同时要注意不能过于频繁的获取,否则可能引起崩溃。

二、设备运动类型

1. attitude

attitude 用于标识空间位置的欧拉角(roll、yaw、pitch)和四元数(quaternion)
请添加图片描述

CMDeviceMotion.attitude属性是CMAttitude类型,表示设备的空间姿态。CMAttitude包含pitch、roll、yaw信息(以弧度为单位):

pitch:以X轴为轴的转动角度。
roll:以Y轴为轴的转动角度。
yaw:以Z轴为轴的转动角度。
其中绕 x 轴运动称作 pitch(俯仰),绕 y 轴运动称作 roll(滚转),绕 z 轴运动称作 yaw(偏航)。

当设备正面向上、顶部指向正北、水平放置时,pitch、yaw 和 roll 值均为 0,其他变化如下
设备顶部上扬,pitch 由 0 递增 pi/2,顶部下沉,由 0 递减 pi/2
设备顶部左偏 180 度范围内,yaw 由 0 递增 pi,右偏递减
设备左部上旋,roll 由 0 递增 pi,左部下旋,roll 由 0 递减

2. rotationRate

rotationRate 标识设备旋转速率,具体变化如下
pitch 增加,x > 0,pitch 减少,x < 0
roll 增加,y > 0,row 减少,y < 0
yaw 增加,z > 0,yaw 减少,z < 0

3. gravity

gravity 用于标识重力在设备各个方向的分量,具体值的变化遵循如下规律:重力方向始终指向地球,而在设备的三个方向上有不同分量,最大可达 1.0,最小是 0.0。

4. userAcceleration

userAcceleration 用于标识设备各个方向上的加速度,注意是加速度值,可以标识当前设备正在当前方向上减速 or 加速。

5. magneticField & heading

magneticField 用于标识设备周围的磁场范围和精度,heading 用于标识北极方向。但是要注意,这两个值的检测需要指定 ReferenceFrame,它是一个 CMAttitudeReferenceFrame 的枚举,有四个值
CMAttitudeReferenceFrameXArbitraryZVertical
CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
CMAttitudeReferenceFrameXMagneticNorthZVertical
CMAttitudeReferenceFrameXTrueNorthZVertical
其中前两个 frame 下磁性返回非法负值,只有选择了 CMAttitudeReferenceFrameXMagneticNorthZVertical 或 CMAttitudeReferenceFrameXTrueNorthZVertical 才有有效值,这两个枚举分别指代磁性北极和地理北极。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS开发中上传图片可以采用以下步骤: 1.选择要上传的图片,可以使用系统提供的UIImagePickerController控制器,或者使用第三方库,例如TZImagePickerController。 2.将选中的图片转换为NSData格式。 3.使用NSURLSession或AFNetworking等网络库,将图片数据上传到服务器。 以下是一个简单的上传图片的示例代码: ``` // 选择图片 UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePicker.delegate = self; [self presentViewController:imagePicker animated:YES completion:nil]; // 将选中的图片转换为NSData格式 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info { UIImage *selectedImage = info[UIImagePickerControllerOriginalImage]; NSData *imageData = UIImageJPEGRepresentation(selectedImage, 0.5); // 上传图片到服务器 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration]; NSURL *url = [NSURL URLWithString:@"http://example.com/upload.php"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 处理服务器返回的响应 }]; [uploadTask resume]; [picker dismissViewControllerAnimated:YES completion:nil]; } ``` 其中,upload.php是服务器端接收图片的脚本文件。在服务器端,可以使用PHP等语言来处理上传的图片数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值