【问题标题】:Get angle of elevation?获取仰角?
【发布时间】:2011-07-14 03:48:42
【问题描述】:

从加速度计,是否可以得到仰角?不知道的小伙伴们,仰角是:

加速度计测量可以做到这一点吗?

【问题讨论】:

    标签: java android math accelerometer


    【解决方案1】:

    在测量运动时,通常没有方向的概念。测量静态加速度(重力加速度)的多轴加速度计可用于计算相对于地球的角度。

    大多数安卓手机都带有许多可以接口的传感器,例如陀螺仪等。请参阅 SensorManager 和各种类型的 SensorEvents 的 javadocs。

    【讨论】:

    • 这实际上不是真的。他们测量加速度,当物体没有施加额外的力时,它朝向地球的加速度为 9.8m/s/s。
    • @Chris Thompson,你是对的。测量静态加速度的多轴加速度计用于获取角度。我认为我的概括很糟糕。
    • 对,这里的关键是多轴。真的,至少你需要三个。大多数安卓设备(除了方向传感器)都有一个三轴加速度计
    • @Chris, @Johan,我怎样才能利用三轴加速度计在我的应用程序中找到仰角?一些伪代码会很棒。
    【解决方案2】:

    实际上不可能获得视线的“仰角”,因为您不知道用户在哪里...

    您可以做的是假设用户将设备的屏幕直接对准他的眼睛。

    有了这个假设,您可以使用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 之间变化。

    希望对您有所帮助。

    【讨论】:

    • 使用getRotationMatrix后,是否应该将R矩阵传递给getAngleChange?
    • 是的,您可以在参考“直立”旋转矩阵和从 getRotationMatrix 获得的旋转矩阵之间使用它。您仍然会找到需要使用三个角度中的哪一个...
    • “直立”旋转矩阵是什么样的?应用程序应比较与地面平行的矩阵,以及用户将设备指向某物的不同矩阵,以便矩阵不平行于地面。我怎样才能得到一个矩阵,使它与地面平行?
    • 您可以使用相同的函数 (getRotationMatrix) 获取该矩阵,但不是从加速度计提供数据,而是将其提供为重力矢量 [0 0 9.8]。你给地磁矢量的东西并不重要,像 [0 1 0] 这样的东西应该是好的。你也不需要关心 l,只关心重力和 R。
    • 能否请您发布一个关于在这种情况下正确使用 getRotationMatrix 的非常小的代码示例?我应该将 I 矩阵传递给 getInclination 还是应该将 R 矩阵传递给 getAngleChange?很抱歉要求这么多,但它会帮助我更好地理解它。
    猜你喜欢
    • 2014-06-18
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2015-07-03
    • 2012-08-02
    相关资源
    最近更新 更多