2012-07-08 6 views
8

북쪽에서 장치의 편차를도 단위로 가져오고 자하는 코드에서이 값을 사용하고 싶습니다.iOS 클래스/코드가 자북을 반환합니까?

나는 장치의 위치 서비스를 사용하고 싶지 않으므로 나는 진정한 북쪽이 아니라 자기 북쪽 (장치의 자력계 만 사용)에 관심이있다.

어떤 등급 (또는 코딩 과정 ..)이 그 값을 제공 할 수 있습니까 (자력계에만 의존)?

CLLocationManager 클래스와 속성이 위치 서비스에 의존는/사용할 수 활성화되고

곳의 CMMagnetometerData 클래스와 코어 모션 프레임 워크는 다음과 같은 속성을 우리에게 제공과 같이 내가 어떻게합니까

@property(readonly, nonatomic) CMMagneticField magneticField 

A structure containing 3-axis magnetometer data 

typedef struct { 
    double x; 
    double y; 
    double z; 
} CMMagneticField; 

그걸 벗어난거야? 또는 자력계에서 학위를 취득하기위한 다른 방법 (클래스/속성/메소드)이 있습니까?

미리 알려 주셔서 감사합니다. :)

답변

12

iOS documentation은 CMMagneticField 데이터가 원시임을 나타내며 이는 장치 자체 및 주변에서 발생하는 바이어스를 포함한다는 것을 의미합니다. CMDeviceMotion은 필터링 된 동일한 자장 값을 제공합니다.

자기 북을 결정하려면 필터링 된 값을 사용해야하며 장치는 지구 표면과 수평을 유지해야합니다. 자기장의 X 및 Y 값 (각도 자북의 편차)의 각도를 알면

다음 formula 계산 될 수의 Obj-C에서

if (y>0): heading = 90.0 - [arcTan(x/y)]*180/π 
if (y<0): heading = 270.0 - [arcTAN(x/y)]*180/π 
if (y=0, x<0): heading = 180.0 
if (y=0, x>0): heading = 0.0 

, 만약 CMMagnetometerData 개체가 가정

double heading = 0.0; 
double x = magnetometerData.magneticField.x; 
double y = magnetometerData.magneticField.y; 
double z = magnetometerData.magneticField.z; 

if (y > 0) heading = 90.0 - atan(x/y)*180.0/M_PI; 
if (y < 0) heading = 270.0 - atan(x/y)*180.0/M_PI; 
if (y == 0 && x < 0) heading = 180.0; 
if (y == 0 && x > 0) heading = 0.0; 
+0

장치를 들고있는 방법에 관계없이 자기 북쪽을 얻고 싶다면 어떻게해야합니까? 예 : iPhone 4S의 디지털 나침반은 기기를 들고있는 방식과 상관없이 Magnetic North (위치 서비스 사용 중지됨)를 반환합니다. 어떻게하면 될까요? –

+0

당신이 제안한 공식이 유효하지 않습니다 Objective-C –

+0

유효한 Objective-C 코드로 변환되었지만 항상 0도를 받았습니다. –

-2

당신은 사과 응용 프로그램을 모방하기 위해 센서를 융합해야합니다 같을 것이라고, magnetometerData했다. 그들은 자이로 가속도계와 자력계를 사용하고, 당신은 깨끗한 결과를 내기 위해 배운 것이거나 없을지도 모르는 고급 수학을 사용합니다. 행운을 빕니다. 당신은 아마 그들을 모방 할 수 없을 것입니다.

+1

질문을 읽으셨습니까? 저자가 무엇을 요구했는지주의 깊게 확인하십시오. – Trinimon