コード例 #1
0
    void OnNewReceiveUdpServerEvent(object sender, NewEventReceiveUDPServerArgs e)
    {
        try
        {
            _sensorCalibration.Push(e.ReceiveUDPServerMessage);

            GyroQuaternion gyroQuaternionInverse           = GyroQuaternion.Inverse(e.ReceiveUDPServerMessage);
            GyroQuaternion gyroQuaternionCalibrationResult = _sensorCalibration.GetCalibrationResult(e.ReceiveUDPServerMessage.sensorName);

            if (gyroQuaternionCalibrationResult != null)
            {
                GyroQuaternion gyroQuaternion = GyroQuaternion.Multiply(gyroQuaternionInverse, gyroQuaternionCalibrationResult);

                gyroQuaternion = GetSettingsAxis(gyroQuaternion);

                if (_senderUdpClient.UdpSocket != null && _senderUdpClient.UdpSocket.Connected)
                {
                    _senderUdpClient.Send(gyroQuaternion);
                }

                if (e.ReceiveUDPServerMessage.sensorName == GetSelectorSensorValue())
                {
                    gyroQuaternion = _filterQuaternion.Filter(gyroQuaternion);

                    Cube3DRender(gyroQuaternion);
                }
            }
        }
        catch (Exception)
        {
            // ignored
        }
    }
コード例 #2
0
 public void Push(GyroQuaternion quat)
 {
     if (!calibrationDictionary.Any(x => x.Key == quat.sensorName))
     {
         calibrationDictionary.TryAdd(quat.sensorName, new GyroQuaternion(quat.sensorName, quat.qX, quat.qY, quat.qZ, quat.qW));
     }
 }
コード例 #3
0
    private void DoReceiveFrom(IAsyncResult iar)
    {
        try
        {
            EndPoint clientEp = new IPEndPoint(IPAddress.Any, 0);
            try
            {
                var dataLen = UdpSocket.EndReceiveFrom(iar, ref clientEp);
                var data    = new byte[dataLen];
                Array.Copy(_byteData, data, dataLen);

                EndPoint newClientEp = new IPEndPoint(IPAddress.Any, 0);
                UdpSocket.BeginReceiveFrom(_byteData, 0, _byteData.Length, SocketFlags.None, ref newClientEp, DoReceiveFrom, newClientEp);

                if (!_clientList.Any(client => client.Equals(clientEp)))
                {
                    _clientList.Add(clientEp);
                }

                GyroQuaternion gyroQuaternion = JsonConvert.DeserializeObject <GyroQuaternion>(Encoding.ASCII.GetString(data));
                Eventing.eventReceiveUDPServer.InvokeOnNewReceiveUDPServer(gyroQuaternion);
            }
            catch (Exception ex)
            {
                Program.ExceptionLog(ex);
            }
        }
        catch (ObjectDisposedException dex)
        {
            Program.ExceptionLog(dex);
        }
    }
コード例 #4
0
    public void InvokeOnNewReceiveUDPServer(GyroQuaternion quat)
    {
        NewReceiveUDPServer          handler = OnNewReceiveUDPServer;
        NewEventReceiveUDPServerArgs e       = new NewEventReceiveUDPServerArgs(quat);

        handler?.Invoke(this, e);
    }
コード例 #5
0
    private GyroQuaternion GetSettingsAxis(GyroQuaternion gyroQuaternion)
    {
        float tmpX = 0, tmpY = 0, tmpZ = 0, tmpW = 0;

        MethodInvoker methodInvokerDelegate = delegate()
        {
            switch (cbReplaceAxisX.SelectedIndex)
            {
            case 0: tmpX = gyroQuaternion.qX; break;

            case 1: tmpX = gyroQuaternion.qY; break;

            case 2: tmpX = gyroQuaternion.qZ; break;
            }
            switch (cbReplaceAxisY.SelectedIndex)
            {
            case 0: tmpY = gyroQuaternion.qX; break;

            case 1: tmpY = gyroQuaternion.qY; break;

            case 2: tmpY = gyroQuaternion.qZ; break;
            }
            switch (cbReplaceAxisZ.SelectedIndex)
            {
            case 0: tmpZ = gyroQuaternion.qX; break;

            case 1: tmpZ = gyroQuaternion.qY; break;

            case 2: tmpZ = gyroQuaternion.qZ; break;
            }

            tmpW = gyroQuaternion.qW;

            if (chbInverseAxisX.Checked)
            {
                tmpX *= -1;
            }
            if (chbInverseAxisY.Checked)
            {
                tmpY *= -1;
            }
            if (chbInverseAxisZ.Checked)
            {
                tmpZ *= -1;
            }
        };

        if (InvokeRequired)
        {
            Invoke(methodInvokerDelegate);
        }
        else
        {
            methodInvokerDelegate();
        }

        return(new GyroQuaternion(gyroQuaternion.sensorName, tmpX, tmpY, tmpZ, tmpW));
    }
