Advertisement
Alekal

Untitled

Dec 17th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.80 KB | None | 0 0
  1. import rospy
  2. from PiBot import PiBot
  3.  
  4. class Robot:
  5. """
  6. The three primitives robotic paradigm: sense, plan, act [1].
  7. Sense - gather information using the sensors
  8. Plan - create a world model using all the information and plan the next move
  9. Act - carry out the next step of the plan using actuators
  10. [1] https://en.wikipedia.org/wiki/Robotic_paradigm
  11. """
  12. def __init__(self):
  13. print("Initializing...")
  14. self.robot = PiBot()
  15. self.start_timestamp = rospy.get_time()
  16. self.problem_solved = False
  17. self.left_speed = 0
  18. self.scan_speed = 14
  19. self.right_speed = 0
  20. self.speed = 14
  21. self.mid = self.robot.get_front_middle_ir()
  22.  
  23. def calculate_real_speed(self):
  24. left_encoder_0 = self.robot.get_left_wheel_encoder()
  25. right_encoder_0 = self.robot.get_right_wheel_encoder()
  26. drive = True
  27. while drive:
  28. left_encoder_new = self.robot.get_left_wheel_encoder()
  29. right_encoder_new = self.robot.get_right_wheel_encoder()
  30. left_error = left_encoder_new - left_encoder_0
  31. right_error = right_encoder_new - right_encoder_0
  32. error = right_error - left_error
  33. left_encoder_0 = self.robot.get_left_wheel_encoder()
  34. right_encoder_0 = self.robot.get_right_wheel_encoder()
  35. self.left_speed = (int(self.speed + round((error / 2) / self.speed)))
  36. self.right_speed = (int(self.speed - round((error / 2) / self.speed)))
  37. return self.left_speed, self.right_speed
  38.  
  39. def buffer(self, speed, turn): # scans for object, returns dict of left coder and seen distance
  40. count = 1
  41. results = {}
  42. buffer = []
  43. last_ok_value = 0
  44. turning = True
  45. print(turn)
  46. left_encoder_before_looking = self.robot.get_left_wheel_encoder()
  47. right_encoder_before_looking = self.robot.get_right_wheel_encoder()
  48. # print(left_encoder_before_looking)
  49. # print(right_encoder_before_looking)
  50. rospy.sleep(1)
  51. while turning is True:
  52. # print('left: ' + str(self.robot.get_left_wheel_encoder()))
  53. # print(left_encoder_before_looking + turn)
  54. # print(right_encoder_before_looking + turn)
  55. print(self.robot.get_right_wheel_encoder())
  56. print(self.robot.get_left_wheel_encoder())
  57. self.robot.set_left_wheel_speed(speed)
  58. self.robot.set_right_wheel_speed(-speed)
  59. encoder = self.robot.get_left_wheel_encoder()
  60. distance = self.robot.get_front_middle_ir()
  61. if count == 1:
  62. buffer = [distance] * 20
  63. last_ok_value = distance
  64. count += 1
  65. buffer = buffer[1:]
  66. buffer.append(distance)
  67. # print(buffer)
  68. if 0.4 < distance > 0.15:
  69. if (abs(distance - round(sum(buffer) / len(buffer), 3))) <= 0.4:
  70. results[encoder] = distance
  71. elif distance == 0.15:
  72. pass
  73. if self.robot.get_left_wheel_encoder() == turn + left_encoder_before_looking:
  74. turning = False
  75. # last_ok_value = distance
  76. # else:
  77. # results[encoder] = last_ok_value
  78. self.robot.set_wheels_speed(0)
  79. print(results)
  80. rospy.sleep(2)
  81. return results
  82.  
  83. def find_object(self, dict):
  84. a = min(dict, key=lambda x: dict.get(x))
  85. before_looking = self.robot.get_left_wheel_encoder()
  86. new_value = (a + before_looking)
  87. print(a)
  88. print('new: ' + str(new_value))
  89. rospy.sleep(2)
  90. turning1 = True
  91. while turning1 is True:
  92. self.robot.get_front_middle_ir()
  93. self.robot.get_left_wheel_encoder()
  94. self.robot.set_right_wheel_speed(-14)
  95. self.robot.set_left_wheel_speed(14)
  96. # print(self.robot.get_front_middle_ir())
  97. print('right: ' + str(self.robot.get_right_wheel_encoder()))
  98. print('left: ' + str(self.robot.get_left_wheel_encoder()))
  99. if self.robot.get_left_wheel_encoder() >= new_value:
  100. turning1 = False
  101. self.robot.set_wheels_speed(0)
  102. rospy.sleep(1)
  103.  
  104. def sense(self):
  105. self.mid = self.robot.get_front_middle_ir()
  106. return self.mid
  107.  
  108. def scan(self, scan_speed): # full 360 deg scan
  109. # print("Scanning...")
  110. # print("*bass-boosted ♫ Deja Vu♫ plays in the background*")
  111. return self.buffer(scan_speed, 2016)
  112.  
  113.  
  114. def main(self):
  115. self.sense()
  116. dict = self.scan(scan_speed=14)
  117. self.find_object(dict)
  118. rospy.sleep(0.05) # 20 Hz
  119.  
  120.  
  121. if __name__ == "__main__":
  122. robot = Robot()
  123. robot.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement