40056c7c19bb001711b8bf632416c20d 2.7 KB

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