From http://furnacedigital.blogspot.com/2011/12/magnetometer.html

取得指南針 / 羅盤 / Magnetometer 數值的方法

 
 

目前大部份的 iOS 裝置都有支援 Magnetometer 指南針的功能,透過 Core Location 的Framework 就可以輕易取得 Magnetometer 當前的數值(角度),請看以下程式碼示範。

首先加入對應的 Framework,與標頭檔,如果不知道如何新增 Framework 的讀者們,可以參考 Xcode 4 新增 Framework 的方法一文。


1
#import <CoreLocation/CoreLocation.h>

之後在對應的 Class 中設定 CLLocationManagerDelegate 的代理方法,並增加一個 CLLocationManager 型態的指標 locationManager,如下(此範例是寫在 ViewCotroller 中)。

1
2
3
4
@interfaceMLViewController :UIViewController<CLLocationManagerDelegate> {
 
CLLocationManager*locationManager;
}

接著 回到程式碼中對 locationManager 進行初始化的動作,並且設定其更新的角度度數。

1
2
3
4
5
6
7
8
9
//locationManager初始化(已使用ARC機制)
locationManager = [[CLLocationManageralloc] init];
locationManager.delegate =self;
 
//設定需要重新定位的角度差距
locationManager.headingFilter =3;
 
[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];

完成上述設置之後,下面我們就可以開始使用 Framework 所提供的功能來取得指南針的角度讀數,每當指南針的角度變化大於上述所設定的角度差距,就會呼叫下列的內建函式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//內建函式
- (void)locationManager:(CLLocationManager*)manager didUpdateHeading:(CLHeading*)newHeading {
 
   //判斷magneticHeading的精準度
   if(newHeading.headingAccuracy >0) {
 
       //取得角度值-磁北(0-北, 90-東, 180-南, 270-西)
       CLLocationDirectiontheHeading = newHeading.magneticHeading;
 
       //取得角度值-正北(0-北, 90-東, 180-南, 270-西)
       //CLLocationDirection theHeading = newHeading.trueHeading;
 
       NSLog(@"%f", theHeading);
   } else{
       NSLog(@"需校正");
   }
}

上述程式碼中 headingAccuracy 是一個 double 形態的唯讀值,它代表了真正磁北與 magneticHeading 之間的誤差值,正常運作下 headingAccuracy 皆為正值,如果出現負數則代表 magneticHeading 要做 8 字形的校正。


若在使用上有需要系統做校正上的提示,可以使用下列內建函式,並回傳一個 YES 的布林值。

1
2
3
4
//內建函式
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager*)manager {
   returnYES;
}

ps:有關 Core Location 的其它應用,可以參考使用 Core Location 做簡易的定位ㄧ文。
文章標籤
全站熱搜
創作者介紹
創作者 zer931 的頭像
zer931

zer931的部落格

zer931 發表在 痞客邦 留言(0) 人氣(263)