CoreMotion (加速儀與陀螺儀)

CoreMotion (加速儀與陀螺儀)

CoreMotion (加速儀與陀螺儀)

主要是使用?CMMotionManager

iOS中的主要傳感器:

@加速度傳感器電子羅盤陀螺儀

功能通過(guò)測(cè)量三個(gè)軸的加速度大小來(lái)判斷人體運(yùn)動(dòng)通過(guò)測(cè)量設(shè)備周圍地磁場(chǎng)的強(qiáng)度和方向來(lái)判斷朝向通過(guò)測(cè)量三個(gè)軸的旋轉(zhuǎn)速率來(lái)判斷朝向

主要局限性受重力干擾大握玛,瞬時(shí)誤差大誤差大亿驾, 容易受其他磁場(chǎng)和金屬物體影響势就。主要用于校正其他設(shè)備誤差會(huì)累積,長(zhǎng)時(shí)間讀數(shù)的準(zhǔn)確性差

應(yīng)用活動(dòng)測(cè)量導(dǎo)航導(dǎo)航

加速儀 (類型:CMAcceleration)

簡(jiǎn)介:

加速儀可以檢測(cè)三維空間中的加速度 ,坐標(biāo)對(duì)應(yīng)如下:

例如:當(dāng)垂直手持手機(jī)且頂部向上格侯,Y坐標(biāo)上回收到 -1G的加速度格仲。

陀螺儀 (類型:CMRotationRate)

簡(jiǎn)介:

陀螺儀用于檢測(cè)設(shè)備繞XYZ軸轉(zhuǎn)動(dòng)的速度,坐標(biāo)對(duì)應(yīng)如下:

deviceMotion

包含下面四種數(shù)據(jù):

attitude(類型:CMAttitude)

返回設(shè)備的方位信息,包含roll 引颈、pitch耕皮、yaw三個(gè)歐拉角的值

roll: 設(shè)備繞 Z 軸轉(zhuǎn)過(guò)的角度

pitch: 設(shè)備繞 X 軸轉(zhuǎn)過(guò)的角度

yaw: 設(shè)備繞 Y 軸轉(zhuǎn)過(guò)的角度

rotationRate(類型:CMRotationRate)

經(jīng)過(guò)濾波操作之后的陀螺儀數(shù)據(jù),即 靜止時(shí)蝙场,三個(gè)方向的轉(zhuǎn)動(dòng)速度接近于0凌停;

gravity(類型:CMAcceleration)

返回重力對(duì)設(shè)備在三個(gè)方向上的加速度

即重力加速度矢量在當(dāng)前設(shè)備的參考坐標(biāo)系中的表達(dá),開發(fā)中不再需要通過(guò)濾波來(lái)提取這個(gè)信息

userAcceleration(類型:CMAcceleration)

返回用戶對(duì)設(shè)備在三個(gè)方向上的加速度

不再需要濾波售滤,但根據(jù)程序需求而加的濾波算法可以保留

示例:

數(shù)據(jù)獲取方式有兩種:主動(dòng)獲确D狻(pull),基于代碼塊獲韧曷帷(push)

主動(dòng)獲取

