2012-07-08 31 views
8

Tôi muốn lấy độ lệch của thiết bị từ Bắc từ tính theo độ và sử dụng giá trị đó trong một số mã tôi đang viết.Lớp/mã iOS nào trả về từ Bắc?

Tôi không muốn sử dụng dịch vụ vị trí của thiết bị và do đó tôi không muốn nhận được True north mà đúng hơn là Magnetic Magnetic (chỉ sử dụng từ kế của thiết bị).

Lớp nào (hoặc quá trình mã hóa ..) có thể cung cấp cho tôi giá trị đó (chỉ dựa vào từ kế)?

lớp CLLocationManager và thuộc tính của nó dựa trên Location Services được kích hoạt/sẵn

nơi như khuôn khổ với lớp CMMagnetometerData nó Lõi chuyển động cho chúng ta những tài sản sau đây:

@property(readonly, nonatomic) CMMagneticField magneticField 

A structure containing 3-axis magnetometer data 

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

Làm thế nào để tôi nhận được độ trong số đó? hoặc là có một số cách khác (lớp/tài sản/phương pháp) để lấy độ ra khỏi từ kế chỉ?

Cảm ơn bạn trước bất kỳ ai có một số thông tin hữu ích về vấn đề đó! :)

Trả lời

12

iOS documentation nói rằng dữ liệu CMMagneticField là thô, có nghĩa là nó bao gồm độ lệch được giới thiệu từ chính thiết bị và môi trường xung quanh. CMDeviceMotion cung cấp các giá trị từ trường giống nhau được lọc.

Để xác định từ trường phía bắc, bạn nên sử dụng giá trị được lọc và thiết bị phải nằm ngang với bề mặt trái đất.

Biết x và y giá trị của từ trường góc (từ chối từ phía bắc từ tính bằng độ) có thể được tính toán với formula sau:

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 

Trong obj-C, giả sử bạn có một đối tượng CMMagnetometerData gọi là magnetometerData, trông giống như sau:

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

nếu tôi muốn lấy Bắc từ bất kể tôi đang cầm thiết bị như thế nào? ví dụ. la bàn kỹ thuật số trên iPhone 4S trả về từ Bắc (dịch vụ vị trí bị vô hiệu hóa) bất kể tôi đang cầm thiết bị như thế nào. Làm thế nào tôi có thể đạt được điều đó? –

+0

công thức bạn đề xuất không hợp lệ Mục tiêu-C –

+0

Tôi chuyển đổi nó thành mã Objective-C hợp lệ nhưng tôi nhận được 0 độ tất cả các thời gian .. –

-2

Bạn cần phải nung chảy cảm biến để bắt chước các ứng dụng của quả táo. Họ sử dụng gia tốc kế gyro và từ kế, và toán học nâng cao bạn có thể hoặc có thể không học được để tạo ra những kết quả rõ ràng như vậy. Chúc may mắn. Có thể bạn sẽ không thể bắt chước chúng.

+1

Bạn đã đọc câu hỏi chưa? Vui lòng kiểm tra kỹ những gì tác giả đã yêu cầu. – Trinimon