CoreMotion (加速仪与陀螺仪)

CoreMotion (加速仪与陀螺仪)

CoreMotion (加速仪与陀螺仪)

主要是使用 CMMotionManager

iOS中的主要传感器:

@加速度传感器电子罗盘陀螺仪

功能通过测量三个轴的加速度大小来判断人体运动通过测量设备周围地磁场的强度和方向来判断朝向通过测量三个轴的旋转速率来判断朝向

主要局限性受重力干扰大,瞬时误差大误差大, 容易受其他磁场和金属物体影响。主要用于校正其他设备误差会累积,长时间读数的准确性差

应用活动测量导航导航

加速仪 (类型:CMAcceleration)

简介:

加速仪可以检测三维空间中的加速度 ,坐标对应如下:

例如:当垂直手持手机且顶部向上,Y坐标上回收到 -1G的加速度。

陀螺仪 (类型:CMRotationRate)

简介:

陀螺仪用于检测设备绕XYZ轴转动的速度,坐标对应如下:

deviceMotion

包含下面四种数据:

attitude(类型:CMAttitude)

返回设备的方位信息,包含roll 、pitch、yaw三个欧拉角的值

roll: 设备绕 Z 轴转过的角度

pitch: 设备绕 X 轴转过的角度

yaw: 设备绕 Y 轴转过的角度

rotationRate(类型:CMRotationRate)

经过滤波操作之后的陀螺仪数据,即 静止时,三个方向的转动速度接近于0;

gravity(类型:CMAcceleration)

返回重力对设备在三个方向上的加速度

即重力加速度矢量在当前设备的参考坐标系中的表达,开发中不再需要通过滤波来提取这个信息

userAcceleration(类型:CMAcceleration)

返回用户对设备在三个方向上的加速度

不再需要滤波,但根据程序需求而加的滤波算法可以保留

示例:

数据获取方式有两种:主动获取(pull),基于代码块获取(push)

主动获取

-(void)viewDidLoad{[superviewDidLoad];// 创建CMMotionManager对象self.motionManager = [[CMMotionManager alloc] init];// ①// 如果CMMotionManager的支持获取加速度数据if(self.motionManager.accelerometerAvailable){    [self.motionManager startAccelerometerUpdates];}else{NSLog(@"该设备不支持获取加速度数据!");}// 如果CMMotionManager的支持获取陀螺仪数据if(self.motionManager.gyroAvailable){    [self.motionManager startGyroUpdates];}else{NSLog(@"该设备不支持获取陀螺仪数据!");}// 如果CMMotionManager的支持获取磁场数据if(self.motionManager.magnetometerAvailable){    [self.motionManager startMagnetometerUpdates];}else{NSLog(@"该设备不支持获取磁场数据!");}}-(void)viewWillAppear:(BOOL)animated{[superviewWillAppear:animated];// 启动定时器来周期性地轮询加速度、陀螺仪、磁场数据updateTimer = [NSTimerscheduledTimerWithTimeInterval:0.1target:selfselector:@selector(updateDisplay)    userInfo:nilrepeats:YES];// ②}-(void)updateDisplay{// 如果CMMotionManager的加速度数据可用if(self.motionManager.accelerometerAvailable){// 主动请求获取加速度数据CMAccelerometerData* accelerometerData =self.motionManager.accelerometerData;self.accelerometerLabel.text  = [NSStringstringWithFormat:@"加速度为\n-----------\nX轴: %+.2f\nY轴: %+.2f\nZ轴: %+.2f",        accelerometerData.acceleration.x,        accelerometerData.acceleration.y,        accelerometerData.acceleration.z];}// 如果CMMotionManager的陀螺仪数据可用if(self.motionManager.gyroAvailable){// 主动请求获取陀螺仪数据CMGyroData* gyroData =self.motionManager.gyroData;self.gyroLabel.text = [NSStringstringWithFormat:@"绕各轴的转速为\n--------\nX轴: %+.2f\nY轴: %+.2f\nZ轴: %+.2f",        gyroData.rotationRate.x,        gyroData.rotationRate.y,        gyroData.rotationRate.z];}// 如果CMMotionManager的磁场数据可用if(self.motionManager.magnetometerAvailable){// 主动请求获取磁场数据CMMagnetometerData* magnetometerData =self.motionManager.magnetometerData;self.magnetometerLabel.text =  [NSStringstringWithFormat:@"磁场数据为\n--------\nX轴: %+.2f\nY轴: %+.2f\nZ轴: %+.2f",        magnetometerData.magneticField .x,        magnetometerData.magneticField .y,        magnetometerData.magneticField .z];}}

结果如下:

基于代码块获取

self.motionManager = [[CMMotionManager alloc]init];if(_motionManager.isDeviceMotionAvailable) {//更新数据频率_motionManager.deviceMotionUpdateInterval =1/60;        TestViewController * __weakweakSelf =self;NSOperationQueue*queue = [[NSOperationQueuealloc]init];        [_motionManager startDeviceMotionUpdatesToQueue:queue withHandler:^(CMDeviceMotion * _Nullable motion,NSError* _Nullable error) {doubleuserX = motion.userAcceleration.x;doubleuserY = motion.userAcceleration.y;//...[[NSOperationQueuemainQueue] addOperationWithBlock:^{//更新UI}];        }];    }

简单应用

图片无论在设备如何倾斜的情况下都保持水平

RotationViewController * __weakweakSelf =self;if(manager.accelerometerAvailable) {manager.accelerometerUpdateInterval =0.01f;[manager startAccelerometerUpdatesToQueue:[NSOperationQueuemainQueue]                          withHandler:^(CMAccelerometerData *data,NSError*error) {doublerotation = atan2(data.acceleration.x, data.acceleration.y) - M_PI;    weakSelf.imageView.transform =CGAffineTransformMakeRotation(rotation);}];}

结果如下:

敲击手掌的时候实现导航返回

ClunkViewController * __weakweakSelf =self;if(manager.deviceMotionAvailable) {manager.deviceMotionUpdateInterval =0.01f;[manager startDeviceMotionUpdatesToQueue:[NSOperationQueuemainQueue]                                  withHandler:^(CMDeviceMotion *data,NSError*error) {if(data.userAcceleration.x <-2.5f) {        [weakSelf.navigationController popViewControllerAnimated:YES];    }}];}

结果如下:

旋转改变页面

doubleshowPromptTrigger =1.0f;doubleshowAnswerTrigger =0.8f;+(double)magnitudeFromAttitude:(CMAttitude *)attitude {returnsqrt(pow(attitude.roll,2.0f) + pow(attitude.yaw,2.0f) + pow(attitude.pitch,2.0f));}FacingViewController * __weakweakSelf =self;if(manager.deviceMotionAvailable) {[manager startDeviceMotionUpdatesToQueue:[NSOperationQueuemainQueue]                                  withHandler:^(CMDeviceMotion *data,NSError*error) {// translate the attitude[data.attitude multiplyByInverseOfAttitude:initialAttitude];// calculate magnitude of the change from our initial attitudedoublemagnitude = [FacingViewController magnitudeFromAttitude:data.attitude];// show the promptif(!showingPrompt && (magnitude > showPromptTrigger)) {        showingPrompt =YES;        PromptViewController *promptViewController = [weakSelf.storyboard instantiateViewControllerWithIdentifier:@"PromptViewController"];        promptViewController.modalTransitionStyle =UIModalTransitionStyleCrossDissolve;        [weakSelf presentViewController:promptViewController animated:YEScompletion:nil];    }// hide the promptif(showingPrompt && (magnitude < showAnswerTrigger)) {        showingPrompt =NO;        [weakSelf dismissViewControllerAnimated:YEScompletion:nil];    }}];}

结果如下:

计算设备的位移

理论上设备一开始静止,就可以通过加速度和时间的值来计算设备的位移,(时间越长 误差越大),然是尝试了一下 做不到,误差太大,看来加速计做不了这么精细的活。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272