-(void)viewDidLoad{[superviewDidLoad];// 創(chuàng)建CMMotionManager對(duì)象self.motionManager = [[CMMotionManager alloc] init];// ①// 如果CMMotionManager的支持獲取加速度數(shù)據(jù)if(self.motionManager.accelerometerAvailable){? ? [self.motionManager startAccelerometerUpdates];}else{NSLog(@"該設(shè)備不支持獲取加速度數(shù)據(jù)赐俗!");}// 如果CMMotionManager的支持獲取陀螺儀數(shù)據(jù)if(self.motionManager.gyroAvailable){? ? [self.motionManager startGyroUpdates];}else{NSLog(@"該設(shè)備不支持獲取陀螺儀數(shù)據(jù)!");}// 如果CMMotionManager的支持獲取磁場(chǎng)數(shù)據(jù)if(self.motionManager.magnetometerAvailable){? ? [self.motionManager startMagnetometerUpdates];}else{NSLog(@"該設(shè)備不支持獲取磁場(chǎng)數(shù)據(jù)弊知!");}}-(void)viewWillAppear:(BOOL)animated{[superviewWillAppear:animated];// 啟動(dòng)定時(shí)器來(lái)周期性地輪詢加速度阻逮、陀螺儀、磁場(chǎng)數(shù)據(jù)updateTimer = [NSTimerscheduledTimerWithTimeInterval:0.1target:selfselector:@selector(updateDisplay)? ? userInfo:nilrepeats:YES];// ②}-(void)updateDisplay{// 如果CMMotionManager的加速度數(shù)據(jù)可用if(self.motionManager.accelerometerAvailable){// 主動(dòng)請(qǐng)求獲取加速度數(shù)據(jù)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的陀螺儀數(shù)據(jù)可用if(self.motionManager.gyroAvailable){// 主動(dòng)請(qǐng)求獲取陀螺儀數(shù)據(jù)CMGyroData* gyroData =self.motionManager.gyroData;self.gyroLabel.text = [NSStringstringWithFormat:@"繞各軸的轉(zhuǎn)速為\n--------\nX軸: %+.2f\nY軸: %+.2f\nZ軸: %+.2f",? ? ? ? gyroData.rotationRate.x,? ? ? ? gyroData.rotationRate.y,? ? ? ? gyroData.rotationRate.z];}// 如果CMMotionManager的磁場(chǎng)數(shù)據(jù)可用if(self.motionManager.magnetometerAvailable){// 主動(dòng)請(qǐng)求獲取磁場(chǎng)數(shù)據(jù)CMMagnetometerData* magnetometerData =self.motionManager.magnetometerData;self.magnetometerLabel.text =? [NSStringstringWithFormat:@"磁場(chǎng)數(shù)據(jù)為\n--------\nX軸: %+.2f\nY軸: %+.2f\nZ軸: %+.2f",? ? ? ? magnetometerData.magneticField .x,? ? ? ? magnetometerData.magneticField .y,? ? ? ? magnetometerData.magneticField .z];}}

結(jié)果如下:

基于代碼塊獲取

self.motionManager = [[CMMotionManager alloc]init];if(_motionManager.isDeviceMotionAvailable) {//更新數(shù)據(jù)頻率_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}];? ? ? ? }];? ? }

簡(jiǎn)單應(yīng)用

圖片無(wú)論在設(shè)備如何傾斜的情況下都保持水平

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);}];}

結(jié)果如下:

敲擊手掌的時(shí)候?qū)崿F(xiàn)導(dǎo)航返回

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];? ? }}];}

結(jié)果如下:

旋轉(zhuǎn)改變頁(yè)面

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];? ? }}];}

結(jié)果如下:

計(jì)算設(shè)備的位移

理論上設(shè)備一開始靜止秩彤,就可以通過(guò)加速度和時(shí)間的值來(lái)計(jì)算設(shè)備的位移夺鲜,(時(shí)間越長(zhǎng) 誤差越大),然是嘗試了一下 做不到呐舔,誤差太大币励,看來(lái)加速計(jì)做不了這么精細(xì)的活。珊拼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末食呻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仅胞,老刑警劉巖每辟,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異干旧,居然都是意外死亡渠欺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門椎眯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挠将,“玉大人,你說(shuō)我怎么就攤上這事编整√蛳。” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵掌测,是天一觀的道長(zhǎng)内贮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)汞斧,這世上最難降的妖魔是什么夜郁? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮粘勒,結(jié)果婚禮上竞端,老公的妹妹穿的比我還像新娘。我一直安慰自己仲义,他們只是感情好婶熬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布剑勾。 她就那樣靜靜地躺著埃撵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虽另。 梳的紋絲不亂的頭發(fā)上暂刘,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音捂刺,去河邊找鬼谣拣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛族展,可吹牛的內(nèi)容都是我干的森缠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼仪缸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贵涵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宾茂,失蹤者是張志新(化名)和其女友劉穎瓷马,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跨晴,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欧聘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了端盆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怀骤。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖爱谁,靈堂內(nèi)的尸體忽然破棺而出晒喷,到底是詐尸還是另有隱情,我是刑警寧澤访敌,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布凉敲,位于F島的核電站,受9級(jí)特大地震影響寺旺,放射性物質(zhì)發(fā)生泄漏爷抓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一阻塑、第九天 我趴在偏房一處隱蔽的房頂上張望蓝撇。 院中可真熱鬧,春花似錦陈莽、人聲如沸渤昌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)独柑。三九已至,卻和暖如春私植,著一層夾襖步出監(jiān)牢的瞬間忌栅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工曲稼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留索绪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓贫悄,卻偏偏與公主長(zhǎng)得像瑞驱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窄坦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348