SensorBikeController.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using Controller.Bicycle;
  3. using Sensors;
  4. using Sensors.ANT;
  5. using Sensors.Polar;
  6. using Tracking;
  7. using UnityEngine;
  8. using UnityEngine.Serialization;
  9. namespace Controller
  10. {
  11. [Serializable]
  12. public struct PolarRotationMapping
  13. {
  14. public float maxRight;
  15. public float center;
  16. }
  17. [Serializable]
  18. public struct FrontWheelTrackerConfig
  19. {
  20. public FrontWheelTracker frontWheelTracker;
  21. public float multiplicator;
  22. public Vector3 AdjustedRotation => frontWheelTracker.Rotation * multiplicator;
  23. }
  24. public class SensorBikeController : MonoBehaviour
  25. {
  26. public PolarRotationMapping polarRotationMapping;
  27. public SpeedSensorConfig speedSensorConfig;
  28. public PolarSensorConfig polarSensorConfig;
  29. public FrontWheelTrackerConfig frontWheelTrackerConfig;
  30. public bool steer = true;
  31. public bool accelerate = true;
  32. public bool lean = true;
  33. private WcBicycleController wcBicycleController;
  34. private BikeSensorData sensorData;
  35. private float leanFactor;
  36. private bool isFrontWheelTrackerNotNull;
  37. private async void Start()
  38. {
  39. isFrontWheelTrackerNotNull = frontWheelTrackerConfig.frontWheelTracker != null;
  40. wcBicycleController = GetComponent<WcBicycleController>();
  41. sensorData = BikeSensorData.Instance;
  42. await sensorData.StartListening(polarSensorConfig: polarSensorConfig, speedSensorConfig: speedSensorConfig);
  43. leanFactor = 90f / (polarRotationMapping.maxRight - polarRotationMapping.center);
  44. }
  45. private void Update()
  46. {
  47. var speedData = sensorData.SpeedData;
  48. var polarData = sensorData.PolarData;
  49. if (speedData != null && accelerate)
  50. {
  51. SetSpeed(speedData.Value);
  52. }
  53. if (isFrontWheelTrackerNotNull && steer)
  54. {
  55. SetSteer();
  56. }
  57. if (polarData != null && lean)
  58. {
  59. SetLeaningAngle(polarData.Value);
  60. }
  61. }
  62. private void SetSteer()
  63. {
  64. wcBicycleController.CurrentSteerAngle = frontWheelTrackerConfig.AdjustedRotation.y; //TODO: something a bit smarter
  65. }
  66. private void OnDestroy()
  67. {
  68. sensorData?.Dispose();
  69. }
  70. private void SetLeaningAngle(PolarSensorData polarData)
  71. {
  72. //don't lean while standing / walking to bike
  73. if (wcBicycleController.rigidBody.velocity.magnitude > .5f)
  74. {
  75. wcBicycleController.CurrentLeaningAngle = (polarData.Acc.y - polarRotationMapping.center) * leanFactor;
  76. }
  77. }
  78. private void SetSpeed(SpeedSensorData speedData)
  79. {
  80. wcBicycleController.CurrentSpeed = speedData.Speed;
  81. }
  82. }
  83. }