Robot.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. self.ang = np.random.random()*360
  24. self.desierd_position = self.position
  25. self.in_position = True
  26. self.speed = 0.0
  27. self.rate = self.simulator.rate
  28. self.max_speed = 100.0 # m/s
  29. def waypoint_ctrl(self, speed=None, desierd_pos: np.array = None):
  30. # if got new waypoint, update
  31. if not np.any(desierd_pos == None):
  32. logging.debug(f"{self.name}{self.id} set new desierd position")
  33. self.desierd_position = desierd_pos
  34. if speed is None:
  35. logging.debug(f"{self.name}_{self.id} set to max speed")
  36. self.speed = self.max_speed
  37. else:
  38. if speed > self.max_speed:
  39. logging.warning("Given speed is over maximum")
  40. self.speed = speed
  41. if np.any(self.position != self.desierd_position):
  42. logging.debug(
  43. f"{self.name}_{self.id} moving to {self.desierd_position}")
  44. self.in_position = False
  45. one_time_step_length = self.speed/self.rate
  46. difference = self.desierd_position - self.position
  47. distance = np.linalg.norm(difference)
  48. # if it's close enough to the goal position, make it in position
  49. if distance <= one_time_step_length:
  50. self.position = self.desierd_position
  51. self.in_position = True
  52. else:
  53. # move to the goal point at the given speed
  54. direction = difference/distance
  55. self.position = self.position + direction*self.speed/self.rate
  56. # print("MOVED")
  57. return self.in_position
  58. def job(self):
  59. self.waypoint_ctrl()
  60. pass