Sunday, June 28, 2009

Testing the GPS

The quality of the built in GPS receiver in the G1 has been kind of a let down. This past weekend I was helping pick up trash along a highway and decided to leave My Tracks going while walking up and down the highway. The first complaint was the time to fix, it seemed like something around 3 minutes(definetely worse than the 75 seconds in the spec) , on a perfectly clear day while standing out in the open. Using the GPS Status 2 app it would report 6 satellites quickly but still take forever to get an actual location fix.

The second issue was the quality of the GPS signal after I put the phone in my pocket, the location would somtimes jump around 5-10 meters at a time. This is fine for just locating yourself on a street, but when walking up and down a road it makes the distance measured meaningless. It really doesn't hold a candle to a dedicated SIRFStar 3 USB GPS unit. Although it would do better if it had been mounted with a fixed view of the sky rather than in my pocket. I'm not sure if the hard plastic shell I put on the phone cuts down on GPS reception or not.

Tuesday, June 23, 2009

Got a phone!

With the announcement that the MT3G wouldn't be available until the beginning of august it really didn't make sense to wait for it and still try to make something for the ADC, so I went ahead and got a G1 yesterday. It's not nearly as clunky as I had imagined for some reason. So far the best app I have played with is the google sky map

The first app I plan on making will be called SensorGraph, which will allow you to log/graph a sensor's values over time and either just display them or write them out to a file on the sd card for later analysis. There are a few apps already that will show a graph of values but not do exactly what I need. With this app I will better be able to analyze how good the magnetometer reacts to see if it will work for my game idea.

Friday, June 19, 2009

Calculating orientation

After looking at the API the getRotationMatrix method is really simple, it just assumes the acceleratometer data indicates down(only precisely true when you aren't moving it at all) and then the cross product of down and the geomagnetic reading gives you a vector pointing east. Another cross prouct between down and easy gives you a vector pointing north. Normalize them and then they make up the rotation matrix.

Typically aligning one coordinate system to another by a rotation to just match a unit vector means there are an infinite number of possible rotations. IE you could spin the coordinate system about that vector and any rotation would satisfy the constraints. But for my game I can add the constraint that they are holding the phone in landscape view and not rotating it, so rotation around the Z axis is 0, and I only need to find rotation around Y and Z to calculate the orientation.

So the equation representing the rotation of the device is M' = Rx * Ry * M, where M' is the measured magnetic field in the coordinate frame of the device and M is the reference magnetic field given by the WMM.

Expanding this out yields(where sx,cx,sy,cy are sin(x), cos(x)...):

[M'x] [cy, 0, -sy] [Mx]
[M'y]=[sx*sy, cx, sx*cy]*[My]
[M'z] [cx*sy,-sx, cx*cy] [Mz]

[M'x] [Mx*cy - Mz*sy]
[M'y]=[My*cx + (Mz*cy + Mx*sy)*sx]
[M'z] [(Mz*cy + Mx*sy)*cx - My*sx]

Using some handy trig identities you can use the M'x line to solve for y and then substitute that in either of the other two equations to solve for x. ie for y it would be

y = asin(-M'x/sqrt(Mz^2+Mx^2)) + atan(Mx/Mz)

A = (Mz*cy + Mx*sy)
x = asin(M'y/sqrt(A^2+My^2)) - atan(My/A)

Although this method requires 2 asin and 1 atan calculations, so I'm not sure how fast/stable this approach will be.

Wednesday, June 17, 2009

Magnetometer

While waiting for the myTouch to come out I have been researching the magnetometer in the G1. I haven't been able to find any information on people who have done tests on how fast/accurate it is. The only examples I have seen are the augmented reality browsers that most likely simply use the SENSOR_ORIENTATION.

For the purposes of the game I have in mind depending on the accelerometer to help calculate the orientation of the phone won't really work if the user is moving the phone around quickly while playing. So the basic problem is simply to find the rotation that aligns the magnetometer data with what the magnetic field at that location should be ( calculated by http://www.ngdc.noaa.gov/geomagmodels/struts/calcIGRFWMM ).

Right now I'm trying to figure out how exactly the getRotationMatrix method in the SensorManager class works, it uses the magnetometer and accelerometer data to produce the orientation without even needing the WMM data
http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/hardware/SensorManager.java#l931

Sunday, June 14, 2009

Starting a new project

Hello, this blog will chronicle my adventures in learning and making Android applications. Currently I've just been playing with the 1.5 SDK and I'm waiting for the Tmobile myTouch 3g(G2/HTC Magic/Google Ion) to be released before picking one up. Hopefully it will come out in time for me to get something together for the Android Developer Challenge.

My main interest is in developing games and using the accelerometer/compass for interesting things, but I can't really play around with those until I get an android phone to experiment on. When I do I will work on testing out some dead reckoning ideas using the sensors.

I've read over some of Professional Android Application Development and just ordered Unlocking Android, I will post up a review of each after I finish going over them.