zoukankan      html  css  js  c++  java
  • 获取加速度数据,陀螺仪数据,磁场数据的两种方式-陈鹏

    下面程序示范了如何通过代码来获取加速度数据、陀螺仪数据、磁场数据。新建一个SingleView Application,该项目包含一个应用程序委托类,一个视图控制器类和Main.storyboard

    界面设计文件。

    打开界面设计文件,向其中拖入3个UILbale,并将它们的lines属性设为“0”,这个3个UILabel用于显示程序获取的加速度数据、陀螺仪数据,磁场数据。为了在程序中访问它们,需要将它们绑定到视图控制器的accelerometerLabelgyroLabelmagnetometerLabel这3个IBOutlet属性。

      下面是该示例视图控制器代码:

    一、基于代码块方式获取

    @interface ViewController ()
    {
    
    }
    @property (weak, nonatomic) IBOutlet UILabel *gyroLabel;
    @property (weak, nonatomic) IBOutlet UILabel *accelerometerLabel;
    @property (weak, nonatomic) IBOutlet UILabel *magnetometerLabel;
    @property (strong,nonatomic)CMMotionManager * motionManager;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        //CFMotionmangaer对象
        self.motionManager = [[CMMotionManager alloc]init];
        NSOperationQueue * queue = [[NSOperationQueue alloc] init];
        //如果CMMotionManager支持获取加速度数据
        if (self.motionManager.accelerometerAvailable) {
            //设置CMMotionManager的加速度数据更新频率为0.1秒
            self.motionManager.accelerometerUpdateInterval = 0.1;
            //使用代码块开始获取加速度数据
            [self.motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
                NSString * labelText;
                //如果发生了错误,error不为空
                if (error) {
                    //停止获取加速度数据
                    [self.motionManager stopAccelerometerUpdates];
                    labelText = [NSString stringWithFormat:@"获取加速度shuu出现错误:%@",error];
                }
                else
                {
                    FKbarllView * barllview = [[FKbarllView alloc] init];
                    barllview.acceleration = accelerometerData.acceleration;
                    
                    //分别获取系统在X,Y,Z轴上的加速度数据
                    labelText = [NSString stringWithFormat:@"加速度为
    -----
    X轴:%+.2f
    Y轴:%+.2f
    Z轴:%.2f",
                                 accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z];
                }
                //在主线程中更新accelerometerLabel的文本,显示加速度数据
                [self.accelerometerLabel performSelectorOnMainThread:@selector(setText:) withObject:labelText waitUntilDone:NO];
            }];
        }
        else{
            NSLog(@"该设备不支持获取加速度数据!");
        }
        //如果CMMotionManager支持获取陀螺仪数据
        if (self.motionManager.gyroAvailable) {
            //设置CMMotionManager的陀螺仪数据更新频率为0.1秒
            [self.motionManager startGyroUpdatesToQueue:queue withHandler:^(CMGyroData *gyroData, NSError *error) {
                NSString * labelText;
                //如果发生了错误,error不为空
                if(error)
                {
                    //停止获取陀螺仪数据
                    [self.motionManager stopGyroUpdates];
                    labelText = [NSString stringWithFormat:@"获取陀螺仪数据出现错误;%@",error];
                }
                else
                {
                    //分别获取设备烧X,Y,Z轴的转速
                    labelText = [NSString stringWithFormat:@"绕各轴的转速为
    -----
    X轴:%+.2f
    Y轴:%+.2f
    Z轴:%.2f",
                            gyroData.rotationRate.x,
                                 gyroData.rotationRate.y,
                                 gyroData.rotationRate.z];
                }
                //在主线程中更新gyroLabel的文本,显示绕各轴的转速
                [self.gyroLabel performSelectorOnMainThread:@selector(setText:) withObject:labelText  waitUntilDone:NO];
            }];
        }else
        {
            NSLog(@"该设备不支持获取陀螺仪数据!");
        }
        //如果CMMotionManager支持获取磁场数据
        if (self.motionManager.magnetometerAvailable) {
            //设置CMMot的磁场数据更新频率为0.1秒
            self.motionManager.magnetometerUpdateInterval = 0.1f;
            [self.motionManager startMagnetometerUpdatesToQueue:queue withHandler:^(CMMagnetometerData * magnetometerData, NSError *error) {
                NSString * labelText;
                if (error) {
                    //停止获取数据
                    [self.motionManager stopMagnetometerUpdates];
                    labelText = [NSString stringWithFormat:@"获取磁场数据出现错误;%@",error];
                }
                else{
                    labelText = [NSString stringWithFormat:@"磁场数据为
    -----
    X轴:%+.2f
    Y轴:%+.2f
    Z轴:%.2f",
                                 magnetometerData.magneticField.x,
                                 magnetometerData.magneticField.y,
                                 magnetometerData.magneticField.z];
                }
                //在主线程中更新magnetometerLabel的文本,显示磁场数据
                [self.magnetometerLabel performSelectorOnMainThread:@selector(setText:) withObject:labelText waitUntilDone:NO];
            }];
        }
        else
        {
            NSLog(@"该设备不支持获取磁场数据!");
        }
        
        
    }
    

    下面程序示范了如何通过主动请求来获取加速度数据、陀螺仪数据、磁场数据。新建一个SingleView Application,该项目包含一个应用程序委托类,一个视图控制器类和Main.storyboard

    界面设计文件。

    打 开界面设计文件,向其中拖入3个UILbale,并将它们的lines属性设为“0”,这个3个UILabel用于显示程序获取的加速度数据、陀螺仪数 据,磁场数据。为了在程序中访问它们,需要将它们绑定到视图控制器的accelerometerLabelgyroLabel magnetometerLabel这3个IBOutlet属性。

      下面是该示例视图控制器代码:

    二、主动请求获取

    @interface ViewController ()
    {
        NSTimer * updateTimer;
        
    }
    @property (weak, nonatomic) IBOutlet UILabel *accelerometerLabel;
    @property (weak, nonatomic) IBOutlet UILabel *gyroLabel;
    @property (weak, nonatomic) IBOutlet UILabel *magnetometerLabel;
    
    @property (strong,nonatomic) CMMotionManager* motionMaager;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        //创建CMMotionManager对象
        self.motionMaager = [[CMMotionManager alloc] init];
        //如果CMMotionManager支持获取加速度数据
        if (self.motionMaager.accelerometerAvailable) {
            [self.motionMaager startAccelerometerUpdates];
        }
        else
        {
            NSLog(@"该设备不支持获取加速度数据!");
        }
        //如果CMMotionManager支持获取陀螺仪数据
        if (self.motionMaager.gyroAvailable) {
            [self.motionMaager startGyroUpdates];
        }
        else
        {
            NSLog(@"该设备不支持获取陀螺仪数据!");
        }
        //如果CMMotionManager支持获取磁场数据
        if (self.motionMaager.magnetometerAvailable) {
            [self.motionMaager startMagnetometerUpdates];
        }
        else
        {
            NSLog(@"该设备不支持获取磁场数据!");
        }
    }
    -(void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        //启动定时器来周期性轮询加速度数据,陀螺仪数据,磁场数据
        updateTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateDisplay) userInfo:nil repeats:YES];
    }
    -(void)updateDisplay
    {
        //如果CMMotionManager的加速度数据可用
        if (self.motionMaager.accelerometerAvailable) {
            //主动请求获取加速度数据
            CMAccelerometerData * accelerometerData = self.motionMaager.accelerometerData;
            self.accelerometerLabel.text = [NSString stringWithFormat:@"加速度为
    -
    X轴:%+.2f
    Y轴:%+.2f
    Z轴:%+.2f",accelerometerData.acceleration.x,
                                            accelerometerData.acceleration.y
                                            ,accelerometerData.acceleration.z];
        }
        //如果CMMotionManager的陀螺仪数据可用
        if (self.motionMaager.gyroAvailable) {
            //主动请求获取加速度数据
            CMGyroData * gyroData = self.motionMaager.gyroData;
    //        gyroData.rotationRate
            self.gyroLabel.text = [NSString stringWithFormat:@"陀螺仪数据为
    -
    X轴:%+.2f
    Y轴:%+.2f
    Z轴:%+.2f",gyroData.rotationRate.x,
                                            gyroData.rotationRate.y
                                            ,gyroData.rotationRate.z];
        }
        //如果CMMotionManager的磁场数据可用
        if (self.motionMaager.magnetometerAvailable) {
            //主动请求获取加速度数据
            CMMagnetometerData * magnetometerData = self.motionMaager.magnetometerData;
            
            self.magnetometerLabel.text = [NSString stringWithFormat:@"加速度为
    -
    X轴:%+.2f
    Y轴:%+.2f
    Z轴:%+.2f",magnetometerData.magneticField.x,
                                            magnetometerData.magneticField.y
                                            ,magnetometerData.magneticField.z];
        }
    }
    

     ,在真机上运行这两个程序,将可以看到运行结果

  • 相关阅读:
    一、第一个小程序
    Golang学习笔记
    第四章 自上而下分析
    个人vim配置
    第三章 词法分析
    3.7 TCP拥塞控制
    3.6 拥塞控制原理
    3.5 面向连接的运输:TCP
    3.4可靠数据传输的原理
    3.3 无连接运输:UDP
  • 原文地址:https://www.cnblogs.com/sixindev/p/4506069.html
Copyright © 2011-2022 走看看