// 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); } }
// 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); }
// 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; } } }