VirtualRobot.java 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. DataRead data = new DataRead();
  20. double dist = getDistance();
  21. data.setDistance((int) dist);
  22. data.setSensorAngle(angle + 90);
  23. rr.robotData(data);
  24. angle += add;
  25. if (angle == -180 || angle == 0)
  26. add *= -1;
  27. try {
  28. Thread.sleep(50);
  29. } catch (InterruptedException e) {
  30. }
  31. }
  32. }
  33. }
  34. public double getDistance() {
  35. Pose tmppose = new Pose(pose.getX(), pose.getY(), pose.getHeading());
  36. float mindist = Float.POSITIVE_INFINITY;
  37. int cone = 30;
  38. for (int angulo = -cone / 2; angulo <= cone / 2; angulo++) {
  39. tmppose.setHeading((float) (pose.getHeading() - angulo + angle));
  40. float dist = map.range(tmppose);
  41. if (dist > 0 && dist < mindist)
  42. mindist = dist;
  43. }
  44. double v = mindist + rand.nextGaussian() * 4; //+ Math.random() * 2;
  45. v = Math.min(255, v);
  46. return v;
  47. }
  48. public VirtualRobot(LineMap map) {
  49. pose = new Pose(20,20,90);
  50. pose.setHeading(0);
  51. this.map = map;
  52. rand = new Random();
  53. }
  54. @Override
  55. public void moveForward() {
  56. move(5);
  57. }
  58. @Override
  59. public void moveLeft() {
  60. pose.rotateUpdate(45);
  61. }
  62. @Override
  63. public void moveRight() {
  64. pose.rotateUpdate(-45);
  65. }
  66. @Override
  67. public void moveBackward() {
  68. move(-5);
  69. }
  70. @Override
  71. public boolean connect() {
  72. return true;
  73. }
  74. @Override
  75. public void stop() {
  76. }
  77. @Override
  78. public void move(double x) {
  79. double dx = Math.sin(Math.toRadians(pose.getHeading())) * x;
  80. double dy = Math.cos(Math.toRadians(pose.getHeading())) * x;
  81. pose.translate((float) dx, (float) -dy);
  82. System.out.println("VR: "+pose);
  83. }
  84. @Override
  85. public void rotate(double x) {
  86. pose.rotateUpdate((float) -x);
  87. }
  88. @Override
  89. public ArrayList<DataRead> scann(int ini, int end, int interval) {
  90. ArrayList<DataRead> result = new ArrayList<DataRead>();
  91. for (angle = ini-90; angle <= end-90; angle += interval) {
  92. DataRead data = new DataRead();
  93. double dist = getDistance();
  94. data.setDistance((int) dist);
  95. data.setSensorAngle(angle+90);
  96. result.add(data);
  97. }
  98. angle = 0;
  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. }