2013-05-02 3 views
1

Я играю с «AccelerometerDemo» в SDK7.0 и задаю вопрос о вычислении «вращения», извлеченного из данных XYZ.Расчет акселерометра Blackberry

То, что я хочу достичь, - это виртуальный «маятник», который указывает прямо вниз. Однако вещь вращается вокруг и не двигается, как я ожидал бы этого.

Вот часть моего кода:

_accChannel.getLastAccelerationData(_xyz); 
double roll = MathUtilities.atan2(X, Z) * 180.0/Math.PI; 

graphics.setColor(Color.BLACK); 
int xcenter = 240; 
int ycenter = 400; 

int length = 220; 

int newx1 = (int)(Math.cos(roll) * (double)length) - xcenter; 
int newy1 = (int)(Math.sin(roll) * (double)length) - ycenter; 

graphics.drawLine(xcenter, ycenter, newx1, newy1); 

Любые подсказки, что я делаю не так?

Заранее благодарен!

+1

датчики, естественно, «шум» в показаниях. вы должны отфильтровать показания до приемлемого диапазона, чтобы подавить шум. –

+0

Вы имеете в виду, что если «образец» для рулона более чем на 5 градусов, отбросить его? Таким образом, используются только показания, близкие к углу CURRENT? – user386093

+1

зависит от того, что вы подразумеваете под «вращением вокруг». если он качается, как будто это было на ветру урагана, это означало бы, что вы читаете неправильно или считаете неправильным. если он находится в относительно одном месте, но «дрожит», то это сенсорный шум. –

ответ

1

Я вижу, по крайней мере, две проблемы:

1.Math.cos() and Math.sin() ожидать угол входа в радианах, а не градусы. Используя этот код:

double roll = MathUtilities.atan2(X, Z) * 180.0/Math.PI; 

вы превратили roll в градусы.

2. Во-вторых, вы вычитаете координаты центра из ваших векторных координат. Я считаю, что вы должны быть добавление их, как это:

int newx1 = (int)(Math.cos(roll) * (double)length) + xcenter; 
int newy1 = (int)(Math.sin(roll) * (double)length) + ycenter;