402b781e27bb001711b8bf632416c20d 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package robots;
  2. import java.util.ArrayList;
  3. import java.util.Random;
  4. import lejos.robotics.mapping.LineMap;
  5. import lejos.robotics.navigation.Pose;
  6. public class VirtualRobot implements Robot {
  7. private Pose pose;
  8. private Simulate simthread;
  9. private RobotReturn rr;
  10. private LineMap map;
  11. private int angle = 0;
  12. private Random rand;
  13. private class Simulate extends Thread {
  14. public boolean run = true;
  15. public void run() {
  16. angle = 0;
  17. int add = -5;
  18. while (run) {
  19. DataPose data = new DataPose();
  20. double dist = getDistance();
  21. data.setDistance((int) dist);
  22. data.setPose(pose);
  23. data.setSensorAngle(angle + 90);
  24. rr.robotData(data);
  25. angle += add;
  26. if (angle == -180 || angle == 0)
  27. add *= -1;
  28. try {
  29. Thread.sleep(50);
  30. } catch (InterruptedException e) {
  31. }
  32. }
  33. }
  34. }
  35. public double getDistance() {
  36. Pose tmppose = new Pose(pose.getX(), pose.getY(), pose.getHeading());
  37. float mindist = Float.POSITIVE_INFINITY;
  38. int cone = 30;
  39. for (int angulo = -cone / 2; angulo <= cone / 2; angulo++) {
  40. tmppose.setHeading((float) (pose.getHeading() - angulo + angle));
  41. float dist = map.range(tmppose);
  42. if (dist > 0 && dist < mindist)
  43. mindist = dist;
  44. }
  45. double v = mindist + rand.nextGaussian() * 4 + Math.random() * 2;
  46. v = Math.min(255, v);
  47. return v;
  48. }
  49. public VirtualRobot(LineMap map) {
  50. pose = new Pose();
  51. pose.setHeading(0);
  52. this.map = map;
  53. rand = new Random();
  54. }
  55. @Override
  56. public void moveForward() {
  57. move(5);
  58. }
  59. @Override
  60. public void moveLeft() {
  61. pose.rotateUpdate(45);
  62. }
  63. @Override
  64. public void moveRight() {
  65. pose.rotateUpdate(-45);
  66. }
  67. @Override
  68. public void moveBackward() {
  69. move(-5);
  70. }
  71. @Override
  72. public boolean connect() {
  73. return true;
  74. }
  75. @Override
  76. public void stop() {
  77. }
  78. @Override
  79. public void move(double x) {
  80. double dx = Math.sin(Math.toRadians(pose.getHeading())) * x;
  81. double dy = Math.cos(Math.toRadians(pose.getHeading())) * x;
  82. pose.translate((float) dx, (float) -dy);
  83. }
  84. @Override
  85. public void rotate(double x) {
  86. pose.rotateUpdate((float) -x);
  87. }
  88. @Override
  89. public ArrayList<DataPose> scann(int ini, int end, int interval) {
  90. ArrayList<DataPose> result = new ArrayList<DataPose>();
  91. for (angle = ini; angle <= end; angle += interval) {
  92. DataPose data = new DataPose();
  93. double dist = getDistance();
  94. data.setDistance((int) dist);
  95. data.setPose(pose);
  96. data.setSensorAngle(angle+90);
  97. result.add(data);
  98. }
  99. return result;
  100. }
  101. @Override
  102. public void scann(RobotReturn r) {
  103. rr = r;
  104. stopScann();
  105. simthread = new Simulate();
  106. simthread.start();
  107. }
  108. @Override
  109. public void stopScann() {
  110. if (simthread == null)
  111. return;
  112. simthread.run = false;
  113. try {
  114. simthread.join();
  115. } catch (InterruptedException e) {
  116. // TODO Auto-generated catch block
  117. e.printStackTrace();
  118. }
  119. }
  120. @Override
  121. public void disconnect() {
  122. }
  123. @Override
  124. public void setPose(float x, float y, float a) {
  125. pose.setHeading(a);
  126. pose.setLocation(x, y);
  127. }
  128. @Override
  129. public String toString() {
  130. return "Virtual Robot";
  131. }
  132. }