Getting magnetic field results as degrees

by Jeffrey » Sun, 13 Dec 2009 10:13:53 GMT


Sponsored Links
 I'm working on an application that will randomly point an arrow in a
direction, and have that arrow maintain it's direction if the device
is moved. All I want to do it get the magnetic field readings as
degrees and I can do it from there. The problem I'm having is getting
the magnetic field readings. I can't find any tutorials on it and the
API demo on google's dev site uses deprecated code (figures, google's
sample code is never n00b friendly).

At this point I've got this together but I don't know what I'm
missing, all the examples I can find are using SensorListener which
has onSensorChanged(int sensor, float[] values) but
SensorEventListener does not support "float[] values"

What am I missing here?

--



Getting magnetic field results as degrees

by Jeffrey » Sun, 13 Dec 2009 10:32:14 GMT


 Okay, so I got a little further, I'm now stuck at the point where I
can pull values, but they are the micro-tesla measurements. How do I
get degrees from this?




--


Sponsored Links


Getting magnetic field results as degrees

by Peli » Sun, 13 Dec 2009 21:08:26 GMT


 You need basic trigonometry:
 http://en.wikipedia.org/wiki/Trigonometry 

if x and y denote the magnetic field strength in microtesla, then you
get the angle through the arc tangent function:
phi = Math.atan(y/x);
or phi = Math.atan2(y,x);
phi is then the angle in radians. Note that you may want to convert
phi from radians to degree (using phideg = Math.toDegree(phi);)

Note that this only works if your phone lies flat on the desk. In
arbitrary orientation, you need more sophisticated conversion that
includes x, y, and z and the accelerometer values.

Peli
www.openintents.org
 http://www.openintents.org/en/node/6 





--



Getting magnetic field results as degrees

by Jeffrey » Mon, 14 Dec 2009 04:43:32 GMT


 THANK YOU! I could NOT find any info on this anywhere! You have just
made me very happy!






--



Getting magnetic field results as degrees

by Ethan Rublee » Mon, 14 Dec 2009 05:34:25 GMT


 ere's my code for capturing orientation data... This is a snippet so
has not been compiled, but should give you and idea.
Keep in mind that you should register the sensors with something like
this when ever you want to start listening to sensors:

sensorMgr = (SensorManager) contex.getSystemService
(Service.SENSOR_SERVICE);
orientationSensor = sensorMgr.getDefaultSensor
(Sensor.TYPE_ORIENTATION);
magnetSensor = sensorMgr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
accelSensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

//this class implements SensorEventListener
sensorMgr.registerListener(this,orientationSensor,
SensorManager.SENSOR_DELAY_FASTEST);
sensorMgr.registerListener(this,magnetSensor,
SensorManager.SENSOR_DELAY_FASTEST);
orientationsupported = sensorMgr.registerListener(this, accelSensor,
SensorManager.SENSOR_DELAY_FASTEST);

//*************The following is the static data necessary for my
sensorlistener, these are fields of my class
// for storing sensor data
float[] mags = new float[3];
float[] accels = new float[3];

int matrix_size = 16;
// matrices for letting SensorManager do its magic
float[] RotationMatrix = new float[matrix_size];
float[] InclinationMatrix = new float[matrix_size];

// an output matrix, that will hold a rotation matrix that
// can be used in openGl as a modelview matrix
float[] outR = new float[matrix_size];

// the orientation rotation array
float[] values = new float[3];

//***************************************************************
// here's the meat of the sensor handling, from the
android.hardware.SensorListener interface
public void onSensorChanged(SensorEvent event) {
Sensor sensor = event.sensor;

int type = sensor.getType();

switch (type) {
case Sensor.TYPE_MAGNETIC_FIELD:

mags[0] = event.values[0];
mags[1] = event.values[1];
mags[2] = event.values[2];
break;
case Sensor.TYPE_ACCELEROMETER:
accels[0] = event.values[0];
accels[1] = event.values[1];
accels[2] = event.values[2];
break;
case Sensor.TYPE_ORIENTATION:
/******************************
*these are the orientation values in degrees - one of them is the
* magnetic heading....
*/
// values = event.values.clone();

break;
}

//this is key to getting your heading, it fills out the matrices
which are needed to calculate the
//heading. It is important to not that the acceleration data is
linked to the magnetic data, in that the
//physical tilt/yaw of the phone affects the mags vector. Atleast
this is my understanding.
SensorManager.getRotationMatrix(RotationMatrix, InclinationMatrix,
accels, mags);

// this is only necessary for my AR opengl purposes
SensorManager.remapCoordinateSystem(RotationMatrix,
SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, outR);

// This is the orientation that i need
// values[0] = compass in radians
// values[1] and values[2] are the rotations about the x and y axis
SensorManager.getOrientation(outR, values);

// I have not used this function but it may give you the magnetic
// heading
// directly, in radians of course
float magHeading = SensorManager.getInclination(InclinationMatrix);

}

Check out
http://developer.android.com/reference/android/hardware/SensorManager.html
for definitive documentation.
I would put a text field in your activity and output the values live
as the sensors



Getting magnetic field results as degrees

by Jeffrey » Tue, 15 Dec 2009 08:39:50 GMT


  got it working, the phone will only need to be lying flat, so that
made it a lot easier. It seems like google should mention somewhere
that you need to use trig to get degree's from the compass... That
doesn't quite seem like general knowledge. Though I had a problem with
the activity force closing occasionally but I fixed that so that it
wouldn't try and take sensor readings until the activity had been open
for 1 second. It also adds to the suspense of what direction the drift
will be :)

On Dec 13, 12:47am, Ethan Rublee <ethan.rub...@gmail.com> wrote:

--



Other Threads

1. Time delay to the wi-fi router

I would like to know if there is any function to calculate the time
delay in milisecs or micro-secs for the communication between my
mobile and my router. (for example in computers you can do ping to
calculate the time connection to the router)

--~--~---------~--~----~------------~-------~--~----~

2. getting the information of selected file from another application for my application use

Hi,

Here is a scenario of what I am trying to do.
A user is running for example a media appplication.
When the user is selecting files in the application to watch, he has
the option to click a lets say ctrl.
then my intent receiver will notify my application to show a pop-up
window to let the user send the file the user has just selected to a
buddy.

Ideally, I would like to write some independent code that would
recognize that the ctrl (or any key) was clicked when a 'file-like'
selection was made in another application by the user. i think going
as far as the pop-up window is possible. However, I am unsure if it is
possible to get a reference (or information) of the file to send it or
verify that it is indeed a file. Here is two posibilties that i think
of:

1) use interprocess communication (I think it may require
implementation by the other application though)
2) try to get the name of the application through the ActivityManger
(My application can guess the content provider of the application and
attempt to get it from there if there is one? although how to access
the ContentProvider dynamically is a blur to me right now)
3) other options??

It is a proof of concept for my school project, so it is not as
important if it can be done but it will be cool if I can find a
workable solution. I would appreciate if anyone has any suggestions.
Thank you.
--~--~---------~--~----~------------~-------~--~----~

3. How to access DRM protected files?

4. Text to speech...

5. screen moving to third screen instead of staying in second screen

6. Why is Android/Eclipse so unreliable?

7. Contact Manager Registry Needed?