2017-02-15 26 views
0

В настоящее время я использую спидометр, получая данные ориентации с моего телефона. Я используюпостоянное вращающееся устройство - как получить действительные данные ориентации?

SensorManager.getRotationMatrix(R, I, gravity, geomagnetic); 
float orientation[] = new float[3]; 
SensorManager.getOrientation(R, orientation); 
float azimuth = orientation[0]; 
double azimuthD = Math.toDegrees(azimuth); 
if(azimuthD < 0) azimuthD = 360 + azimuthD; 

С этим я могу получить данные вращения с телефона, например, азимут и т.д .. Во всяком случае, это работает отлично, пока устройство находится на столе или что-то. Но при повороте вокруг определенной точки (в моем случае устройство закреплено на колесе и вращается с определенной скоростью) значения далеки от точной. Я считаю, что, поскольку я использую гравитацию и геомагнитный датчик, может возникнуть конфликт с силами, которые влияют на эти датчики, вращаясь. As the wheel turns, the rotation changes relative to a point, but the local device rotation stays the same.

Как я могу получить доступ к ориентации устройства во время его поворота, не запуская много шумных данных? Я прочитал кое-что о свойстве Sensor.TYPE_ROTATION_VECTOR'а, но не мог понять, как это работает. Также я читал о возможности переназначения системы координации, но как это должно помочь, так как мой телефон никогда не бывает вертикальным по отношению к полу больше, чем под углом 5 ° -10 °. Буду признателен за любую помощь.

Приветствия, viehlieb

ответ

0

Я думаю, я нашел свой ответ. Решение было выбросить весь код, который я опубликовал выше, и использовать гироскоп, очевидно. Значения гироскопа измеряют угловую скорость вращения устройства. Используемая система координат - это собственная система координат устройства. В моем случае соответствующим значением было вращение вокруг оси z. Значения находятся в радианте в секунду, которые могут отображаться в м/с, если вы умножаете окружность колеса. Так что трюк был в OnSensorChanged метод:

if(sensorEvent.sensor.getType() == Sensor.TYPE_GYROSCOPE){ 
gyroscope = sensorEvent.values; 
double rotZ = gyroscope[2]; 
double degrees = Math.toDegrees(gyroscope[2]); 
//calculate the speed with circumference = 2.23m 
float speed = (float) degrees/ 360.0f * 2.23f * 3.6f; 
} 

Если теперь вы хотели бы иметь точные значения, вы можете хранить их в массив и вычислить среднее значение. Не забудьте очистить массив каждые 20 раз (или так) вызывается метод onSensorChanged. С зарегистрированным SENSOR_DELAY_GAME есть достаточные данные, по которым вы могли бы построить среднее.

 Смежные вопросы

  • Нет связанных вопросов^_^