// apply a Shimmer model to the transform
    private void UpdateTransform(Shimmer3DModel s)
    {
        transform.parent.transform.eulerAngles = offset;

        transform.eulerAngles = new Vector3(
            (float)s.Axis_Angle_X_CAL,
            (float)s.Axis_Angle_Y_CAL,
            (float)s.Axis_Angle_Z_CAL
            );

        transform.localRotation = new Quaternion(
            -(float)s.Quaternion_2_CAL,
            -(float)s.Quaternion_0_CAL,
            (float)s.Quaternion_1_CAL,
            -(float)s.Quaternion_3_CAL);


        accelerometer = new Vector3(
            (float)s.Low_Noise_Accelerometer_Y_CAL,
            (float)s.Low_Noise_Accelerometer_Z_CAL,
            -(float)s.Low_Noise_Accelerometer_X_CAL);

        gyroscope = new Vector3(
            (float)s.Gyroscope_Y_CAL,
            (float)s.Gyroscope_Z_CAL,
            -(float)s.Gyroscope_X_CAL);
    }
 //Add snapshots of model accel and rotation to list
 private void IsMoving(Shimmer3DModel s)
 {
     ////add string key then value
     //snapshots.Add("Ac: " + Time.time, accel);
     //snapshots.Add("Gy: " + Time.time, gyro);
     //playback.Add(BuildRowFromModel(s));
 }
    // this method is called for each row of data received from the Shimmer
    public void UpdateFeed(List <double> data)
    {
        Shimmer3DModel s;

        if (data.Count > 0)
        {
            // put this data as a model on the shared Queue
            s = Shimmer3DModel.GetModelFromArray(data.ToArray());
            Queue.Enqueue(s);
        }
    }
Beispiel #4
0
        // create a csv row from a shimmer3D model object
        public static string BuildRowFromModel(Shimmer3DModel s)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(s.Timestamp_RAW); // convert this to a readable date
            sb.Append("," + s.Timestamp_CAL);

            sb.Append("," + s.Low_Noise_Accelerometer_X_RAW);
            sb.Append("," + s.Low_Noise_Accelerometer_X_CAL);
            sb.Append("," + s.Low_Noise_Accelerometer_Y_RAW);
            sb.Append("," + s.Low_Noise_Accelerometer_Y_CAL);
            sb.Append("," + s.Low_Noise_Accelerometer_Z_RAW);
            sb.Append("," + s.Low_Noise_Accelerometer_Z_CAL);

            sb.Append("," + s.Wide_Range_Accelerometer_X_RAW);
            sb.Append("," + s.Wide_Range_Accelerometer_X_CAL);
            sb.Append("," + s.Wide_Range_Accelerometer_Y_RAW);
            sb.Append("," + s.Wide_Range_Accelerometer_Y_CAL);
            sb.Append("," + s.Wide_Range_Accelerometer_Z_RAW);
            sb.Append("," + s.Wide_Range_Accelerometer_Z_CAL);

            sb.Append("," + s.Gyroscope_X_RAW);
            sb.Append("," + s.Gyroscope_X_CAL);
            sb.Append("," + s.Gyroscope_Y_RAW);
            sb.Append("," + s.Gyroscope_Y_CAL);
            sb.Append("," + s.Gyroscope_Z_RAW);
            sb.Append("," + s.Gyroscope_Z_CAL);

            sb.Append("," + s.Magnetometer_X_RAW);
            sb.Append("," + s.Magnetometer_X_CAL);
            sb.Append("," + s.Magnetometer_Y_RAW);
            sb.Append("," + s.Magnetometer_Y_CAL);
            sb.Append("," + s.Magnetometer_Z_RAW);
            sb.Append("," + s.Magnetometer_Z_CAL);


            sb.Append("," + s.Pressure_RAW);
            sb.Append("," + s.Pressure_CAL);
            sb.Append("," + s.Temperature_RAW);
            sb.Append("," + s.Temperature_CAL);

            sb.Append("," + s.Axis_Angle_A_CAL);
            sb.Append("," + s.Axis_Angle_X_CAL);
            sb.Append("," + s.Axis_Angle_Y_CAL);
            sb.Append("," + s.Axis_Angle_Z_CAL);

            sb.Append("," + s.Quaternion_0_CAL);
            sb.Append("," + s.Quaternion_1_CAL);
            sb.Append("," + s.Quaternion_2_CAL);
            sb.Append("," + s.Quaternion_3_CAL);

            return(sb.ToString());
        }
 // this method is called for each model as it is received
 public void UpdateFeed(List <double> data)
 {
     if (data != null)
     {
         Shimmer3DModel s = Shimmer3DModel.GetModelFromArray(data.ToArray());
         dataQueue.Enqueue(s);
         if (count % 10 == 0)
         {
             Shimmer3DModel.PrintModel(s);
         }
         count++;
     }
 }
    // this method is called for each row of data received from the Shimmer
    public void UpdateFeed(List <double> data)
    {
        Shimmer3DModel s;

        if (data.Count > 0)
        {
            // put this data as a model on the shared Queue
            s = Shimmer3DModel.GetModelFromArray(data.ToArray());
            Queue.Enqueue(s);
            if (IsRecording)
            {
                // save to list aswell
                RecordList.Add(s);
            }
        }
    }
    private bool CheckMoving(Shimmer3DModel s)
    {
        //if movement in any direction is above a set threshold, capture data and add to list
        float dX = Mathf.Abs((float)(lastShimmerModel.Low_Noise_Accelerometer_X_CAL - s.Low_Noise_Accelerometer_X_CAL));
        float dY = Mathf.Abs((float)(lastShimmerModel.Low_Noise_Accelerometer_Y_CAL - s.Low_Noise_Accelerometer_Y_CAL));
        float dZ = Mathf.Abs((float)(lastShimmerModel.Low_Noise_Accelerometer_Z_CAL - s.Low_Noise_Accelerometer_Z_CAL));

        if (dX > isMovingThreshold || dY > isMovingThreshold || dZ > isMovingThreshold)
        {
            Vector3 accel = new Vector3(dX, dY, dZ);
            Vector3 gyro  = new Vector3((float)s.Gyroscope_X_CAL, (float)s.Gyroscope_Y_CAL, (float)s.Gyroscope_Z_CAL);
            IsMoving(s);
            return(true);
        }

        return(false);
    }
