Grunderna för accelerometer-, gyroskop- och magnetometer-sensorer för iOS-applikationer

Grunderna för accelerometer-, gyroskop- och magnetometer-sensorer för iOS-apparater - dummies

En iOS-enhet har tre med väl dokumenterade gränssnitt för sensorer - accelerometern, gyroskopet och magnetometern. Precis som med orienteringssensorn börjar processen för dessa sensorer genom att starta och initiera en lyssnare som lyssnar på sensorhändelser. Här är koden från ViewDidLoad-metoden i Sensors View Controller:

 - (void) viewDidLoad {... accelerationTextView. aktiverad = NEJ; gyroscopeTextView. aktiverad = NEJ; magnetometerTextView. aktiverad = NEJ; ... // Ställ in motion manager self-> motionManager = [[CMMotionManager alloc] init]; själv-> Motion. accelerometerUpdateInterval = 1; själv-> Motion. gyroUpdateInterval = 1; själv-> Motion. magnetometerUpdateInterval = 1; ...} 

Objektet som ger dig tillgång till sensorhändelser är en förekomst av CMMotionManager-klassen. Du måste skapa en, och endast en, förekomst av den här klassen (det vill säga du måste behandla den som en Singleton, även om den inte är). Då ställer du in egenskaper som uppdateringsintervallet för var och en av sensorerna.

Nästa startar du övervakningen med metoderna startAccelerometerUpdatesToQueue, startGyroUpdatesToQueue och startMagnetometerUpdatesToQueue, som visas i metoden startMonitoringSensors (som kallas när du trycker på Start Monitoring-knappen):

 - (IBAction ) startMonitoringSensors: (id) avsändare {[self-> motionManager startAccelerometerUpdatesToQueue: [NSOperationQueue currentQueue] withHandler: ^ (CMAccelerometerData * accelerometerData, NSError * fel) {[självhandtagAccelerationUpdates: accelerometerData. acceleration];}]; [self-> motionManager startGyroUpdatesToQueue: [NSOperationQueue currentQueue] withHandler: ^ (CMGyroData * gyroscopeData, NSError * -fel) {[self handleGyroUpdates: gyroscopeData. rotationRate];}]; [self-> motionManager startMagnetometerUpdatesToQueue: [NSOperationQueue currentQueue] withHandler: ^ (CMMagnetometerData * magnetometerData, NSError * fel) {[självhandtagMagnetometerUpdates: magnetometerData. magneticField];}];} 

Var och en av dessa metoder kallas med ett inline-hanteringsblock med hjälp av withHandler-konstruktionen. Dessa inline-hanteringsblock kallar handtaget AccelerationUpdates, handleGyroUpdates och hanteraMagnetometerUpdates. Dessa metoder är följande:

 - (void) handtagAccelerationUpdates: (CMAcceleration) accelerationData {NSLog (@ "Acceleration. X>% f% f% f 1. 0) || (accelerationData. X 1. 0) || (accelerationData.y 1 0) || (accelerationData .z% f% f% f 0. 5) || (gyroRotationRate .x0.5) || (gyroRotationRate .y0.5) || (gyroRotationRate .z% f% f% f% f 3000. 0) {savedX = magneticField. x; savedY = magneticField. y; savedZ = magneticField. z; [magnetometerTextView setText: @ "I SENSE EVER!"];} else {[magnetometerTextView setText: @ "ALL CLEAR!"];}} 

Dessa metoder loggar in de rada data. Rå sensoravläsningar som visas med hjälp av NSLog visas nedan.

De föregående sensormetoderna tolkar även de råa sensorvärdena för att generera visningen som visas nedan.

Sensorerna använder heuristik för att ge meningsfull insikt:

  • Accelerometern mäter accelerationen i g-krafter, där 1 g-kraft motsvarar jordens dragkraft.

    Om accelerometern känner av rörelse som är större än jordens gravitation i vilken riktning som helst, visar det uppriktigt meddelandet, jag går fort! Annars visas den för långsamt.

  • Gyroskopet mäter rotation av enhetens tre axlar i radianer per sekund (1 radian per sekund betyder ungefär en sjätte av en rotation varje sekund). Därför, om det känner mest till rotation, skrivs det WHEE!

  • I magnetometerkoden skulle du använda en avstånd heuristisk för att känna av en stor förändring i magnetfältet.

    Om en sådan ändring inträffar visar appen jag SENSE NÅGON!

    Om inget ändras för ett intervall går det tillbaka till att tänkas att kusten är klar.