Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detect left and right tilt of an android device mounted with an accelerometer?

Lets say you have the acceleration readings in all the 3 dimensions i.e X, Y and Z. How do you infer using the readings the phone was tilted left or right? The readings get generated every 20ms.

I actually want the logic of inferring the tilt from the readings. The tilt needs to be smooth.

like image 573
praveen Avatar asked Nov 20 '13 06:11

praveen


People also ask

Which sensor is used for measuring acceleration and tilt?

Accelerometers can be used for measuring both dynamic and static measurements of acceleration. Tilt is a static measurement where gravity is the acceleration being measured.

Is a tilt sensor an accelerometer?

An accelerometer can be used as a tilt sensor but not all tilt sensors are accelerometers. For example, a mercury tilt sensor can't give you a readout of acceleration.

How does a phone measure tilt?

A typical smart phone has three magnetic field sensors, fixed perpendicular to each other, which are used to work out the local direction of Magnetic North. In addition, they have three accelerometers which sense gravity to give tilt information and to help work out which way is down.

Can an accelerometer measure rotation?

Uses of a gyroscope or accelerometer The main difference between the two devices is simple: one can sense rotation, whereas the other cannot. In a way, the accelerometer can gauge the orientation of a stationary item with relation to Earth's surface.


1 Answers

A tilt can be detected in a sort of diferent ways. You can take into account 1 axis, 2 axis, or the 3 axis. Depending on how accurate you want it, and how much you feel like fighting with maths.

If you use only one axis, it is quite simple. Think the mobile is completely horizontal, and you move it like this:

enter image description here

using just one axis, lets say, axis x, will be enough, since you can detect accurately a change in that axis position, since even any small movement will do a change in the axis. But, if your application is only reading that axis, and the user has the phone almost vertical, the difference in x axis will be really small even rotating the phone a big angle. Anyways,for applications that only need coarse resolution, a single-axis can be used.

Referring to basic trigonometry, the projection of the gravity vector on the x-axis produces an output acceleration equal to the sine of the angle between the accelerometer x-axis and the horizon. This means that having the values of an axis (those are acceleration values) you can calculate the angle in which the device is.

enter image description here

this means that the value given to you by the sensor, is = to 9,8 * sine of the angle, so doing the maths you can get the actual angle.

But don't worry, you don't even have to do this. Since the values are more or less proportional, as you can see in the table below, you can work directly with the value of the sensor, without taking much care of what angle represents, if you don't need it to be much accurate, since a change in that value means a proportional change in the angle, so with a few test, you will find out how big should be the change in order to be relevant to you.

enter image description here

So, if you take the value over the time, and compare to each other, you can figure out how big the rotation was. For this,

  1. you consider just one axis. this will be axis X.
  2. write a function to get the difference in the sensor value for that axis between one function call, and the next
  3. Decide a maximum time and a minimum sensor difference, that you will consider a valid movement (e.g. a big rotation is good but only if it is fast enough, and a fast movement is good only if the difference in the angle is big enough)
  4. if you detect two measurements that accomplish those conditions, you take note of half tilt done (in a boolean for instance), and start measuring again, but now, the new reference value is the value that was considered half tilt.
  5. if the last difference was positive, now you need a negative difference, and if the last difference was negative, now you need a positive difference; this is, coming back. so start taking values comparing the new reference value with the new values coming from the sensor, and see if one accomplish what you decided in point 3.
  6. if you find a valid value (accomplishing value difference and time conditions ), you have a tilt. But if you dont get a good value and the time is consumed, you reset everything: let your reference value be the last one, reset the timers, reset the half-tilt-done boolean to false, and keep measuring.

I hope this is good enough for you. For sure you can find some libraries or code snippets to help you out with this, but i think is good, as you say, to know the logic of inferring the tilt from the readings

The pictures was taken from this article, wich i recomend to read if you want to improve the accuracy and consider 2 o 3 axis for the tilt

like image 69
Carlos Robles Avatar answered Oct 19 '22 22:10

Carlos Robles