Advertisement
Alekal

Untitled

Dec 13th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.21 KB | None | 0 0
  1. import rospy
  2. from PiBot import PiBot
  3. class Robot:
  4. """
  5. The three primitives robotic paradigm: sense, plan, act [1].
  6. Sense - gather information using the sensors
  7. Plan - create a world model using all the information and plan the next move
  8. Act - carry out the next step of the plan using actuators
  9. [1] https://en.wikipedia.org/wiki/Robotic_paradigm
  10. """
  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.right_speed = 0
  19. self.speed = 14
  20. self.mid = self.robot.get_rear_left_straight_ir()
  21. self.left = self.robot.get_rear_left_side_ir()
  22. self.right = self.robot.get_rear_right_side_ir()
  23. self.left_encoder = self.robot.get_left_wheel_encoder()
  24. self.right_encoder = self.robot.get_right_wheel_encoder()
  25.  
  26. def calculate_real_speed(self):
  27. left_encoder_0 = self.robot.get_left_wheel_encoder()
  28. right_encoder_0 = self.robot.get_right_wheel_encoder()
  29. drive = True
  30. while drive:
  31. left_encoder_new = self.robot.get_left_wheel_encoder()
  32. right_encoder_new = self.robot.get_right_wheel_encoder()
  33. left_error = left_encoder_new - left_encoder_0
  34. right_error = right_encoder_new - right_encoder_0
  35. error = right_error - left_error
  36. left_encoder_0 = self.robot.get_left_wheel_encoder()
  37. right_encoder_0 = self.robot.get_right_wheel_encoder()
  38. self.left_speed = (int(self.speed + round((error / 2) / self.speed)))
  39. self.right_speed = (int(self.speed - round((error / 2) / self.speed)))
  40. return self.left_speed, self.right_speed
  41.  
  42. def sense(self):
  43. self.mid = self.robot.get_rear_left_straight_ir()
  44. self.left = self.robot.get_rear_left_side_ir()
  45. self.right = self.robot.get_rear_right_side_ir()
  46. return (self.mid, self.left,
  47. self.right)
  48.  
  49. def act(self):
  50. print("Acting...")
  51. rospy.sleep(0.5)
  52. while True:
  53. print(self.sense())
  54. print('LEFT DIAGONAL: ' + str(self.robot.get_rear_left_diagonal_ir()))
  55. print('LEFT middle: ' + str(self.mid))
  56. print('RIGHT DIAGONAL: ' + str(self.robot.get_rear_right_diagonal_ir()))
  57. if self.left > 0.9 and self.right > 0.9:
  58. self.problem_solved = True
  59. self.robot.set_wheels_speed(0)
  60. self.main()
  61. if self.mid < 0.05:
  62. self.robot.set_wheels_speed(0)
  63. rospy.sleep(0.2)
  64. print("Should start turning")
  65. print(self.robot.get_front_left_ir())
  66. print(self.robot.get_front_right_ir())
  67. if self.mid == 0.05 and self.robot.get_rear_left_diagonal_ir() == self.robot.get_rear_right_diagonal_ir():
  68. self.calculate_real_speed()
  69. self.robot.set_left_wheel_speed(-self.left_speed)
  70. self.robot.set_right_wheel_speed(-self.right_speed)
  71. if self.robot.get_rear_left_diagonal_ir() != 0.05 or self.robot.get_rear_right_diagonal_ir() != 0.05:
  72. if self.left < self.right:
  73. print('Turn right a little bit')
  74. self.robot.set_left_wheel_speed(-20)
  75. self.robot.set_right_wheel_speed(-self.right_speed)
  76. elif self.left > self.right:
  77. print('Turn left a little bit')
  78. self.robot.set_left_wheel_speed(-self.left_speed)
  79. self.robot.set_right_wheel_speed(-20)
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88. # def turn_left(self):
  89. # left_side = self.robot.get_front_left_ir()
  90. # right_side = self.robot.get_front_right_ir()
  91. # left_enc = self.robot.get_left_wheel_encoder()
  92. # if left_side > right_side:
  93. # print("left turn")
  94. # while self.robot.get_left_wheel_encoder() < left_enc + 505:
  95. # self.robot.set_left_wheel_speed(-15)
  96. # self.robot.set_right_wheel_speed(15)
  97. # print("finished turning")
  98. # self.robot.set_wheels_speed(0)
  99. # rospy.sleep(2)
  100. # self.main()
  101. #
  102. # def turn_right(self):
  103. # left_side = self.robot.get_front_left_ir()
  104. # right_side = self.robot.get_front_right_ir()
  105. # left_enc = self.robot.get_left_wheel_encoder()
  106. # if left_side < right_side:
  107. # print("right turn")
  108. # while self.robot.get_left_wheel_encoder() < left_enc + 505:
  109. # self.robot.set_left_wheel_speed(15)
  110. # self.robot.set_right_wheel_speed(-15)
  111. # print("finished turning")
  112. # self.robot.set_wheels_speed(0)
  113. # rospy.sleep(2)
  114. # self.main()
  115.  
  116. def main(self):
  117. while self.problem_solved is False:
  118. self.sense()
  119. self.act()
  120. rospy.sleep(0.05) # 20 Hz
  121. if self.problem_solved:
  122. print("Solved! Good job, robot!")
  123. exit()
  124. else:
  125. print("Unable to solve! :(")
  126.  
  127.  
  128. if __name__ == "__main__":
  129. robot = Robot()
  130. robot.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement