Video: What are the universal human rights? - Benedetta Berti 2024
En iOS-enhet har tre med godt dokumenterte grensesnitt for sensorer - akselerometeret, gyroskopet og magnetometeret. Som med orienteringssensoren begynner prosessen for disse sensorene ved å starte og initialisere en lytter som lytter etter sensorhendelser. Her er koden fra ViewDidLoad-metoden i sensorens visningskontroller:
- (void) viewDidLoad {… accelerationTextView. aktivert = NEI; gyroscopeTextView. aktivert = NEI; magnetometerTextView. aktivert = NEI; … // Sett opp bevegelsesbehandleren selv-> motionManager = [[CMMotionManager alloc] init]; selv-> MotionManager-. accelerometerUpdateInterval = 1; selv-> MotionManager-. gyroUpdateInterval = 1; selv-> MotionManager-. magnetometerUpdateInterval = 1; …}
Objektet som gir deg tilgang til sensorhendelser er en forekomst av CMMotionManager-klassen. Du må opprette en, og bare en, forekomst av denne klassen (det vil si, du må behandle den som en Singleton, selv om den ikke er). Deretter setter du egenskaper som oppdateringsintervall for hver av sensorene.
Deretter starter du overvåkingen ved hjelp av metodene startAccelerometerUpdatesToQueue, startGyroUpdatesToQueue og startMagnetometerUpdatesToQueue, som vist i metoden startMonitoringSensors (som kalles når du trykker Start Monitoring-knappen):
- (IBAction) startMonitoringSensors: (id) avsender {[self-> motionManager startAccelerometerUpdatesToQueue: [NSOperationQueue currentQueue] withHandler: ^ (CMAccelerometerData * akselerometerData, NSError * feil) {[selvbetjeningAccelerationUpdates: accelerometerData. akselerasjon];}]; [self-> motionManager startGyroUpdatesToQueue: [NSOperationQueue currentQueue] withHandler: ^ (CMGyroData * gyroscopeData, NSError * feil) {[self handleGyroUpdates: gyroscopeData. rotationRate];}]; [self-> motionManager startMagnetometerUpdatesToQueue: [NSOperationQueue currentQueue] withHandler: ^ (CMMagnetometerData * magnetometerData, NSError * feil) {[selvhåndtakMagnetometerUpdates: magnetometerData. magneticField];}];}
Hver av disse metodene kalles med en inline-handlerblokk ved hjelp av withHandler-konstruksjonen. Disse inline-håndteringsblokkene kaller håndtaket AccelerationUpdates, handleGyroUpdates, og håndtereMagnetometerUpdates. Disse metodene er som følger:
- (void) handleAccelerationUpdates: (CMAcceleration) accelerationData {NSLog (@ "Acceleration. X>% f% f% f 1. 0) || (accelerationData. X 1. 0) || (accelerationData.y 1 0) || (akselerasjonData.z% f% f% f 0. 5) || (gyroRotationRate. x 0. 5) || (gyroRotationRate. y 0. 5) || (gyroRotationRate.z% f% f% f% f 3000. 0) {savedX = magneticField. x; savedY = magneticField. y; savedZ = magneticField. z; [magnetometerTextView setText: @ "Jeg SENSE NO!"];} else {[magnetometerTextView setText: @ "ALL CLEAR!"];}}
Disse metodene logger de rå dataene. Rå sensoravlesninger vist ved bruk av NSLog vises nedenfor.
De foregående sensormetodene tolker også de rå sensorverdiene for å generere visningen vist nedenfor.
Sensorene bruker heuristikk til å gi meningsfylt innsikt:
-
Akselerometeret måler akselerasjon i g-krefter, hvor 1 g-kraft er lik trening av jordens tyngdekraft.
Hvis akselerometeret registrerer bevegelse som er større enn Jordens gravitasjonstrekk i en hvilken som helst retning, vises det meldingen, jeg kommer raskt! Ellers vises det for langsomt.
-
Gyroskopet måler rotasjon av enhetens tre akser i radianer per sekund (1 radian per sekund betyr omtrent en sjette av en rotasjon hvert sekund). Derfor, hvis det sanser mest noe rotasjon, skriver det WHEE!
-
I magnetometerkoden vil du bruke en avstand heuristisk for å fornemme en stor forandring i magnetfeltet.
Hvis en slik endring oppstår, viser appen jeg SENSE NOGEN!
Hvis ingenting endres i ett intervall, går det tilbake til å tenke på at kysten er klar.