Robot.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import logging
  2. import numpy as np
  3. class Robot:
  4. def __init__(self, simulator, name: str, id: int, position: np.array, rate: int) -> None:
  5. """The base Robot class
  6. Parameters
  7. ----------
  8. name : str
  9. Robot's name
  10. id : int
  11. Robot's ID
  12. position : np.array
  13. Robot's start position
  14. rate : int
  15. Simulator's update rate
  16. """
  17. # host simulator
  18. self.simulator = simulator
  19. self.name = name
  20. self.id = id
  21. self.position = position
  22. self.desierd_position = self.position
  23. self.in_position = True
  24. self.speed = 0.0
  25. self.rate = rate
  26. self.max_speed = 100.0 # m/s
  27. def waypoint_ctrl(self, speed=None, desierd_pos: np.array = None):
  28. # if got new waypoint, update
  29. if not np.any(desierd_pos == None):
  30. self.desierd_position = desierd_pos
  31. if speed == None:
  32. self.speed = self.max_speed
  33. else:
  34. if speed > self.max_speed:
  35. logging.warning("Given speed is over maximum")
  36. self.speed = speed
  37. if np.any(self.position != self.desierd_position):
  38. self.in_position = False
  39. one_time_step_length = speed/self.rate
  40. difference = self.desierd_position - self.position
  41. distance = np.linalg.norm(difference)
  42. # if it's close enough to the goal position, make it in position
  43. if distance <= one_time_step_length:
  44. self.position = self.desierd_position
  45. self.in_position = True
  46. else:
  47. # move to the goal point at the given speed
  48. direction = difference/distance
  49. self.position = self.position + direction*self.speed/self.rate
  50. def job(self):
  51. self.waypoint_ctrl()
  52. pass