Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import rospy
- from PiBot import PiBot
- class Robot:
- """
- The three primitives robotic paradigm: sense, plan, act [1].
- Sense - gather information using the sensors
- Plan - create a world model using all the information and plan the next move
- Act - carry out the next step of the plan using actuators
- [1] https://en.wikipedia.org/wiki/Robotic_paradigm
- """
- def __init__(self):
- print("Initializing...")
- self.robot = PiBot()
- self.start_timestamp = rospy.get_time()
- self.problem_solved = False
- self.left_speed = 0
- self.right_speed = 0
- self.speed = 14
- self.mid = self.robot.get_rear_left_straight_ir()
- self.left = self.robot.get_rear_left_side_ir()
- self.right = self.robot.get_rear_right_side_ir()
- self.left_encoder = self.robot.get_left_wheel_encoder()
- self.right_encoder = self.robot.get_right_wheel_encoder()
- self.drive = True
- self.robot.set_grabber_height(100)
- self.robot.close_grabber(100)
- def calculate_real_speed(self):
- left_encoder_0 = self.robot.get_left_wheel_encoder()
- right_encoder_0 = self.robot.get_right_wheel_encoder()
- drive = True
- while drive:
- left_encoder_new = self.robot.get_left_wheel_encoder()
- right_encoder_new = self.robot.get_right_wheel_encoder()
- left_error = left_encoder_new - left_encoder_0
- right_error = right_encoder_new - right_encoder_0
- error = right_error - left_error
- left_encoder_0 = self.robot.get_left_wheel_encoder()
- right_encoder_0 = self.robot.get_right_wheel_encoder()
- self.left_speed = (int(self.speed + round((error / 2) / self.speed)))
- self.right_speed = (int(self.speed - round((error / 2) / self.speed)))
- return self.left_speed, self.right_speed
- def sense(self):
- self.mid = self.robot.get_rear_left_straight_ir()
- self.left = self.robot.get_rear_left_side_ir()
- self.right = self.robot.get_rear_right_side_ir()
- return (self.mid, self.left,
- self.right)
- def act(self):
- """Roboyt act."""
- print("Acting...")
- rospy.sleep(0.3)
- while self.drive is True:
- print(self.sense())
- print('LEFT DIAGONAL: ' + str(self.robot.get_rear_left_diagonal_ir()))
- print('LEFT middle: ' + str(self.mid))
- print('RIGHT DIAGONAL: ' + str(self.robot.get_rear_right_diagonal_ir()))
- # if self.left > 0.9 and self.right > 0.9:
- # self.problem_solved = True
- # self.robot.set_wheels_speed(0)
- # self.main()
- # if self.mid < 0.05:
- # self.robot.set_wheels_speed(20)
- # print("Should start turning")
- # rospy.sleep(0.5)
- # self.robot.set_wheels_speed(0)
- # self.drive = False
- if self.right < 0.06 and self.mid < 0.05:
- self.robot.set_wheels_speed(12)
- rospy.sleep(0.5)
- self.robot.set_right_wheel_speed(12)
- self.robot.set_left_wheel_speed(20)
- rospy.sleep(0.5)
- if self.mid == 0.05 and self.robot.get_rear_left_diagonal_ir() == self.robot.get_rear_right_diagonal_ir():
- self.calculate_real_speed()
- self.robot.set_left_wheel_speed(-self.left_speed)
- self.robot.set_right_wheel_speed(-self.right_speed)
- if self.robot.get_rear_left_diagonal_ir() != self.robot.get_rear_right_diagonal_ir():
- if self.left < self.right:
- print('Turn right a little bit')
- self.robot.set_left_wheel_speed(-20)
- self.robot.set_right_wheel_speed(-self.right_speed)
- elif self.left > self.right:
- print('Turn left a little bit')
- self.robot.set_left_wheel_speed(-self.left_speed)
- self.robot.set_right_wheel_speed(-20)
- rospy.sleep(0.05)
- def turn_right(self):
- print("here")
- atm_enc = abs(self.robot.get_left_wheel_encoder())
- while abs(self.robot.get_left_wheel_encoder()) > atm_enc + 505:
- print('LEFT DIAGONAL: ' + str(self.robot.get_rear_left_diagonal_ir()))
- print('LEFT middle: ' + str(self.mid))
- print('RIGHT DIAGONAL: ' + str(self.robot.get_rear_right_diagonal_ir()))
- print('Turn right')
- self.robot.set_left_wheel_speed(-self.left_speed)
- self.robot.set_right_wheel_speed(-self.right_speed)
- rospy.sleep(0.05)
- self.robot.set_right_wheel_speed(12)
- self.robot.set_left_wheel_speed(20)
- rospy.sleep(0.05)
- self.drive = True
- def main(self):
- while self.problem_solved is False:
- # self.turn_right()
- self.sense()
- self.act()
- rospy.sleep(0.05)
- if self.problem_solved:
- print("Solved! Good job, robot!")
- exit()
- else:
- print("Unable to solve! :(")
- if __name__ == "__main__":
- robot = Robot()
- robot.main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement