Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vertical movement sensor

I am working on an android app that requires the detection of vertical motion. When moving the tablet upward, the Gyroscope, Accelerometer, and Linear Acceleration sensors give a corresponding value indicating upward or downward motion.

The problem I have is that these sensors will also read an upward/downward motion when you tilt the tablet towards the user or away from the user. For example, the x value in the gyroscope represents the vertical plane. But when you tilt the device forwards, the x value will change. When I make this motion, the same sensor that reads vertical motion reads a value for this. enter image description here

The same goes for the rest of the sensors. I have tried to use orientation coupled with the gyro to make the conditional statement, if the pitch is not changing, but the x variable is going up/down, then we have vertical motion. The problem with this is that if the user moves it up but tilted slightly, it will no longer work. I also tried making it so if there is a change in tilt, then there is no vertical motion. But it iterates so quickly that there may be a change in tilt for 1/100 of a second, but for the next there isn't.

Is there any way I can read only vertical changes and not changes in the devices pitch?

Here is what I want to detect: enter image description here

edit:

"Please come up with a mathematically sound definition of what you consider 'moving upwards.'" This was my initial question, how can I write a function to define when the tablet is moving upwards or downwards? I consider a vertical translation moving upwards. Now how do I detect this? I simply do not know where to begin, thank you.

like image 944
user1795223 Avatar asked Nov 02 '12 19:11

user1795223


People also ask

What sensor can detect human movement?

Among them, in this paper, we focus on pyroelectric infrared (PIR) sensors as sensing systems to detect human body movement in an indoor environment. PIR sensors are well known and have been widely used as a simple, but powerful presence trigger for alarms, such as surveillance systems and automatic lighting control.

What is a movement sensor called?

The most widely used type of passive motion sensor in home security systems is the passive infrared (PIR) sensor. The PIR sensor is designed to detect the infrared radiation emitted naturally from the human body.

How does a movement sensor work?

An active ultrasonic motion detector emits ultrasonic sound waves that reflect off objects and bounce back to the original emission point. When a moving object disrupts the waves, the sensor triggers and completes the desired action, whether this is switching on a light or sounding an alarm.

What is MEMS motion sensor?

A MEMS accelerometer detects tilt by measuring the effect the force of gravity exerts on the axes of the accelerometer. In the instance of a 3-axis accelerometer, three separate outputs measure acceleration along the X, Y, and Z axes of motion.


1 Answers

Ok, even though this question is fairly old, I see a lot of confusion in the present answer and comments, so in case anyone finds this, I intend to clear a few things up.

The Gyroscope

First of all, the gyroscope does not measure vertical motion as per your definition (a translatory motion). It measures rotation around each of the axes, which are defined as in the figure below. Thus having you tilt your device forwards and backwards indeed rotates it around the x axis and therefore you will see non-zero values in the x value of your gyroscope sensor.

Device Axes

the x value in the gyroscope represents the vertical plane.

I'm not sure what is meant by "the vertical plane", however the x value certainly does not represent the plane itself nor the orientation of the device within the plane.

The x value of the gyroscope sensor represents the current angular velocity of the device around the x axis (eg. the change in rotation).

But when you tilt the device forwards, the x value will change. When I make this motion, the same sensor that reads vertical motion reads a value for this.

Not quite sure what you're referring to here. "The same sensor that reads vertical motion" I assume is the gyroscope, but as previously said, it does not read vertical motion. It does exactly what it says on the tin.

The device coordinate system

This is more in response to user Ali's answer than the original question, but it remains relevant in either case.

The individual outputs of the linear acceleration sensor (or any other sensor for that matter) are expressed in the coordinate system of the device, as shown in the image above. This means if you rotate the device slightly, the outputs will no longer be parallel to any world axis they coincided with before. As such, you will either have to enforce that the device is in a particular orientation for your application, or take the new orientation into account.

The ROTATION_VECTOR sensor, combined with quaternion math or the getRotationMatrixFromVector() method, is one way to translate your measurements from device coordinates to world coordinates. There are other ways to achieve the same goal, but once achieved, the way you hold your device won't matter for measuring vertical motion.

In either case, the axis you're looking for is the y axis, not the z axis.

(If by any chance you meant "along device y axis" as "vertical", then just ignore all the orientation stuff and just use the linear acceleration sensor)

Noise

You mentioned some problems regarding noise and update rates in the question, so I'll just mention it here. The simplest and one of the more common ways to get nice, consistent data from something that varies very often is to use a low-pass filter. What type of filter is best depends on the application, but I find that a exponential moving average filter is viable in most cases.

Finishing thoughts

Note that if you take proper care of the orientation, your transformed linear acceleration output will be a good approximation of vertical motion (well, change in motion) without filtering any noise.

Also, if you want to measure vertical "motion", as in velocity, you need to integrate the accelerometer output. For various reasons, this doesn't really turn out too well in most cases, although it is less severe in the case of velocity rather than trying to measure position.

like image 99
Svj0hn Avatar answered Sep 21 '22 05:09

Svj0hn