Получить угол возвышения? - PullRequest
2 голосов
/ 12 марта 2011

Из акселерометра можно ли получить угол места?Для тех из вас, кто не знает, угол возвышения составляет:
angle of elevation
Возможно ли это при измерениях акселерометра?

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

При измерении движения обычно отсутствует понятие ориентации. Многоосевой акселерометр, измеряющий статическое ускорение (ускорение под действием силы тяжести) может использоваться для расчета угла относительно земли.

Большинство телефонов Android поставляются с несколькими датчиками, такими как гироскоп и т. Д., Которые могут взаимодействовать. См. Javadocs для SensorManager и различных типов SensorEvents .

1 голос
/ 12 марта 2011

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

Однако вы можете предположить, что пользователь ориентирует экран устройства прямо к глазам.

С этим допущением вы можете использовать http://developer.android.com/reference/android/hardware/SensorManager.html#getRotationMatrix(float[], float [], float [], float []) , чтобы получить ориентацию устройства и получить угол между осью y и (x , z) плоскость.

Что он делает, так это использует акселерометр на оси 3, чтобы увидеть направление силы гравитации.

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

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

Редактировать: Вот код, который я собрал. Основная функция в моем коде:

public void onSensorChanged(SensorEvent event) {
    int sensor = event.type;
    float[] values = event.values;
    int i;
    StringBuffer str=new StringBuffer();
    // do something with the sensor data
    TextView text = (TextView) findViewById(R.id.my_text);
    float[] R = new float[9]; // rotation matrix
    float[] magnetic = new float[3];
    float[] orientation = new float[3];

    magnetic[0]=0;
    magnetic[1]=1;
    magnetic[2]=0;

    str.append("From Sensor :\n");
    for(i=0;i<values.length; i++) {
        str.append(values[i]);
        str.append(", ");
    }

    SensorManager.getRotationMatrix(R, null, values, magnetic);
    SensorManager.getOrientation(R, orientation);


    str.append("\n\nGives :\n");
    for(i=0;i<orientation.length; i++) {
        str.append(orientation[i]);
        str.append(", ");
    }
    text.setText(str);
}

Я не пробовал на реальном устройстве, только на эмуляторе и с использованием SensorSimulator .

Если вам нужен весь пакет исходного кода с парой инструментов, которые понадобятся вам для сенсорного имитатора, напишите мне, у меня есть все в упаковке.

Вместо того, чтобы составлять магнитные данные, вы можете получить их с компаса. То, что вы ищете, это высота тона, которая находится в orientation[1], она варьируется от -pi / 2 до pi / 2.

Надеюсь, это поможет.

...