【问题标题】:How to find the Angle from pitch, roll and yaw?如何从俯仰、滚动和偏航中找到角度?
【发布时间】:2012-03-27 11:08:05
【问题描述】:

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

【问题讨论】:

    标签: qt math opengl 3d


    【解决方案1】:

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

    【讨论】:

    • 要旋转 3D 图像,我不需要使用俯仰、滚动和偏航(来自陀螺仪)来查找任何内容。我说的对吗?
    • @indira:来自陀螺仪的那些值不应被视为角度,而应被视为旋转速度。是的,你必须找到一些东西,因为这些速度不会告诉你旋转,而是旋转变化。
    【解决方案2】:

    您对 android acceleration_sensor 的俯仰和偏航角的回答是:
    双角 = Math.atan2(zVal, yVal)/(Math.PI/180) //对于音高
    双角 = 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));
    
    
        }
    }
    

    【讨论】:

    • 导入android.hardware.Sensor;导入android.hardware.SensorEvent;导入 android.hardware.SensorEventListener;导入 android.hardware.SensorManager;导入android.os.Bundle;导入android.app.Activity;导入android.text.Html;导入 android.widget.TextView;
    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多