public override string ToString() { return Frames.ToString().PadLeft(4, ' ') + (Jump ? ",Jump" : "") + (Save ? ",Save" : "") + (Fire ? ",Fire" : "") + (Bash ? ",Bash" : "") + (ChargeJump ? ",CJump" : "") + (Glide ? ",Glide" : "") + (Start ? ",Start" : "") + (Select ? ",Select" : "") + (UI ? ",UI" : "") + (Action ? ",Action" : "") + (Esc ? ",Esc" : "") + (Dash ? ",Dash" : "") + (Grenade ? ",Grenade" : "") + Axis() + (DLoad ? ",DLoad" : "") + (DSave ? ",DSave" : "") + (SaveSlot >= 0 ? ",Slot," + (SaveSlot + 1) : "") + (!Position ? "" : ",Pos," + PositionX.ToString("0.####") + "," + PositionY.ToString("0.####")) + (!Speed ? "" : ",Speed," + SpeedX.ToString("0.####") + "," + SpeedY.ToString("0.####")) + (XP >= 0 ? ",XP," + XP : "") + (Color ? ",Color" : "") + (Random >= 0 ? ",Random," + Random : "") + (!EntityPos ? "" : ",EntityPos," + EntityPosX.ToString("0.####") + "," + EntityPosY.ToString("0.####")) + (!BlockPos ? "" : ",BlockPos," + BlockPosX.ToString("0.####") + "," + BlockPosY.ToString("0.####")) + (EntityHP < 0 ? "" : ",EntityHP," + EntityHP.ToString("0.##")) + (HP >= 0 ? ",HP," + HP.ToString("0.#") : "") + (EN >= 0 ? ",EN," + EN.ToString("0.##") : "") + (Restore ? ",Restore" : "") + (Copy >= 0 ? ",Copy," + (Copy + 1) : "") + (SkillTree >= 0 ? ",SkillTree," + SkillTree : "") + (MouseX < 0 && MouseY < 0 ? "" : ",Mouse," + MouseX.ToString("0.####") + "," + MouseY.ToString("0.####")); }
void RealTimeSerialWithAvg() { //Update the LastAccel LastAccelX = AccelX; LastAccelY = AccelY; LastAccelZ = AccelZ; LastSpeedX = SpeedX; LastSpeedY = SpeedY; LastSpeedZ = SpeedZ; LastDispX = DispX; LastDispY = DispY; LastDispZ = DispZ; //Read a serial message and update Quat and Accel data WholeLine = GameObject.Find("RacketPviot").GetComponent <SerialController>().ReadSerialMessage(); if (WholeLine != null) { QAData = WholeLine.Split(new[] { ',' }); if (QAData.Length != 7) { //Invalid input, use the same data as the last update Debug.Log("Invalid input, keep last valid data."); } else { //Valid input, update raw Quat and Accel data float.TryParse(QAData[0], out QuatW); float.TryParse(QAData[1], out QuatX); float.TryParse(QAData[2], out QuatY); float.TryParse(QAData[3], out QuatZ); float.TryParse(QAData[4], out AccelX); float.TryParse(QAData[5], out AccelY); float.TryParse(QAData[6], out AccelZ); if (RecordPlaybackRaw) { SW.WriteLine(WholeLine); } } } else { //Empty serial message, use the same data as the last update Debug.Log("Empty serial message, keep last valid data"); } //Update the average SumAccelX = AvgAccelX * (AvgSize - 1) + AccelX; AvgAccelX = SumAccelX / AvgSize; SumAccelY = AvgAccelY * (AvgSize - 1) + AccelY; AvgAccelY = SumAccelY / AvgSize; SumAccelZ = AvgAccelZ * (AvgSize - 1) + AccelZ; AvgAccelZ = SumAccelZ / AvgSize; // Use a threshold to filter the mechanical noise float MagnitudeAccel = Mathf.Sqrt(AvgAccelX * AvgAccelX + AvgAccelY * AvgAccelY + AvgAccelZ * AvgAccelZ); if (MagnitudeAccel < MagnitudeAccelThreshold) { AccelX = 0; AccelY = 0; AccelZ = 0; SpeedX = 0; SpeedY = 0; SpeedZ = 0; DispX = 0; DispY = 0; DispZ = 0; } else { //TODO:Use AvgAccel or Zero mean version Accel? AccelX = AvgAccelX - SStateAccelX; AccelY = AvgAccelY - SStateAccelY; AccelZ = AvgAccelZ - SStateAccelZ; //Apply the double integration SpeedX = LastSpeedX + LastAccelX * Time.fixedDeltaTime + (AccelX - LastAccelX) * Time.fixedDeltaTime / 2f; SpeedY = LastSpeedY + LastAccelY * Time.fixedDeltaTime + (AccelY - LastAccelY) * Time.fixedDeltaTime / 2f; SpeedZ = LastSpeedZ + LastAccelZ * Time.fixedDeltaTime + (AccelZ - LastAccelZ) * Time.fixedDeltaTime / 2f; DispX = LastDispX + LastSpeedX * Time.fixedDeltaTime + (SpeedX - LastSpeedX) * Time.fixedDeltaTime / 2f; DispY = LastDispY + LastSpeedY * Time.fixedDeltaTime + (SpeedY - LastSpeedY) * Time.fixedDeltaTime / 2f; DispZ = LastDispZ + LastSpeedZ * Time.fixedDeltaTime + (SpeedZ - LastSpeedZ) * Time.fixedDeltaTime / 2f; } Rotate = new Quaternion(-QuatX, -QuatZ, -QuatY, QuatW); //Apply the transform if (ShowDisp) { this.transform.Translate(SpeedX, SpeedZ, SpeedY, Space.Self); /* * this.transform.Translate(Vector3.right * DispX); * this.transform.Translate(Vector3.up * DispZ); * this.transform.Translate(Vector3.forward * DispY); */ } this.transform.rotation = Rotate; if (RecordPlayback) { string RecordLine = QuatW.ToString() + "," + QuatX.ToString() + "," + QuatY.ToString() + "," + QuatZ.ToString() + "," + SpeedX.ToString() + "," + SpeedY.ToString() + "," + SpeedZ.ToString(); SW.WriteLine(RecordLine); } }