Beispiel #8
0
        // rebuild a shimmer3D model from a row in a csv file
        public static Shimmer3DModel BuildModelFromRow(string csvLine)
        {
            string[]       values      = csvLine.Split(',');
            Shimmer3DModel loadedModel = new Shimmer3DModel(
                Convert.ToDouble(values[0]),
                Convert.ToDouble(values[1]),
                Convert.ToDouble(values[2]),
                Convert.ToDouble(values[3]),
                Convert.ToDouble(values[4]),
                Convert.ToDouble(values[5]),
                Convert.ToDouble(values[6]),
                Convert.ToDouble(values[7]),
                Convert.ToDouble(values[8]),
                Convert.ToDouble(values[9]),
                Convert.ToDouble(values[10]),
                Convert.ToDouble(values[11]),
                Convert.ToDouble(values[12]),
                Convert.ToDouble(values[13]),
                Convert.ToDouble(values[14]),
                Convert.ToDouble(values[15]),
                Convert.ToDouble(values[16]),
                Convert.ToDouble(values[17]),
                Convert.ToDouble(values[18]),
                Convert.ToDouble(values[19]),
                Convert.ToDouble(values[20]),
                Convert.ToDouble(values[21]),
                Convert.ToDouble(values[22]),
                Convert.ToDouble(values[23]),
                Convert.ToDouble(values[24]),
                Convert.ToDouble(values[25]),
                Convert.ToDouble(values[26]),
                Convert.ToDouble(values[27]),
                Convert.ToDouble(values[28]),
                Convert.ToDouble(values[29]),
                Convert.ToDouble(values[30]),
                Convert.ToDouble(values[31]),
                Convert.ToDouble(values[32]),
                Convert.ToDouble(values[33]),
                Convert.ToDouble(values[34]),
                Convert.ToDouble(values[35]),
                Convert.ToDouble(values[36]),
                Convert.ToDouble(values[37]));

            return(loadedModel);
        }
    private void UpdateTransform(Shimmer3DModel s)
    {
        transform.localRotation = new Quaternion(
            -(float)s.Quaternion_2_CAL,
            -(float)s.Quaternion_0_CAL,
            (float)s.Quaternion_1_CAL,
            -(float)s.Quaternion_3_CAL);


        accelerometer = new Vector3(
            (float)s.Low_Noise_Accelerometer_X_CAL,
            (float)s.Low_Noise_Accelerometer_Y_CAL,
            (float)s.Low_Noise_Accelerometer_Z_CAL);
        //Debug.Log("LN Acc X: " + accelerometer.x + "LN Acc Y: " + accelerometer.y + "LN Acc Z: " + accelerometer.z);

        gyroscope = new Vector3(
            (float)s.Gyroscope_Y_CAL,
            (float)s.Gyroscope_Z_CAL,
            -(float)s.Gyroscope_X_CAL);
    }
        // TODO: unused in this class - will be moved to viewModel
        private void RotateCube(Shimmer3DModel s)
        {
            // Quaternion Calibrated Values
            var x = s.Quaternion_0_CAL;
            var y = s.Quaternion_1_CAL;
            var z = s.Quaternion_2_CAL;
            var w = s.Quaternion_3_CAL;

            //// Gyroscope Calibrated Values
            //var x = s.Gyroscope_X_CAL;
            //var y = s.Gyroscope_X_CAL;
            //var z = s.Gyroscope_X_CAL;

            //Shimmer3DModel.PrintModel(s);


            //Quaternion q = new Quaternion(new Vector3D(x, y, z), w);
            //Cube.Transform = new RotateTransform3D(new QuaternionRotation3D(q));

            //Cube.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), x));
            //Cube.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), y));
            //Cube.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), z));
        }
    private void Update()
    {
        if (!isPlayback)
        {
            // if data is available, use it
            if (shimmerFeed.Queue.Count > 0)
            {
                var s = shimmerFeed.Queue.Dequeue();
                playback.Add(s);
                // see if there was an 'impact' between this data and the last received data
                if (lastShimmerModel != null)
                {
                    Debug.Log("Checking Impact");
                    if (CheckImpact(s))
                    {
                        txtImpact.text = "--IMPACT--\n" + Time.time;
                    }

                    if (CheckMoving(s))
                    {
                        txtImpact.text = "--IsMoving--\n" + "LN Acc X: " + accelerometer.x + "\nLN Acc Y: " + accelerometer.y + "\nLN Acc Z: " + accelerometer.z;
                    }
                }
                UpdateTransform(s);
                lastShimmerModel = s;
            }
        }
        else
        {
            if (loadFile.Count > 0 && loadFile != null)
            {
                var s = loadFile[0];
                UpdateTransform(s);
                loadFile.Remove(s);
            }
        }
    }
    private bool CheckImpact(Shimmer3DModel s)
    {
        float dX = Mathf.Abs((float)(lastShimmerModel.Low_Noise_Accelerometer_X_CAL - s.Low_Noise_Accelerometer_X_CAL));
        float dY = Mathf.Abs((float)(lastShimmerModel.Low_Noise_Accelerometer_Y_CAL - s.Low_Noise_Accelerometer_Y_CAL));
        float dZ = Mathf.Abs((float)(lastShimmerModel.Low_Noise_Accelerometer_Z_CAL - s.Low_Noise_Accelerometer_Z_CAL));

        //Debug.Log(dX);
        //Debug.Log(dY);
        //Debug.Log(dZ);

        if (dX > impactThreshold)
        {
            return(true);
        }
        if (dY > impactThreshold)
        {
            return(true);
        }
        if (dZ > impactThreshold)
        {
            return(true);
        }
        return(false);
    }
    // main logic used to decide what to do with the transform, i.e. live streaming or playback
    // TODO: tidy up the logic in this method if needed
    private void Update()
    {
        // handle live streaming from shimmer
        if (!shimmerDevice.IsPlayback)
        {
            isLive = true;
            // if data is available, use it
            if (shimmerDevice.Queue.Count > 0)
            {
                var s = shimmerDevice.Queue.Dequeue();
                // see if there was an 'impact' between this data and the last received data
                if (lastShimmerModel != null)
                {
                    //Debug.Log("Checking Impact");
                    if (CheckImpact(s))
                    {
                        txtImpact.text = "--IMPACT--" + Time.time;
                        Debug.Log("--IMPACT--" + Time.time);
                    }
                }
                UpdateTransform(s);
                lastShimmerModel = s;
            }
        }    // end handle live streaming
        else // handle playback
        {
            // handle playback from memory if data is present and playback mode is enabled
            Shimmer3DModel s;
            if (shimmerDevice.RecordList.Count > 0 && shimmerDevice.RecordList != null && shimmerDevice.IsPlayback == true)
            {
                // get the first model from the list
                s = shimmerDevice.RecordList[0];
                // check whether this is the first model in the playback list
                // - if it is the first model, isLive will still be set to true
                if (isLive)
                {
                    // first frame, set these variables
                    isLive = false;
                    // firstModelTime is set as the timestamp of the first model in the list, all other models
                    // will be applied to the transform relative to this first model
                    firstModelTime = s.Timestamp_CAL;

                    // update the model's transform accordingly
                    UpdateTransform(s);
                    // reset the time since last model applied, since one was just applied
                    timeSinceLastModelApplied = 0.0;
                    // and remove the 'used' model from the list
                    shimmerDevice.RecordList.Remove(s);
                }

                double timeToWait = 0.0;
                if (!isLive)
                {
                    timeToWait = (s.Timestamp_CAL - firstModelTime) / 1000;
                }

                // check if the next model should be applied to the transform
                // i.e. wait the correct amount of time to display the next frame
                if (timeSinceLastModelApplied >= timeToWait)
                {
                    // update the model's transform accordingly
                    UpdateTransform(s);
                    // and remove the 'used' model from the list
                    shimmerDevice.RecordList.Remove(s);
                }
                else
                {
                    // still waiting, increment the time since last frame with time between this
                    timeSinceLastModelApplied += Time.deltaTime;
                }
            }
            else
            {
                // playback is either disabled or has ended, simply turn playback off to save on processing
                shimmerDevice.IsPlayback = false;
            }
        }
    }