Как найти Угол от тангажа, крена и рыскания? - PullRequest
1 голос
/ 27 марта 2012

У меня есть акселерометр и гироскоп, встроенный в чип, из которого я получаю оси x, y, z (из акселерометра), тангаж, крен и рыскание (из гироскопа).Используя эти значения, я должен повернуть трехмерное изображение.glRotatef(Angle,Xvector,Yvector,Zvector) Как найти Угол от тангажа, крена и рыскания?Любое уравнение для этого?

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

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

dR = dR_x * dR_y * dR_z 
   = dR_y * dR_x * dR_z 
   = dR_y * dR_z * dR_x 
   = dR_z * dR_x * dR_y 
   = dR_z * dR_y * dR_x

Самый простой способ сделать это - вычислить каждую из этих перестановок, взять их среднюю матрицу, равную dR ', и применить ортонормировку.

Тогда просто используйте эту матрицу. Забудьте о glRotate, он вам не нужен, и он все равно был удален из более поздних версий OpenGL.

0 голосов
/ 10 июля 2018

ваш ответ для высоты тона и угла рыскания по android acceleration_sensor:
двойной угол = Math.atan2 (zVal, yVal) / (Math.PI / 180) // для высоты тона
двойной угол = Math.atan2(xVal, yVal) / (Math.PI / 180) // для Yaw
они тестируются.

    private SensorManager sensorManager;

TextView x;
TextView y;
TextView z;
TextView ang;

String sx, sy, sz;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.l1);

    x = (TextView) findViewById (R.id.textView2);
    y = (TextView) findViewById (R.id.textView3);
    z = (TextView) findViewById (R.id.textView4);
    ang = (TextView) findViewById(R.id.textView5);

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

    sensorManager.registerListener(this, sensorManager.getDefaultSensor
            (Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}



@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {

}

@Override
public void onSensorChanged(SensorEvent event) {


    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){

        float xVal = event.values[0];
        float yVal = event.values[1];
        float zVal = event.values[2];

        sx = "X Value : <font color = '#800080'> " + xVal + "</font>";
        sy = "Y Value : <font color = '#800080'> " + yVal + "</font>";
        sz = "Z Value : <font color = '#800080'> " + zVal + "</font>";

        x.setText(Html.fromHtml(sx));
        y.setText(Html.fromHtml(sy));
        z.setText(Html.fromHtml(sz));

        double angle = Math.atan2(zVal, xVal)/(Math.PI/180);

        ang.setText(String.valueOf(angle));


    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...