簡體   English   中英

自定義OpenVR驅動程序,帶有抖動的android旋轉

[英]Custom OpenVR driver, with jittery android rotation

我正在研究一個簡單的(我認為)OpenVR驅動程序,該驅動程序將合成器的輸出發送到我的android手機中,以便與Google紙板一起顯示。 我已經掌握了基礎知識,但是當我的驅動程序從我的android設備接收旋轉數據時,它非常嘈雜,並且我的手機仍坐在我的桌子上,這會抖動。

浮點數以網絡字節順序發送。

這是接收旋轉數據的代碼:

float BytesToFloat(unsigned char* buffer, int start)
{
    float f = (buffer[start] << 24) | (buffer[start + 1] << 16) | (buffer[start + 2] << 8) | buffer[start + 3];
    return f;

}

void MobileDeviceReceiver::PoseThread(std::function<void(MobileVector*)> PoseUpdateCallback)
{
    sockaddr_in client;
    int inLen,clientStructLen = sizeof(client);

    MobileVector currentPose;

    DriverLog("started pose tracking thread %d\n",m_isActive);

    bool errorLastCall = false;

    char pchBuffer[65535];

    while (m_isActive)
    {
        if ((inLen = recvfrom(m_socket, pchBuffer, 65535, 0, (sockaddr*)&client, &clientStructLen)) == SOCKET_ERROR)
        {
            if (errorLastCall == false)
            {
                DriverLog("Error receiving data: %d\n", WSAGetLastError());
            }
            errorLastCall = true;
        }
        else {
            errorLastCall = false;
        }

        currentPose.x = floorf(BytesToFloat((unsigned char*)pchBuffer, 0)*10000)/10000;
        currentPose.y = 0;//BytesToFloat((unsigned char*)pchBuffer, 4);
        currentPose.z = 0;//BytesToFloat((unsigned char*)pchBuffer, 8);

        PoseUpdateCallback(&currentPose);
    }


}

以及從手機發送的代碼:

class Task implements Runnable
{
    public Queue<DatagramPacket> packets = new LinkedList<DatagramPacket>();
    private boolean isActive = true;

    @Override
    public void run() {
        try{
            DatagramSocket socket = new DatagramSocket();

            while(isActive)
            {
                if(packets.size() > 0)
                {
                    socket.send(packets.remove());
                }
            }

        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    public void Kill()
    {
        isActive = false;
    }
}

ByteBuffer buffer = ByteBuffer.allocate(12);

    protected float ALPHA = 0.05f;

    private float[] lowPassFilter(float[] input,float[] output)
    {
        if(output == null) return input;

        for ( int i=0; i<input.length; i++ ) {
            output[i] = output[i] + ALPHA * (input[i] - output[i]);
        }

        return output;
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        if(sensorEvent.sensor == sRotation)
        {
            float x,y,z;
            x = (float) Math.toRadians(sensorEvent.values[0]);
            y = (float) Math.toRadians(sensorEvent.values[1]);
            z = (float) Math.toRadians(sensorEvent.values[2]);

            float[] values = lowPassFilter(new float[]{x,y,z},new float[3]);

            buffer.order(ByteOrder.BIG_ENDIAN);
            buffer.putFloat(values[0]);
            buffer.putFloat(values[1]);
            buffer.putFloat(values[2]);

            try {
                DatagramPacket packet = new DatagramPacket(buffer.array(), 12, InetAddress.getByName(IP), 8888);

                if(task != null) {
                    task.packets.add(packet);
                }
            }catch(Exception e)
            {
                e.printStackTrace();
            }

            buffer.clear();
        }
    }

提前致謝

供將來參考,我做錯了兩件事:

  1. 我以網絡字節順序發送浮點數,而未在本地計算機上將其重新排列為本地字節順序。
  2. 位移位似乎不適用於浮點數,因此我改用了memset。

更改了這兩件事之后,它們都可以完美運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM