iOS-Tutorial-Lecture 14 Slides
iOS-Tutorial-Lecture 14 Slides
CS193p
Spring 2016
Today
Animation Continued
Dynamic Animation Demo - DropIt
CoreMotion
Where is the device in space?
CS193p
Spring 2016
Demo
Dropit
Sort of a “pre-Tetris” demo
CS193p
Spring 2016
Core Motion
API to access motion sensing hardware on your device
Primary inputs: Accelerometer, Gyro, Magnetometer
Not all devices have all inputs (e.g. only later model devices have a gyro)
Usage
1. Check to see what hardware is available
2. Start the sampling going and poll the motion manager for the latest sample it has
... or ...
1. Check to see what hardware is available
2. Set the rate at which you want data to be reported from the hardware
3. Register a closure (and a queue to run it on) to call each time a sample is taken
CS193p
Spring 2016
Core Motion
Checking availability of hardware sensors
var {accelerometer,gyro,magnetometer,deviceMotion}Available: Bool
The “device motion” is a combination of all available (accelerometer, magnetometer, gyro).
We’ll talk more about that in a couple of slides.
CS193p
Spring 2016
Core Motion
Checking the data (polling not recommended, more later)
var accelerometerData: CMAccelerometerData
CMAccelerometerData object provides var acceleration: CMAcceleration
struct CMAcceleration {
var x: Double // in g (9.8 m/s/s)
var y: Double // in g
var z: Double // in g
}
This raw data includes acceleration due to gravity
So, if the device were laid flat, z would be 1.0 and x and y would be 0.0
CS193p
Spring 2016
Core Motion
Checking the data (polling not recommended, more later)
var gyroData: CMGyroData
CMGyroData object provides var rotationRate: CMRotationRate
struct CMRotationRate {
var x: Double // in radians/s
var y: Double // in radians/s
var z: Double // in radians/s
}
Sign of the rotation data follows right hand rule
The data above will be biased
CS193p
Spring 2016
Core Motion
Checking the data (polling not recommended, more later)
var magnetometerData: CMMagnetometerData
CMMagnetometerData object provides var magneticField: CMMagneticField
struct CMMagneticField {
var x: Double // in microteslas
var y: Double // in microteslas
var z: Double // in microteslas
}
The data above will be biased
CS193p
Spring 2016
CMDeviceMotion
Acceleration Data in CMDeviceMotion
var gravity: CMAcceleration
var userAcceleration: CMAcceleration // gravity factored out using gyro
CS193p
Spring 2016
CMDeviceMotion
Magnetic Field Data in CMDeviceMotion
var magneticField: CMCalibratedMagneticField
struct CMCalibratedMagneticField {
var field: CMMagneticField
var accuracy: CMMagneticFieldCalibrationAccuracy
}
accuracy can be …
CMMagneticFieldCalibrationAccuracyUncalibrated
CMMagneticFieldCalibrationAccuracyLow
CMMagneticFieldCalibrationAccuracyMedium
CMMagneticFieldCalibrationAccuracyHigh
CS193p
Spring 2016
Core Motion
Registering a block to receive Accelerometer data
func startAccelerometerUpdatesToQueue(queue: NSOperationQueue,
withHandler: CMAccelerometerHandler)
typealias CMAccelerationHandler = (CMAccelerometerData?, NSError?) -> Void
queue can be an NSOperationQueue() you create or NSOperation.mainQueue (or currentQueue)
CS193p
Spring 2016
Core Motion
Registering a block to receive DeviceMotion data
func startDeviceMotionUpdatesToQueue(queue: NSOperationQueue,
withHandler: CMDeviceMotionHandler)
typealias CMDeviceMotionHandler = (CMDeviceMotion?, NSError?) -> Void
queue can be an NSOperationQueue() you create or NSOperation.mainQueue (or currentQueue)
Errors … CMErrorDeviceRequiresMovement
CMErrorTrueNorthNotAvailable
CMErrorMotionActivityNotAvailable
CMErrorMotionActivityNotAuthorized
CS193p
Spring 2016
Core Motion
Setting the rate at which your block gets executed
var accelerometerUpdateInterval: NSTimeInterval
var gyroUpdateInterval: NSTimeInterval
var magnetometerUpdateInterval: NSTimeInterval
var deviceMotionUpdateInterval: NSTimeInterval
CS193p
Spring 2016
Demo
More DropIt
Make DropIt’s gravity match real gravity
CS193p
Spring 2016