FrontWheelTracker.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEditor;
  5. using UnityEngine;
  6. namespace Tracking
  7. {
  8. public class FrontWheelTracker : CalibratableTracker
  9. {
  10. protected override string KeyPrefix => "fw";
  11. public float trackerDistanceToWheelCenterPoint;
  12. public KineticLegTracker legTracker;
  13. public int framesToConsider = 10;
  14. public bool useTrackerRotationInsteadOfPosition;
  15. public float SteerRotation => framesToConsider > 1 ? CalculateSteerRotationMultiFrame() : CalculateSteerRotationSingleFrame();
  16. public Vector3 DebugPosOnBikePlane { private set; get; }
  17. private Queue<float> previousValues;
  18. protected override void Start()
  19. {
  20. base.Start();
  21. if (framesToConsider > 1)
  22. {
  23. previousValues = new Queue<float>(framesToConsider);
  24. }
  25. }
  26. private float CalculateSteerRotationSingleFrame()
  27. {
  28. if (useTrackerRotationInsteadOfPosition) return RelativeRotation.y;
  29. var posOnBikePlane = GetPosOnBikePlane();
  30. return TrackerPositionToAngle(posOnBikePlane);
  31. }
  32. private float CalculateSteerRotationMultiFrame()
  33. {
  34. var angleThisFrame = CalculateSteerRotationSingleFrame();
  35. if (previousValues.Count > framesToConsider)
  36. {
  37. previousValues.Dequeue();
  38. }
  39. previousValues.Enqueue(angleThisFrame);
  40. //easiest way -> avg; TODO maybe in future, remove outliers
  41. return previousValues.Average();
  42. }
  43. private Vector3 GetPosOnBikePlane()
  44. {
  45. //legTracker position is added to compensate movements of the whole installation
  46. Vector3 legTrackerPos = Vector3.zero;
  47. if (legTracker.isActiveAndEnabled)
  48. {
  49. legTrackerPos = legTracker.RelativePosition;
  50. }
  51. var posOnBikePlane = Vector3.ProjectOnPlane(RelativePosition + legTrackerPos, bicycleTransform.up);
  52. DebugPosOnBikePlane = posOnBikePlane;
  53. /*if (Mathf.Abs(posOnBikePlane.x / trackerDistanceToWheelCenterPoint) >= 1f)
  54. {
  55. Debug.LogError("Strange behaviour!");
  56. //EditorApplication.isPaused = true;
  57. }*/
  58. return posOnBikePlane;
  59. }
  60. private float TrackerPositionToAngle(Vector3 posOnBikePlane)
  61. {
  62. var theta = Mathf.Acos(Mathf.Clamp(posOnBikePlane.x / trackerDistanceToWheelCenterPoint, -1f, 1f));
  63. return 90f - theta * Mathf.Rad2Deg;
  64. }
  65. }
  66. }