コード例 #6
0
    public static GyroQuaternion Multiply(GyroQuaternion q1, GyroQuaternion q2)
    {
        float qX = q1.qW * q2.qX + q1.qX * q2.qW + q1.qY * q2.qZ - q1.qZ * q2.qY;
        float qY = q1.qW * q2.qY + q1.qY * q2.qW + q1.qZ * q2.qX - q1.qX * q2.qZ;
        float qZ = q1.qW * q2.qZ + q1.qZ * q2.qW + q1.qX * q2.qY - q1.qY * q2.qX;
        float qW = q1.qW * q2.qW - q1.qX * q2.qX - q1.qY * q2.qY - q1.qZ * q2.qZ;

        return(new GyroQuaternion(q1.sensorName, qX, qY, qZ, qW));
    }
コード例 #7
0
    private void Cube3DRender(GyroQuaternion quat)
    {
        Point3D point3D = GyroQuaternion.QuatToEuler(quat);

        _cube3D.RotateX = point3D.X;
        _cube3D.RotateY = point3D.Y;
        _cube3D.RotateZ = point3D.Z;

        Point origin = new Point(pbCube3D.Width / 2, pbCube3D.Height / 2);

        pbCube3D.Image = _cube3D.DrawCube(origin);
    }
コード例 #8
0
    public static GyroQuaternion Inverse(GyroQuaternion quat)
    {
        GyroQuaternion quaternion2 = new GyroQuaternion(quat.sensorName, 0, 0, 0, -1);
        float          num2        = quat.qX * quat.qX + quat.qY * quat.qY + quat.qZ * quat.qZ + quat.qW * quat.qW;
        float          num         = 1f / num2;

        quaternion2.qX = -quat.qX * num;
        quaternion2.qY = -quat.qY * num;
        quaternion2.qZ = -quat.qZ * num;
        quaternion2.qW = quat.qW * num;
        return(quaternion2);
    }
コード例 #9
0
    public GyroQuaternion Filter(GyroQuaternion gyroQuaternion)
    {
        _quaternionQueue.Enqueue(gyroQuaternion);

        GyroQuaternion smaValue = SimpleMovingAverageQuaternion.GetLastValue(_quaternionQueue.GetAllItems(), _period);

        float qX = _kalmanFilterX.Filter(smaValue.qX);
        float qY = _kalmanFilterY.Filter(smaValue.qY);
        float qZ = _kalmanFilterZ.Filter(smaValue.qZ);
        float qW = _kalmanFilterW.Filter(smaValue.qW);

        GyroQuaternion result = new GyroQuaternion(gyroQuaternion.sensorName, qX, qY, qZ, qW);

        return(result);
    }
コード例 #10
0
    public static Point3D QuatToEuler(GyroQuaternion quat)
    {
        Point3D point3D = new Point3D();

        float X = quat.qX;
        float Y = quat.qY;
        float Z = quat.qZ;
        float W = quat.qW;

        float singularityTest = Z * X - W * Y;
        float yawY            = 2f * (W * Z + X * Y);
        float yawX            = 1f - 2f * (Y * Y + Z * Z);

        const float RAD_TO_DEG = (float)(180 / Math.PI);

        if (singularityTest < -0.4999995f)
        {
            point3D.X = -90f;
            point3D.Y = (float)Math.Atan2(yawY, yawX) * RAD_TO_DEG;
            point3D.Z = NormalizeAxis((float)(-point3D.Y - 2f * Math.Atan2(X, W) * RAD_TO_DEG));
        }
        else if (singularityTest > 0.4999995f)
        {
            point3D.X = 90f;
            point3D.Y = (float)Math.Atan2(yawY, yawX) * RAD_TO_DEG;
            point3D.Z = NormalizeAxis((float)(point3D.Y - 2f * Math.Atan2(X, W) * RAD_TO_DEG));
        }
        else
        {
            point3D.X = (float)Math.Asin(2f * singularityTest) * RAD_TO_DEG;
            point3D.Y = (float)Math.Atan2(yawY, yawX) * RAD_TO_DEG;
            point3D.Z = (float)Math.Atan2(-2f * (W * X + Y * Z), 1f - 2f * (X * X + Y * Y)) * RAD_TO_DEG;
        }

        return(point3D);
    }
コード例 #11
0
 public void Send(GyroQuaternion gyroQuaternion)
 {
     byte[] data = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(gyroQuaternion));
     udpSocket.BeginSend(data, 0, data.Length, 0, new AsyncCallback(SendCallback), udpSocket);
     sendDone.WaitOne();
 }
コード例 #12
0
 public GyroQuaternionCalibrationModel(GyroQuaternion gyroQuaternion)
 {
     GyroQuaternion = gyroQuaternion;
 }
コード例 #13
0
 public NewEventReceiveUDPServerArgs(GyroQuaternion quat)
 {
     ReceiveUDPServerMessage = quat;
 }