Detect if the iPhone has rotated - iphone

So I'm building this application to see how many rounds somebody cycled. I don't want to do this using the GPS, but with the other sensors of the iPhone 4+ (Accelerometer, Gyroscope and Compass). I want to detect if the phone has rotated 360 degrees, but the phone is almost never facing upwards, like a compass. What is the best way to achieve this?
On Android there is a method to compensate the phone's tilt on the compass with the accelerometer data. I think it was
static boolean getRotationMatrix(float[] R, float[] I, float[] gravity, float[] geomagnetic)
http://developer.android.com/reference/android/hardware/SensorManager.html

Related

How does Apple separate gravity from device acceleration in iPhone using accelerometer and gyroscope?

I know by combining accelerometer and gyroscope, we can access the gravity and device motion separately. But I need to know how does Xcode calculate it when I simply using devicemotion.gravity. Any algorithm available?

Device Motion in accelerated environment

I wrote an app which displays pitch and roll attitude (a glass cockpit app). When I rotate or tilt the iPhone/iPad the attitude is displayed accurately. When I'm flying in an airplane and rotate or tilt the device it also displays accurately. Now, when I hold the device against the panel and roll the airplane, the attitude does not change accurately - it doesn't move at all. This is strange behavior to me and I wonder if it has something to do with the accelerations of the airplane affecting the output of the gyro in the device.
Any insight is appreciated.
Randy, a roll is a one-G maneuver, right? So there is no acceleration for the accelerometer in the phone to sense.
Watch Bob Hoover roll his Shrike while pouring a glass of iced tea from a pitcher.

iPhone 4 Gyroscope/GPS versus Accelerometer/GPS/Compass

I am about to use iPhone 4's gyroscope/GPS on a game, to detect rotation and translation. As far as I know, the gyroscope can be used to detect rotations in all 3 axis.
But rotations, at least on the horizontal plane can be detected with the compass, tilts can be detected with the accelerometer and positions with the GPS.
Can a combination of compass/accelerometer/GPS create the same level of detection of gyroscope/GPS? (I am thinking of allowing this combination for people without iPhone 4).
Will this work perfectly?
The precision of the gyroscope and accelerometer sensors is much greater than the precision of the compass and GPS. The compass and GPS are for finding out where the device is on the globe, and the gyroscope and accelerometer are good for finding out where the device has moved in the last few milliseconds.
Therefore it depends upon what you're trying to control with the device's movement. Trying to simulate a gyroscope input to control a 3D simulation (like the Jenga game Jobs showed in the keynote that introduced the iPhone 4) will not work perfectly with just the compass/accelerometer/GPS. Figuring out if the device is pointed at the grocery store on the west side of the street instead of the furniture store on the east side of the street in an augmented reality game will work perfectly with just the compass/accelerometer/GPS.

Transform device orientation to world frame in objective c

I'd like to transform the yaw, pitch and roll of the iPhone from the body frame to the world frame, i.e. azimuth, pitch and roll. On Android this is easily done with the
SensorManager.remapCoordinateSystem(), SensorManager.getOrientation methods as detailed here: http://blog.mysticlakesoftware.com/2009/07/sensor-accelerometer-magnetics.html
Are similar methods available for the iPhone or can someone point me in the right direction how to do this transformation?
Thanks
The accelerometer is good enough to get gravity direction vector in device coordinate system. That is in case when device calms down.
The next step for full device orientation is to use CLLocationManager and get the true north vector in device coordinate system.
With the normalized true north vector and gravity vector you can easily get all other directions using the dot and cross vectors product.
The accelerometer (UIAccelerometer) will give you a vector from the device's accelerometer chip straight down. If you can assume that the device is being held fairly steady (i.e., that you're not reading acceleration from actual movement), then you can use simple trig (acos(), asin()) to determine the device's orientation.
If you're worried that the device might be moving, you can wait for several accelerometer readings in a row that are nearly the same. You can also filter out any vector with a length that's ± TOLERANCE (as you define it) from 1.0
In more general terms, the device has no way of knowing its orientation, other than by "feeling gravity", which is done via the accelerometer. The challenges you'll have center around the fact that the accelerometer feels all acceleration, of which gravity is only one possible source.
If you're targeting a device with a gyroscope (iPhone 4 at the time of writing), the CoreMotion framework's CMMotionManager can supply you with CMDeviceMotion updates. The framework does a good job of processing the raw sensor data and separating gravity and userAcceleration for you. You're interested in the gravity vector, which can define the pitch and roll with a little trig. To add yaw, (device rotation around the gravity vector) you'll also need to use the CoreLocation framework's CLLocationManager to get compass heading updates.

How can I detect if an iPhone is rotating while being face up in a table?

Is there a way to detect if an iphone lying down in a table face up is rotating?. I do realize that this kind of movement is not reported by the accelerometer and neither is it reported to the - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation method.
Is there a way to detect angle variations for the phone rotating this way?. Thank you.
The gravity vector will be constant as it rotates on a flat table so you won't see anything on the accelerometers. You could follow compass heading changes to detect this rotation but only on an iPhone 3G S. See the CLLocationManager for details, look at the heading methods.
EDIT - With an iPhone 4 you can detect the rotation using the gyros. There is a new class in iOS 4 called CMMotionManager for getting rotation rate from the gyros.
When the phone is stationary the sum of the acceleration vectors should be +1. When the phone is rotating (assuming the sensor is off-center) the sum of the vectors should be more than 1 and (hopefully) somewhat constant.
If you look at the decay of that curve, I wouldn't be surprised if that shape is distinctive enough to be used to determine whether the phone is rotating or not.
This is the AccelerometerGraph sample app from Apple.
I guess you could do it if the iPhone has a compass. Other than that I don't think it will be possible or reliable.
This would really depend on the location of the accelerometer on the device, i just tested this using the accelerometergraph sample application on a 2g itouch and you can see the initial acceleration on the x and y axis(the 2g does not have the accelerometer in the center of the device I guess). So in a sense you could detect the rotation, however I think the challenge would be differentiating that acceleration from directional acceleration. And I'm sure the values would change if apple placed the accelerometer in different locations on different models. There would definitally not be any way of doing it via shouldAutorotateToInterfaceOrientation, I recommend you load the accelerometergraph sample application in the sdk and experiment with the acceleration vectors to see if you can isolate a rotation vector reliably on multiple devices.