ControlScheme.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. using System;
  2. using System.Collections.Generic;
  3. namespace RaahnSimulation
  4. {
  5. public partial class Car
  6. {
  7. public class ControlScheme
  8. {
  9. public enum Scheme
  10. {
  11. NONE = -1,
  12. SENSOR_CONTROL = 0,
  13. RANGE_FINDER_CONTROL = 1
  14. }
  15. private const uint DEFAULT_SCHEME_INDEX = 0;
  16. public delegate bool SchemeFunction(Car car);
  17. public static readonly SchemeFunction[] SCHEMES =
  18. {
  19. SensorControl, RangeFinderControl
  20. };
  21. public static readonly string[] SCHEME_STRINGS =
  22. {
  23. "SensorControl", "RangeFinderControl"
  24. };
  25. public static void InterpretParameters(string[] parameters, Scheme scheme)
  26. {
  27. //Interpret parameters specific to each scheme, if any.
  28. switch (scheme)
  29. {
  30. case Scheme.SENSOR_CONTROL:
  31. {
  32. break;
  33. }
  34. case Scheme.RANGE_FINDER_CONTROL:
  35. {
  36. break;
  37. }
  38. }
  39. }
  40. public static Scheme GetSchemeFromString(string schemeString)
  41. {
  42. for (int i = 0; i < SCHEME_STRINGS.Length; i++)
  43. {
  44. if (schemeString.Equals(SCHEME_STRINGS[i]))
  45. return (Scheme)i;
  46. }
  47. return Scheme.NONE;
  48. }
  49. public static SchemeFunction GetSchemeFunction(Scheme scheme)
  50. {
  51. int schemei = (int)scheme;
  52. if (schemei >= 0 && schemei < SCHEMES.Length)
  53. return SCHEMES[schemei];
  54. else
  55. return null;
  56. }
  57. //Uses both range finders and pie slice sensors.
  58. public static bool SensorControl(Car car)
  59. {
  60. bool userControl = false;
  61. //Set the inputs.
  62. List<double> inputs = new List<double>((int)(car.rangeFinderCount + car.pieSliceSensorCount));
  63. for (uint x = 0; x < car.rangeFinderGroups.Count; x++)
  64. {
  65. uint currentGroupLength = car.rangeFinderGroups[(int)x].GetRangeFinderCount();
  66. for (uint y = 0; y < currentGroupLength; y++)
  67. inputs.Add(car.rangeFinderGroups[(int)x].GetRangeFinderValue(y));
  68. }
  69. for (uint x = 0; x < car.pieSliceSensorGroups.Count; x++)
  70. {
  71. uint currentGroupLength = car.pieSliceSensorGroups[(int)x].GetPieSliceSensorCount();
  72. for (uint y = 0; y < currentGroupLength; y++)
  73. inputs.Add(car.pieSliceSensorGroups[(int)x].GetPieSliceSensorValue(y));
  74. }
  75. car.brain.AddExperience(inputs);
  76. car.brain.PropagateSignal();
  77. //If the left or right arrow key is down, use user control.
  78. if (car.context.GetLeftKeyDown())
  79. {
  80. car.brain.SetOutput(0, 0, Car.MAX_ROTATE);
  81. userControl = true;
  82. }
  83. else if (car.context.GetRightKeyDown())
  84. {
  85. car.brain.SetOutput(0, 0, Car.MIN_ROTATE);
  86. userControl = true;
  87. }
  88. double output = car.brain.GetOutputValue(0, 0);
  89. car.angle += (output * ROTATE_RANGE) - ROTATE_SPEED;
  90. return userControl;
  91. }
  92. public static bool RangeFinderControl(Car car)
  93. {
  94. bool userControl = false;
  95. //Set the inputs.
  96. List<double> inputs = new List<double>((int)car.rangeFinderCount);
  97. for (uint x = 0; x < car.rangeFinderGroups.Count; x++)
  98. {
  99. uint currentGroupLength = car.rangeFinderGroups[(int)x].GetRangeFinderCount();
  100. for (uint y = 0; y < currentGroupLength; y++)
  101. inputs.Add(car.rangeFinderGroups[(int)x].GetRangeFinderValue(y));
  102. }
  103. car.brain.AddExperience(inputs);
  104. car.brain.PropagateSignal();
  105. //If the left or right arrow key is down, use user control.
  106. if (car.context.GetLeftKeyDown())
  107. {
  108. car.brain.SetOutput(0, 0, Car.MAX_ROTATE);
  109. userControl = true;
  110. }
  111. else if (car.context.GetRightKeyDown())
  112. {
  113. car.brain.SetOutput(0, 0, Car.MIN_ROTATE);
  114. userControl = true;
  115. }
  116. double output = car.brain.GetOutputValue(0, 0);
  117. car.angle += (output * ROTATE_RANGE) - ROTATE_SPEED;
  118. return userControl;
  119. }
  120. }
  121. }
  122. }