107fedec1ebb001711b8bf632416c20d 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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) 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();
  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. }
  83. @Override
  84. public void rotate(double x) {
  85. pose.rotateUpdate((float)-x);
  86. }
  87. @Override
  88. public ArrayList<DataPose> scann(int ini, int end, int interval) {
  89. ArrayList<DataPose> result = new ArrayList<DataPose>();
  90. int ang = 0;
  91. for (ang = ini; ang <= end; ang += interval) {
  92. DataPose data = new DataPose();
  93. double dist = getDistance();
  94. data.setDistance((int)dist);
  95. data.setPose(pose);
  96. data.setSensorAngle(ang);
  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) return;
  111. simthread.run = false;
  112. try {
  113. simthread.join();
  114. } catch (InterruptedException e) {
  115. // TODO Auto-generated catch block
  116. e.printStackTrace();
  117. }
  118. }
  119. @Override
  120. public void disconnect() {
  121. }
  122. @Override
  123. public void setPose(float x, float y, float a) {
  124. pose.setHeading(a);
  125. pose.setLocation(x, y);
  126. }
  127. @Override
  128. public String toString() {
  129. return "Virtual Robot";
  130. }
  131. }