如何从俯仰,滚转和偏航中找到角度?

时间:2012-03-27 11:08:06

标签: qt math opengl 3d

我有一个嵌入芯片的加速度计和陀螺仪,从中我得到x,y,z轴(来自加速度计),俯仰,滚转和偏航(来自陀螺仪)。使用这些值,我必须旋转3D图像。 glRotatef(Angle,Xvector,Yvector,Zvector)如何从俯仰,滚转和偏航中找到角度?这方面的任何等式?

2 个答案:

答案 0 :(得分:2)

从陀螺仪接收的那些旋转值不应被视为关于不同轴的单独旋转,而是将时间差视为复合旋转。您的问题是您希望找到差分旋转矩阵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版本中删除。

答案 1 :(得分:0)

您对android accelerator_sensor的俯仰和偏航角的回答是: 双角= Math.atan2(zVal,yVal)/(Math.PI / 180)//用于音调
double angle = Math.atan2(xVal,yVal)/(Math.PI / 180)//对于偏航角
  他们已经过测试。

    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));


    }
}