Robot.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import logging
  2. import numpy as np
  3. class Robot:
  4. def __init__(self, simulator, name: str, id: int, position: np.array) -> None:
  5. """The base Robot class
  6. Parameters
  7. ----------
  8. simulator: Simsim
  9. Host simulator object
  10. name : str
  11. Robot's name
  12. id : int
  13. Robot's ID
  14. position : np.array
  15. Robot's starting position
  16. """
  17. # host simulator
  18. self.simulator = simulator
  19. self.name = name
  20. self.id = id
  21. self.log_head = f"{self.name}_{self.id}"
  22. self.position = position
  23. # facing direction
  24. self.ang = np.random.random()*360
  25. self.desired_position = self.position
  26. self.in_position = True
  27. self.speed = 0.0
  28. self.rate = self.simulator.rate
  29. self.max_speed = 100.0 # m/s
  30. def waypoint_ctrl(self, speed=None, desired_pos: np.array = None):
  31. # if got new waypoint, update
  32. if not np.any(desired_pos == None):
  33. # logging.debug(f"{self.name}{self.id} set new desired position")
  34. self.desired_position = desired_pos
  35. if speed is None:
  36. # logging.debug(f"{self.name}_{self.id} set to max speed")
  37. self.speed = self.max_speed
  38. else:
  39. if speed > self.max_speed:
  40. logging.warning("Given speed is over maximum")
  41. self.speed = speed
  42. if np.any(self.position != self.desired_position):
  43. # logging.debug(
  44. # f"{self.name}_{self.id} moving to {self.desired_position}")
  45. self.in_position = False
  46. one_time_step_length = self.speed/self.rate
  47. difference = self.desired_position - self.position
  48. distance = np.linalg.norm(difference)
  49. # if it's close enough to the goal position, make it in position
  50. if distance <= one_time_step_length:
  51. self.position = self.desired_position
  52. self.in_position = True
  53. else:
  54. # move to the goal point at the given speed
  55. direction = difference/distance
  56. self.position = self.position + direction*self.speed/self.rate
  57. # print("MOVED")
  58. return self.in_position
  59. def job(self):
  60. self.waypoint_ctrl()
  61. pass